在 Three.js 中,灯光是构建逼真 3D 场景的关键元素之一。通过合理使用灯光,可以增强物体的质感、立体感和场景的整体氛围。本文将详细介绍 Three.js 的灯光系统,包括常见的灯光类型、使用方法以及如何通过灯光打造丰富的视觉效果。
Three.js 提供了多种灯光类型,每种类型都有其独特的用途和特性。以下是常见的灯光类型及其特点
灯光类型 | 特点 |
---|---|
AmbientLight |
环境光,均匀照亮场景中的所有物体,无方向性,不产生阴影。 |
DirectionalLight |
平行光,光线平行且方向一致,适合模拟太阳光或远处光源,可产生阴影。 |
PointLight |
点光源,从一点向四周扩散,强度随距离衰减,适合模拟灯泡或局部光源。 |
SpotLight |
聚光灯,从一点向特定方向发射锥形光束,适合模拟手电筒或舞台灯光,可产生阴影。 |
HemisphereLight |
半球光,模拟天空和地面的光照效果,适合创建自然环境光照。 |
RectAreaLight |
矩形区域光,从平面发射光线,适合模拟窗户或灯箱的光线。 |
环境光是最基础的光源,它没有方向性,也不会产生阴影。它主要用于提供全局光照,确保场景中没有完全黑暗的区域。
构造函数:
new THREE.AmbientLight(color, intensity);
属性:
示例:
const ambientLight = new THREE.AmbientLight(0x404040, 0.5); // 灰色环境光,强度为0.5
scene.add(ambientLight);
平行光模拟太阳光,光线平行且方向一致,适合大范围的均匀光照。它还可以产生阴影。
构造函数:
new THREE.DirectionalLight(color, intensity);
属性:
阴影:
示例:
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 10, 7); // 设置光源位置
directionalLight.castShadow = true; // 启用阴影
scene.add(directionalLight);
点光源从一点向四周扩散,强度随距离衰减,适合模拟灯泡或局部光源。
构造函数:
new THREE.PointLight(color, intensity, distance, decay);
属性:
阴影:
示例:
const pointLight = new THREE.PointLight(0xff0000, 1, 10); // 红色点光源,强度为1,最大距离为10
pointLight.position.set(2, 3, 1);
scene.add(pointLight);
聚光灯从一点向特定方向发射锥形光束,适合模拟手电筒或舞台灯光。
构造函数:
new THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);
属性:
阴影:
示例:
const spotLight = new THREE.SpotLight(0x00ff00, 1);
spotLight.position.set(0, 5, 0);
spotLight.angle = Math.PI / 6; // 光束角度
spotLight.penumbra = 0.5; // 柔边效果
scene.add(spotLight);
半球光模拟天空和地面的光照效果,适合创建自然环境光照。
构造函数:
new THREE.HemisphereLight(skyColor, groundColor, intensity);
属性:
示例:
const hemiLight = new THREE.HemisphereLight(0x87CEEB, 0xFFFFFF, 0.6); // 天空蓝和白色光
scene.add(hemiLight);
矩形区域光从平面发射光线,适合模拟窗户或灯箱的光线。需使用 MeshStandardMaterial 或 MeshPhysicalMaterial。
构造函数:
new THREE.RectAreaLight(color, intensity, width, height);
属性:
注意: 需引入 RectAreaLightUniformsLib(Three.js r113+)。
示例:
const rectAreaLight = new THREE.RectAreaLight(0xffffff, 1, 10, 10); // 白色光,强度为1,宽度和高度为10
rectAreaLight.position.set(0, 10, 0);
scene.add(rectAreaLight);
阴影是增强场景真实感的重要元素。在 Three.js 中,只有部分灯光类型(如 DirectionalLight
和 SpotLight
)支持阴影。
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 柔和阴影
directionalLight.castShadow = true;
directionalLight.shadow.mapSize.width = 2048; // 提高分辨率
mesh.castShadow = true;
plane.receiveShadow = true;
light.shadow.mapSize.set(512,512)
。distance
和decay
避免无效计算。1:灯光创建后为何不生效?
MeshBasicMaterial
不响应光照)2:阴影显示异常?
shadow.camera.near/far
范围castShadow/receiveShadow
3:如何实现柔和的光照过渡?
intensity
和position
更多three.js、cesium.js开源案例,请移至gitee.com/giser2017/t…