Three.js 适配的“保姆级”教程,拒绝拉伸和模糊!
2026年2月2日 23:44
第一步:CSS 铺满全屏 首先,我们要让 Canvas 元素本身在网页里占满位置。这步最简单,但是很关键,很多人容易漏掉 display: block。 默认情况下,Canvas 是 inline 元
在 Three.js 的世界里,想要画面动起来,你只需要凑齐这“四大金刚”:
想象你是一个导演,首先你得有个场地。在 Three.js 里,Scene 就是这个场地。它是一个容器,用来放置所有的物体、灯光和摄像机。
const scene = new THREE.Scene(); //(这就开辟了一个场地)
片场有了,观众怎么看?得架摄像机。 Three.js 里最常用的是 透视摄像机 (PerspectiveCamera)。 这就好比人的眼睛,近大远小。
场景布置好了,摄像机架好了,谁把画面画到屏幕(Canvas)上?这就是渲染器的工作。它负责计算每一帧画面,把 3D 的数据“拍扁”成 2D 的像素点显示在网页上。
这是最关键的部分!片场不能是空的,得有东西。在 Three.js 里,一个可见的物体通常被称为 Mesh (网格)。 一个 Mesh 由两部分组成(缺一不可):
BoxGeometry 就是个立方体骨架)。MeshPhongMaterial 就是一种这就好比给骨架穿上了皮肤)。别眨眼,核心代码真的少得离谱。我们来把上面的概念串起来:
// 1. 创建场景
const scene = new THREE.Scene();
// 2. 创建摄像机 (视角75度, 宽高比, 近距0.1, 远距1000)
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
// 把摄像机往后拉一点,不然就在物体肚子里了
camera.position.z = 5;
// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
// 把渲染出来的 canvas 塞到页面里
document.body.appendChild(renderer.domElement);
// 1. 骨架:一个 1x1x1 的立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 2. 皮肤:绿色的,对光照有反应的材质
const material = new THREE.MeshPhongMaterial({ color: 0x44aa88 });
// 3. 合体:创建网格
const cube = new THREE.Mesh(geometry, material);
// 4. 放到场景里!
scene.add(cube);
如果你用的是 MeshPhongMaterial 这种高级材质,没有光就是漆黑一片。
// 创建一个平行光(类似太阳光)
const light = new THREE.DirectionalLight(0xFFFFFF, 1);
light.position.set(-1, 2, 4);
scene.add(light);
电影是每秒 24 帧的静态图,Three.js 也一样。我们需要一个循环,不停地让渲染器“拍照”。
function animate() {
requestAnimationFrame(animate); // 浏览器下次重绘前调用我
// 让立方体动起来
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
// 咔嚓!渲染一帧
renderer.render(scene, camera);
}
animate(); // 开始循环
📂 核心代码与完整示例: my-three-app
如果你喜欢本教程,记得点赞+收藏!关注我获取更多Three.js开发干货