2013-05-09 33 views
8

我真的是新東西。我想製作一個簡單的3D場景,我可以在這裏與PointerLockControls一起飛行,但我也想要一些手電筒。所以聚光燈應該指向與相機相同的方向。點SpotLight在相機的方向three.js(手電筒)

我已經讓聚光燈跟隨相機,但它的目標是綁定到0,0,0。

達到此目的的最佳方法是什麼?

謝謝。

回答

12

SpotLight目標是Object3D,而不是Vector3

spotlight.target = myObject; 

你的情況最好的解決辦法是使用PointLight代替,並使用此模式:如果你仍然想使用聚光燈

scene.add(camera); 
camera.add(pointLight); 

,然後做這樣的事情:

scene.add(camera); 
camera.add(spotLight.target); 
spotLight.target.position.set(0, 0, -1); 
spotLight.position.copy(camera.position); // and reset spotlight position if camera moves 

它一般不要求相機被添加作爲場景的一個孩子,但它需要在這種情況下,因爲光被添加爲相機的孩子。

three.js所r.69

+0

是的,但PointLight不給我陰影。有沒有辦法讓他們與PointLight? – 2013-05-12 20:36:54

+0

確實,pointLights不支持陰影。但是,如果光線位於相機所在的位置,則無論如何您都看不到陰影,因爲投射陰影的物體擋在了路上。 – WestLangley 2013-05-12 21:17:03

+0

好吧,也許壞的例子 - 任務: 我想在node.js作爲服務器,(多人)同步場景中的兩個單位,我想閃光燈在每個單位,指向定義的方向。通過套接字發送此類信息的最佳方式是什麼? (通過接受按鈕的方式?:)) – 2013-05-14 14:49:28

8

我有我解決了同樣的問題如下:

flashlight = new THREE.SpotLight(0xffffff,4,40); 
camera.add(flashlight); 
flashlight.position.set(0,0,1); 
flashlight.target = camera; 

由於Spotlight的.TARGET需要是​​一個對象(而不是一個位置),我發現它精神上更容易簡單地把手電筒背後將相機直接,然後瞄準它相機。因此,光線照在照相機上並照亮它前面的東西。

這個方法是好的,如果你所在的手電筒舉行靠近胸部一側(中央對身體),而不是關閉手電筒後的效果。

+0

這對我工作感謝!一直試圖找到一些工作代碼。你知道聚光燈是否可以獨立於相機進行互動嗎?我在這裏問過一個問題:http://stackoverflow.com/questions/17827292/add-interactivity-to-a-spotlight-in-three-js – Paul 2013-07-24 23:08:58

2

通過WestLangley的解決方案的啓發上面,我發現spotlight.target聚光燈本身可以作爲孩子相同的對象,無論是相機或其他物體,比如一輛汽車或槍。然後它們相對於父對象進行定位,因此不需要將位置從一個對象複製到另一個對象。

你可以,例如,做這樣的事情:

scene.add(camera); 
camera.add(gun); 
gun.position.set(-30,-30,0); 
gun.add(spotlight); 
spotlight.position.set(0,0,30); 
gun.add(spotlight.target); 
spotlight.target.position.set(0,0,31); 

而現在的槍將,默認情況下,按照攝像頭,聚光燈將沿着槍亮起。如果槍因某種原因旋轉(偏轉子彈或在地面或其他地方爬行),聚光燈也會旋轉。 THREE是一款不錯的軟件。 :-)

如果將聚光燈的相機,並在相同的方向將相機指向它,不定位它遠離中心,則光錐看起來不斷循環。對於許多應用來說,它看起來更酷更實際,它在投影中動態改變形狀。一個小的偏移量就是它所需要的(例如在我上面的例子中,雖然我沒有測試過那個)。