我正在嘗試使用Three.js創建一個小型的第一人稱遊戲,但我在照明方面遇到了問題。基本上我想模擬太陽,並圍繞投射燈旋轉。目前我正在使用THREE.DirectionalLight
,並且它僅點亮了一個方向,因此立方體的邊緣保持黑色/黑色。Three.js的逼真照明(陽光)?
我是否必須使用多個燈才能點亮一切?或者我能以某種方式反射地面/物體上的光線?
我正在嘗試使用Three.js創建一個小型的第一人稱遊戲,但我在照明方面遇到了問題。基本上我想模擬太陽,並圍繞投射燈旋轉。目前我正在使用THREE.DirectionalLight
,並且它僅點亮了一個方向,因此立方體的邊緣保持黑色/黑色。Three.js的逼真照明(陽光)?
我是否必須使用多個燈才能點亮一切?或者我能以某種方式反射地面/物體上的光線?
是的,你將不得不使用多個燈來實現這一點,僞造反射光。計算真實反射光不是內置的(並且計算上非常複雜/昂貴)。你有各種選擇。
第二個定向燈可以始終處於太陽的相反位置和方向。
保持恆定的半球光。半球照明獲得了天空的顏色和地面顏色和強度,併爲您的照明增加了一點點深度。
// sky color ground color intensity
hemiLight = new THREE.HemisphereLight(0x0000ff, 0x00ff00, 0.6);
這裏的工作示例http://mrdoob.github.com/three.js/examples/webgl_lights_hemisphere.html
你可以使用不同的燈的任意組合,但要小心,有一個性能權衡。
還值得一提的是通過在材質中將wrapAround屬性設置爲true來啓用half-lambert陰影。這給黑色帶來了更好的衰減,從而減少了刺眼的照明。更多的中音和更少的黑色。
我用這兩種燈的組合來創建此視頻:http://www.youtube.com/watch?v=m68FDmU0wGw
var hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6);
hemiLight.color.setHSV(0.6, 0.75, 0.5);
hemiLight.groundColor.setHSV(0.095, 0.5, 0.5);
hemiLight.position.set(0, 500, 0);
scene.add(hemiLight);
var dirLight = new THREE.DirectionalLight(0xffffff, 1);
dirLight.position.set(-1, 0.75, 1);
dirLight.position.multiplyScalar(50);
dirLight.name = "dirlight";
// dirLight.shadowCameraVisible = true;
scene.add(dirLight);
dirLight.castShadow = true;
dirLight.shadowMapWidth = dirLight.shadowMapHeight = 1024*2;
var d = 300;
dirLight.shadowCameraLeft = -d;
dirLight.shadowCameraRight = d;
dirLight.shadowCameraTop = d;
dirLight.shadowCameraBottom = -d;
dirLight.shadowCameraFar = 3500;
dirLight.shadowBias = -0.0001;
dirLight.shadowDarkness = 0.35;
謝謝!將wrapAround設置爲true已修復它。現在沒有黑色,即使不是直接在光線下,顏色仍然可見,這正是我想要的。我已經更新了原始鏈接:)現在只需要弄清楚如何修復我的影子問題。 – 2013-03-18 16:00:20
自評論發佈以來,wrapAround似乎已被刪除。現在如何實現這種效果? – 2017-06-29 13:51:22