别再硬啃原生WebGL了!用Three.js 10分钟搞定一个旋转3D立方体(附完整代码) 从零到3D用Three.js十分钟实现旋转立方体的艺术1. 为什么选择Three.js而非原生WebGL当我第一次接触WebGL时被那些晦涩难懂的着色器代码和复杂的缓冲区操作吓退了。相信很多前端开发者都有类似的经历——我们只是想快速实现一个酷炫的3D效果却不得不面对底层API的复杂性。这正是Three.js存在的意义。原生WebGL就像是一台需要手动组装的汽车你必须了解每个零件的功能和组装方式。而Three.js则是一辆已经组装好的跑车你只需要学会驾驶它。让我们看一个简单的对比原生WebGL绘制三角形需要编写顶点着色器和片元着色器创建和绑定缓冲区设置顶点属性指针编译和链接着色器程序处理矩阵变换Three.js实现旋转立方体只需要创建场景、相机和渲染器添加几何体和材质设置动画循环// Three.js核心代码示例 const scene new THREE.Scene(); const camera new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const geometry new THREE.BoxGeometry(); const material new THREE.MeshBasicMaterial({ color: 0x00ff00 }); const cube new THREE.Mesh(geometry, material); scene.add(cube); camera.position.z 5; function animate() { requestAnimationFrame(animate); cube.rotation.x 0.01; cube.rotation.y 0.01; renderer.render(scene, camera); } animate();提示Three.js的API设计遵循约定优于配置原则大多数情况下你只需要关注核心概念而不必纠结于底层实现细节。2. 十分钟快速入门搭建你的第一个3D场景2.1 环境准备开始之前我们需要准备好Three.js的运行环境。有三种主要方式引入Three.jsCDN引入最简单快捷script srchttps://cdn.jsdelivr.net/npm/three0.132.2/build/three.min.js/scriptnpm安装适合现代前端项目npm install three下载本地文件适合离线开发 可以从 Three.js官网 下载最新版本2.2 核心概念解析Three.js的核心架构围绕几个基本概念构建概念作用类比场景(Scene)3D对象的容器摄影棚相机(Camera)定义视图视角摄像机渲染器(Renderer)将3D场景渲染到2D屏幕摄影师网格(Mesh)几何体材质的组合演员几何体(Geometry)物体的形状骨架材质(Material)物体的外观皮肤2.3 完整实现步骤让我们一步步实现旋转立方体创建HTML骨架!DOCTYPE html html head meta charsetutf-8 titleMy First Three.js App/title style body { margin: 0; } canvas { display: block; } /style /head body script srchttps://cdn.jsdelivr.net/npm/three0.132.2/build/three.min.js/script script srcapp.js/script /body /html编写JavaScript(app.js)// 初始化场景 const scene new THREE.Scene(); scene.background new THREE.Color(0xffffff); // 设置相机 const camera new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); camera.position.z 5; // 创建渲染器 const renderer new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 添加立方体 const geometry new THREE.BoxGeometry(1, 1, 1); const material new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: false }); const cube new THREE.Mesh(geometry, material); scene.add(cube); // 处理窗口大小变化 window.addEventListener(resize, () { camera.aspect window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }); // 动画循环 function animate() { requestAnimationFrame(animate); cube.rotation.x 0.005; cube.rotation.y 0.01; renderer.render(scene, camera); } animate();3. 进阶技巧让你的立方体更专业3.1 添加真实感材质基础的MeshBasicMaterial不受光照影响我们可以使用更高级的材质const material new THREE.MeshStandardMaterial({ color: 0x00ff00, roughness: 0.5, metalness: 0.5 }); // 添加光源 const light new THREE.DirectionalLight(0xffffff, 1); light.position.set(1, 1, 1); scene.add(light);3.2 性能优化技巧重用几何体和材质相同类型的物体应共享几何体和材质使用BufferGeometry比普通Geometry性能更好合理控制帧率非必要场景可以降低渲染频率// 性能更好的BufferGeometry示例 const geometry new THREE.BufferGeometry(); const vertices new Float32Array([ -1, -1, 1, // v0 1, -1, 1, // v1 1, 1, 1, // v2 -1, 1, 1 // v3 ]); geometry.setAttribute(position, new THREE.BufferAttribute(vertices, 3));3.3 调试工具Three.js提供了方便的调试工具——three.js/examples/jsm/libs/dat.gui.module.js可以实时调整参数import { GUI } from https://cdn.jsdelivr.net/npm/three0.132.2/examples/jsm/libs/dat.gui.module.js; const gui new GUI(); const cubeFolder gui.addFolder(Cube); cubeFolder.add(cube.rotation, x, 0, Math.PI * 2); cubeFolder.add(cube.rotation, y, 0, Math.PI * 2); cubeFolder.add(cube.rotation, z, 0, Math.PI * 2); cubeFolder.open();4. 从立方体到真实项目Three.js的无限可能掌握了基础立方体后Three.js还能实现3D产品展示电商网站的360°产品查看数据可视化3D图表和地理信息展示游戏开发简单的浏览器3D游戏VR/AR体验配合WebXR实现虚拟现实推荐学习路径掌握基础几何体立方体、球体、圆柱体等学习加载外部3D模型GLTF/OBJ格式了解纹理和高级材质探索动画系统学习着色器编程注意虽然Three.js简化了3D开发但计算机图形学基础知识如坐标系、矩阵变换仍然重要。建议在掌握基础后补充相关知识。在实际项目中我发现Three.js最强大的地方在于其丰富的示例库。官方提供了数百个可以直接运行的示例覆盖了从基础到高级的各个领域。遇到问题时这些示例往往能提供最佳实践参考。