Three.js入门教程:从零开始创建3D网页场景
前言
在当今互联网时代,3D可视化技术正在以前所未有的速度发展。从电商平台的产品展示到数据可视化大屏,从在线教育到虚拟现实,3D技术的应用场景越来越广泛。作为前端开发者,掌握3D网页开发技能已经成为提升竞争力的重要途径。Three.js作为最流行的WebGL库,为我们打开了在浏览器中创建惊艳3D效果的大门。
什么是Three.js?
Three.js是一个基于WebGL的JavaScript 3D库,它封装了WebGL的底层API,让开发者能够用更简单的方式创建3D场景。WebGL虽然功能强大,但学习曲线陡峭,开发复杂。Three.js通过提供直观的API和丰富的功能,大大降低了3D网页开发的难度。
Three.js的核心优势
- 易于学习:相比直接使用WebGL,Three.js的API更加友好
- 功能丰富:内置几何体、材质、光源、相机等完整3D要素
- 跨平台:基于Web标准,支持所有现代浏览器
- 活跃社区:拥有庞大的开发者社区和丰富的资源
- 持续更新:项目维护积极,不断引入新特性
环境搭建
在开始Three.js之旅前,我们需要搭建基础的开发环境。
基础HTML结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Three.js入门教程</title>
<style>
body {
margin: 0;
overflow: hidden;
}
canvas {
display: block;
}
</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script src="./app.js"></script>
</body>
</html>
引入Three.js的方式
方式一:CDN引入
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
方式二:NPM安装
npm install three
import * as THREE from 'three';
Three.js核心概念
要理解Three.js,首先需要掌握其核心概念,这些概念构成了3D场景的基础。
场景(Scene)
场景是3D对象的容器,所有要渲染的物体、光源等都需要添加到场景中。
const scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff); // 设置背景色
相机(Camera)
相机定义了观察场景的视角。Three.js提供了多种相机类型,最常用的是透视相机。
// 透视相机参数:视野角度、宽高比、近裁剪面、远裁剪面
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
camera.position.z = 5; // 设置相机位置
渲染器(Renderer)
渲染器负责将场景和相机的内容渲染到HTML canvas元素中。
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
document.body.appendChild(renderer.domElement);
几何体(Geometry)
几何体定义了3D物体的形状。Three.js提供了多种内置几何体。
// 创建立方体几何体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建球体几何体
const sphereGeometry = new THREE.SphereGeometry(1, 32, 32);
// 创建平面几何体
const planeGeometry = new THREE.PlaneGeometry(5, 5, 10, 10);
材质(Material)
材质定义了物体的外观特性,如颜色、纹理、透明度等。
// 基础网格材质
const material = new THREE.MeshBasicMaterial({
color: 0x00ff00,
wireframe: false
});
// 标准网格材质(支持光照)
const standardMaterial = new THREE.MeshStandardMaterial({
color: 0xff0000,
roughness: 0.5,
metalness: 0.5
});
网格(Mesh)
网格是几何体和材质的结合,构成了实际可见的3D物体。
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
创建第一个3D场景
现在让我们将这些概念组合起来,创建第一个完整的3D场景。
完整示例代码
// 初始化场景
const scene = new THREE.Scene();
scene.background = new THREE.Color(0xf0f0f0);
// 初始化相机
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);
renderer.setPixelRatio(window.devicePixelRatio);
document.body.appendChild(renderer.domElement);
// 创建立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 添加光源
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
directionalLight.position.set(5, 5, 5);
scene.add(directionalLight);
// 动画循环
function animate() {
requestAnimationFrame(animate);
// 旋转立方体
cube.rotation.x += 0.01;
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);
});
深入理解Three.js组件
光源系统
光源是创建真实感3D场景的关键。Three.js提供了多种光源类型:
环境光(AmbientLight)
const ambientLight = new THREE.AmbientLight(0x404040, 0.5);
scene.add(ambientLight);
方向光(DirectionalLight)
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(0, 10, 0);
directionalLight.castShadow = true;
scene.add(directionalLight);
点光源(PointLight)
const pointLight = new THREE.PointLight(0xffffff, 1, 100);
pointLight.position.set(10, 10, 10);
scene.add(pointLight);
聚光灯(SpotLight)
const spotLight = new THREE.SpotLight(0xffffff, 1);
spotLight.position.set(0, 10, 0);
spotLight.angle = Math.PI / 6;
spotLight.penumbra = 0.1;
spotLight.decay = 2;
spotLight.distance = 200;
scene.add(spotLight);
材质详解
Three.js提供了丰富的材质类型,每种材质都有其特定的用途和效果。
MeshBasicMaterial
- 基础材质,不受光照影响
- 性能最好,适合不需要光照的物体
MeshLambertMaterial
- 朗伯材质,对光照有反应
- 性能较好,适合静态物体
MeshPhongMaterial
- 冯氏材质,支持高光反射
- 效果更好,性能稍差
MeshStandardMaterial
- 基于物理的渲染材质
- 现代3D应用的首选
// 标准材质示例
const standardMaterial = new THREE.MeshStandardMaterial({
color: 0x3498db,
roughness: 0.4, // 粗糙度 0-1
metalness: 0.8, // 金属度 0-1
normalScale: new THREE.Vector2(1, 1)
});
几何体进阶
除了基础几何体,Three.js还支持创建复杂几何体。
自定义几何体
const customGeometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
-1.0, -1.0, 1.0,
1.0, -1.0, 1.0,
1.0, 1.0, 1.0,
1.0, 1.0, 1.0,
-1.0, 1.0, 1.0,
-1.0, -1.0, 1.0
]);
customGeometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3

评论框