Three.js光照技術詳解:為3D場景注入靈魂

  • 一、Three.js光照簡介
  • 二、Three.js基礎光照類型
  • 1. 環境光(AmbientLight)
  • 2. 點光源(PointLight)
  • 3. 平行光(DirectionalLight)
  • 4. 聚光燈(SpotLight)
  • 5. 區域光(RectAreaLight)
  • 三、Three.js進階光照技巧
  • 1. 光照貼圖(Light Mapping)
  • 2. 間接光照(Indirect Lighting)
  • 3. 陰影效果(Shadow)
  • 四、Three.js光照實戰案例
  • 案例:創建一個帶有環境光和平行光的3D場景
  • 1. 場景初始化
  • 2. 添加物體
  • 3. 添加光照
  • 4. 設置相機位置
  • 5. 渲染循環
  • 五、總結與展望

在3D圖形開發中,光照是賦予場景真實感和視覺吸引力的核心技術之一。Three.js作為一款流行的JavaScript 3D圖形庫,提供了豐富的光照類型和靈活的配置選項,能夠幫助開發者輕鬆實現複雜的光影效果。本文將深入探討Three.js中的光照技術,包括基礎光照類型、進階技巧以及實際應用案例。


一、Three.js光照簡介

Three.js中的光照模型主要用於模擬真實世界中的光源,通過計算物體表面的顏色變化來實現光影效果。光照不僅能夠增強場景的視覺表現,還能提升用户體驗的沉浸感【1†source】。Three.js支持多種光照類型,每種類型都有其獨特的應用場景和效果。


二、Three.js基礎光照類型

Three.js提供了以下幾種常用的光照類型:

1. 環境光(AmbientLight)

環境光是一種均勻的光源,它不會產生陰影,只會照亮整個場景。環境光適用於模擬漫反射的全局光照效果,例如室內環境的柔和光線【7†source】。

// 創建環境光,顏色為白色,強度為1
const ambientLight = new THREE.AmbientLight(0xffffff, 1);
scene.add(ambientLight);

2. 點光源(PointLight)

點光源是一種從一個點向所有方向發射光線的光源,能夠模擬如燈泡、螢火蟲等點狀光源的效果。點光源會產生明顯的陰影和明暗對比【7†source】。

// 創建點光源,顏色為黃色,強度為2,衰減範圍為10
const pointLight = new THREE.PointLight(0xffff00, 2, 10);
pointLight.position.set(5, 5, 5); // 設置光源位置
scene.add(pointLight);

3. 平行光(DirectionalLight)

平行光是一種模擬平行光線的光源,通常用於表現太陽光的效果。平行光能夠產生清晰的陰影和強烈的明暗對比,適合模擬户外場景【9†source】。

// 創建平行光,顏色為藍色,強度為1
const directionalLight = new THREE.DirectionalLight(0x0000ff, 1);
directionalLight.position.set(0, 10, 0); // 設置光源位置
scene.add(directionalLight);

4. 聚光燈(SpotLight)

聚光燈是一種帶有方向性和範圍限制的光源,能夠模擬手電筒、聚光燈等效果。聚光燈的光線呈錐形分佈,可以通過調整角度和衰減參數來控制光照範圍【7†source】。

// 創建聚光燈,顏色為白色,強度為2,角度為45度
const spotLight = new THREE.SpotLight(0xffffff, 2, 100, Math.PI / 4);
spotLight.position.set(5, 5, 5); // 設置光源位置
spotLight.target.position.set(0, 0, 0); // 設置光照目標
scene.add(spotLight);

5. 區域光(RectAreaLight)

區域光是一種模擬矩形光源的光照類型,能夠實現更復雜的光照效果,例如模擬窗户透進的光線【9†source】。

// 創建區域光,尺寸為2x2,顏色為白色,強度為1
const rectAreaLight = new THREE.RectAreaLight(0xffffff, 1, 2, 2);
rectAreaLight.position.set(0, 5, 0); // 設置光源位置
scene.add(rectAreaLight);

三、Three.js進階光照技巧

1. 光照貼圖(Light Mapping)

光照貼圖是一種通過預先計算場景中的間接光照分佈,從而提升渲染效率的技術。Three.js支持光照貼圖功能,能夠幫助開發者實現更復雜的光影效果【3†source】。

// 加載光照貼圖
const loader = new THREE.TextureLoader();
const lightMap = loader.load('lightMap.jpg');

2. 間接光照(Indirect Lighting)

Three.js通過LightProbe類捕捉和模擬場景中的間接光照,從而增強材質的光照細節。LightProbe能夠捕捉場景中的全局光照信息,並將其應用到物體表面【5†source】。

// 創建LightProbe並設置其位置
const lightProbe = new THREE.LightProbe();
lightProbe.position.set(0, 5, 0);
scene.add(lightProbe);

3. 陰影效果(Shadow)

Three.js允許開發者通過配置光源和物體的陰影屬性,實現實時的陰影計算。陰影效果能夠顯著提升場景的真實感【6†source】。

// 啓用平行光的陰影效果
directionalLight.castShadow = true;
directionalLight.shadow.mapSize.width = 2048;
directionalLight.shadow.mapSize.height = 2048;

四、Three.js光照實戰案例

案例:創建一個帶有環境光和平行光的3D場景

1. 場景初始化
// 創建場景、相機和渲染器
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);
2. 添加物體
// 創建一個紅色立方體
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
3. 添加光照
// 添加環境光
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5);
scene.add(ambientLight);
// 添加平行光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(5, 5, 5);
directionalLight.castShadow = true;
scene.add(directionalLight);
4. 設置相機位置
camera.position.z = 10;
5. 渲染循環
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();

五、總結與展望

Three.js的光照系統為開發者提供了強大的工具,能夠實現從簡單到複雜的光影效果。通過合理配置環境光、點光源、平行光等基礎光照類型,結合光照貼圖、間接光照和陰影效果等進階技巧,開發者可以打造出生動、真實的3D場景【4†source】。

未來,隨着WebGL和GPU技術的不斷髮展,Three.js的光照效果將更加逼真,甚至能夠實現光線追蹤等高級效果。對於開發者而言,掌握Three.js的光照技術不僅是提升項目質量的關鍵,也是探索3D圖形領域無限可能的基石。