2013-03-18 158 views
16

我正在嘗試使用Three.js創建一個小型的第一人稱遊戲,但我在照明方面遇到了問題。基本上我想模擬太陽,並圍繞投射燈旋轉。目前我正在使用THREE.DirectionalLight,並且它僅點亮了一個方向,因此立方體的邊緣保持黑色/黑色。Three.js的逼真照明(陽光)?

我是否必須使用多個燈才能點亮一切?或者我能以某種方式反射地面/物體上的光線?

回答

14

是的,你將不得不使用多個燈來實現這一點,僞造反射光。計算真實反射光不是內置的(並且計算上非常複雜/昂貴)。你有各種選擇。

第二個定向燈可以始終處於太陽的相反位置和方向。

保持恆定的半球光。半球照明獲得了天空的顏色和地面顏色和強度,併爲您的照明增加了一點點深度。

//         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陰影。這給黑色帶來了更好的衰減,從而減少了刺眼的照明。更多的中音和更少的黑色。

+0

謝謝!將wrapAround設置爲true已修復它。現在沒有黑色,即使不是直接在光線下,顏色仍然可見,這正是我想要的。我已經更新了原始鏈接:)現在只需要弄清楚如何修復我的影子問題。 – 2013-03-18 16:00:20

+0

自評論發佈以來,wrapAround似乎已被刪除。現在如何實現這種效果? – 2017-06-29 13:51:22

19

我用這兩種燈的組合來創建此視頻: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; 
+0

這太好了。源代碼是否可在任何地方使用? – chopper 2015-04-22 04:01:38

+0

不幸的是,不幸的是。我打算打開它,但根本沒有找到時間。如果需要,我可以把它挖出來。 – dirkk0 2015-04-23 13:38:19

+3

好吧,我現在做了:https://github.com/dirkk0/threejs_daynight – dirkk0 2015-05-25 19:42:23