在真實世界中,物體因為反射光進我們的眼中,而能被看見;因此,除了物體形狀外,材質與光之間的關係是3D模擬的重要元素。
上一篇使用MeshStandardMaterial
時,在場景中加上的是環境光源AmbientLight
。
const boxGeometry = new THREE.BoxGeometry();
//使用會受光源影響的MeshStandardMaterial
const material = new THREE.MeshStandardMaterial( { color: 0xa45} );
const cube = new THREE.Mesh( boxGeometry, material );
//建構基礎環境光源
const light = new THREE.AmbientLight( );
scene.add( light );
除了環境光源AmbientLight
外,Three.js還提供了模擬燈泡發光的點光源PointLight
、聚光燈SpotLight
、平面光光源RectAreaLight
、模擬光源無限遠的平行光DirectionalLight
、場景上方的半球體光源HemisphereLight
等,光源一樣需要先利用new
建構出來並將光源加進場景。
//建構基礎聚光燈,並加進場景中
const spotLight = new THREE.SpotLight( );
scene.add( spotLight );
不同類型的光源可傳入的參數不盡相同,多數可依照需求傳入顏色color
和光照強度intensity
,在建構時傳入相關數值即可定義出不同光源。另外,與光照強度intensity
類似,控制光的強弱還有power
光功率屬性,像是點光源PointLight
、聚光燈SpotLight
都有提供,可以做對應設定。
//建構光源,第一個參數定義色光,第二個則為光照強度
const yellowSpotLight = new THREE.SpotLight( 0xffff00, 60 );
const redSpotLight = new THREE.SpotLight( 0xff0000, 60 );
const pointLight = new THREE.PointLight( 0xffff00 );
//設定光源的位置
yellowSpotLight.position.set( -3, 5, -1 );
redSpotLight.position.set( 3, 5, 6 );
pointLight.position.set( 0, 0, 1 );
//除了光照強度(intensity)外,也可以設定power改變光的強弱
pointLight.power= 80 *Math.PI;
//別忘了要將光源加進場景中!
scene.add( yellowSpotLight, redSpotLight, pointLight );
攝影機、物件和光源都具有position
可以設定,可以分別指定x
、y
、z
進行設定,或使用set()
同時設定三軸數值。而定義旋轉角度的rotation
也與position
相同,可以分別指定三軸數值,也可使用set()
同時設定。
SpotLight.position.x = -3;
SpotLight.position.y = 5;
SpotLight.position.z = -1;
cube.rotation.set( 1, 1, 0 );