1. Three.js 光照模型理解

光照模型的核心是计算物体表面上每个点的颜色(即最终呈现在屏幕上的像素颜色)。这个过程结合了物体材质属性(颜色、反光度、粗糙度等)和场景中的光照信息。Three.js 的实现遵循了经典的计算机图形学光照模型。

我们可以从三个层面来理解:

1.1. 核心理论:Phong 光照模型(及其变种)

Three.js 的光照系统主要基于经典的 Phong 光照模型(或更现代的 Blinn-Phong 变种)。它将最终的光照效果分解为几个独立分量的叠加:

最终Phong模型颜色(简化版)

text

颜色 = 环境项 +
       漫反射项 * 材质漫反射色 * 光漫反射色 +
       高光项 * 材质高光色 * 光高光色

1.2. 2. Three.js 中的光照类型(光源)

Three.js 提供了多种光源,它们定义了光线在空间中的分布方式,并为上述模型提供参数(如光的颜色、方向、位置)。
光照类型.png

1.3. Three.js 中的材质(决定如何响应光)

材质定义了表面对光照的“反应规则”。不同材质使用不同复杂度的着色器来实现光照模型。
材质.png

1.4. 关键要点与工作流程

  1. 选择材质

  2. 组合光源

  3. 性能考量

  4. 阴影

1.5. 简单代码示例

javascript

// 1. 创建场景、相机、渲染器(略)

// 2. 创建PBR材质
const material = new THREE.MeshStandardMaterial({
    color: 0xffffff,
    roughness: 0.5, // 粗糙度 (0: 非常光滑, 1: 非常粗糙)
    metalness: 0.8 // 金属度 (0: 非金属如塑料, 1: 金属如铜铁)
});

// 3. 创建几何体并应用材质
const sphere = new THREE.Mesh(new THREE.SphereGeometry(1, 32, 32), material);
scene.add(sphere);

// 4. 添加组合光源
// 主方向光(模拟太阳)
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 5, 5);
scene.add(directionalLight);

// 柔和的天空环境光
const hemisphereLight = new THREE.HemisphereLight(0x87ceeb, 0x8b4513, 0.3);
scene.add(hemisphereLight);

// 一个补光的点光源
const pointLight = new THREE.PointLight(0xffaa33, 0.5, 10);
pointLight.position.set(-3, 2, 1);
scene.add(pointLight);

1.6. 总结

理解 Three.js 光照模型的关键在于: