💡 前言
如果你想在网页上做出炫酷的 3D 效果、数据可视化或者元宇宙场景,Three.js 一定是你绕不开的库。
它是 WebGL 的“语法糖”,让你能用 JavaScript 快速构建 3D 世界,而不用直接操作底层 API。
这篇文章会带你从零开始——
👉 快速启动一个 Three.js 项目
👉 掌握一些实用开发技巧
👉 学会优化性能,避免踩坑
👉 最后附上开源项目和官方学习资料,助你少走弯路。
🧱 一、项目快速启动模板(实战入门)
🔹 1. 创建项目结构
你可以用 Vite + Three.js 快速搭建现代开发环境:
Bash
npm create vite@latest threejs-demo -- --template vanilla
cd threejs-demo
npm install three
npm run dev
目录结构建议:
threejs-demo/
├── src/
│ ├── main.js
│ ├── scene/
│ │ ├── index.js
│ │ ├── camera.js
│ │ ├── renderer.js
│ │ └── controls.js
│ └── assets/
│ └── textures/
└── index.html
🔹 2. 初始化基本场景
src/main.js:
JavaScript
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// 场景
const scene = new THREE.Scene();
// 相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 1, 5);
// 渲染器
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 简单立方体
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshStandardMaterial({ color: 0x00aaff });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5, 5, 5);
scene.add(light);
// 动画循环
function animate() {
requestAnimationFrame(animate);
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
// 自适应窗口
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
✅ 启动后访问本地地址,就能看到旋转立方体啦!
🧭 二、开发技巧与经验总结
🔸 1. 模块化结构清晰化
不要把所有逻辑写在 main.js,可以分模块管理:
scene/index.js:统一管理场景对象;camera.js:配置相机;renderer.js:设置渲染器;controls.js:封装 OrbitControls;models/:加载 GLTF、FBX 模型。
🔸 2. 使用辅助调试工具
Three.js 内置 AxesHelper、GridHelper,还有好用的调试库:
JavaScript
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
const gui = new GUI();
gui.add(cube.rotation, 'y', 0, Math.PI * 2);
🔸 3. 使用 three-inspect 或 stats.js 查看性能
JavaScript
import Stats from 'three/examples/jsm/libs/stats.module.js';
const stats = new Stats();
document.body.appendChild(stats.dom);
function animate() {
stats.update();
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
⚙️ 三、性能优化实战技巧
Three.js 性能优化主要分为 渲染层 和 资源层 两方面。
✅ 渲染层优化
- 控制渲染频率
- 不必每帧都渲染,可结合
requestAnimationFrame判断状态变化;
- 不必每帧都渲染,可结合
- 视锥体裁剪(Frustum Culling)
- Three.js 默认支持,但模型多时需手动优化;
- 合并几何体
BufferGeometryUtils.mergeBufferGeometries()减少 draw call;
- 降低阴影开销
- 只在关键物体上开启阴影,调整
shadow.mapSize;
- 只在关键物体上开启阴影,调整
- 使用
InstancedMesh渲染重复物体。
✅ 资源层优化
- 压缩纹理(basis、ktx2)
- 使用 glTF 格式模型(支持 PBR 材质与压缩)
- 异步加载模型,使用 LoadingManager
- LazyLoad 模型与贴图:按需加载,提升首屏速度。
🧨 四、常见错误与坑点解决方案
| 错误/问题 | 原因分析 | 解决方案 |
|---|---|---|
| “WebGL not supported” | 浏览器/显卡不支持 WebGL | 使用 WebGL.isWebGLAvailable() 检查环境 |
| 模型导入后位置不对 | 模型原始坐标或比例问题 | 使用 model.position.set() 或 model.scale.set() 调整 |
| 材质不显示贴图 | 路径或跨域问题 | 确保贴图路径正确、启用本地服务器 |
| 场景变卡顿 | draw call 过多 / 贴图太大 | 使用 InstancedMesh / 压缩纹理 |
| 模型黑暗或曝光 | 光照不当或材质设置错误 | 调整环境光 / PBR 材质曝光度 |
🌈 五、精选开源项目推荐
| 项目名 | 简介 / 特色 | GitHub 链接 | 适合人群 / 学习方向 |
|---|---|---|---|
| pmndrs/react-three-fiber | Three.js 的 React 封装,支持声明式 3D 场景构建,生态庞大(配合 Drei / Leva / R3F ecosystem 使用) | github.com/pmndrs/react-three-fiber | 前端开发者入门 3D 可视化的首选,组件化思维、代码结构清晰 |
| threlte/threlte | 基于 Svelte 的 Three.js 框架,语法简洁、性能优秀,支持交互和动画绑定 | github.com/threlte/threlte | 想探索 Svelte + Three.js 的现代组合,快速搭建交互式 3D 页面 |
| pmndrs/drei | 为 React Three Fiber 提供常用 3D 组件(轨道控制、环境光、GLTF Loader、文本等) | github.com/pmndrs/drei | 新手快速实现复杂场景的“加速器”,也是中级开发者的调优利器 |
| yomotsu/camera-controls | 高性能摄像机控制库,替代 OrbitControls,支持平滑过渡与惯性 | github.com/yomotsu/camera-controls | 想做交互性较强的 3D 页面(如可旋转模型、产品展示)的开发者 |
| mrdoob/three.js | Three.js 官方仓库,拥有完整示例和文档,社区极其活跃 | github.com/mrdoob/three.js | 任何阶段都推荐直接阅读源码和 examples,是学习与改造的根基 |
📚 六、官方资料与学习路线
- 官方网站:https://threejs.org
- 官方文档:https://threejs.org/docs/
- 官方示例库:https://threejs.org/examples/
- Three.js Journey 实战教程(强烈推荐):https://threejs-journey.com
- 中文社区教程:https://threejs.org.cn
🧭 七、总结
通过这篇文章,你应该已经掌握:
- 如何快速启动 Three.js 项目;
- 如何拆分模块、调试和优化性能;
- 常见问题的定位与修复;
- 以及一批高质量的开源学习资源。
🚀 建议下一步:
试着自己实现一个简单的“3D 数据可视化地球”或“交互式模型展示”,
一边踩坑,一边积累经验,你就会真正理解 Three.js 的魅力所在。
文章评论