2013-07-26 46 views
0

所以最初我希望我的小船'有'可以跟蹤目標的炮塔。這是它的jfiddle。 http://jsfiddle.net/czGZF/2/當他們追蹤時,他們表現奇怪。我注意到它認爲炮塔在它旁邊(在原點),靠這個代碼。three.js Object3D本地位置與全球位置

turret_a.position.y = .25; 
turret_a.position.z = 2; 

但是,我這樣做了,因此可能是當我打電話(見下文)將其添加到「基地船舶

ship = new THREE.Object3D(); 
ship.add(ship_base); 
ship.add(turret_a) ; 

的相對位置。當我改變turret_a的位置在它被添加到船上之後,在船被添加到現場之後,炮塔大部分跟蹤了我希望它看起來如何。

我想我的問題是,爲什麼lookAt()函數使用它的舊位置,而不是它當前在其父對象上的位置來確定它需要在的旋轉角度?

+0

Uhmm ...你看我的答案嗎? – WestLangley

+0

是的,我知道當船在原點時它會起作用,但我希望船能夠從原點移開,並讓其子能夠正確地使用lookAt。 – Lutcikaur

回答

0

如果你看一下Object3D.lookA()代碼,你會看到

// This routine does not support objects with rotated and/or translated parent(s) 

您的代碼工作,如果母船位於起源和不旋轉。

更新小提琴:http://jsfiddle.net/czGZF/4/

three.js所r.59

0

From the API,Camera對象的lookAt()方法被定義爲使用世界位置,就像您發現的那樣。這似乎是處理事情的比較常見的方式。

我沒那麼熟悉,特別是three.js所API,但現在看來,如果你想獲得球的全球地位,你可以使用以下命令:

var targetPos = ball.position.clone(); 
ball.localToWorld(targetPos); 

希望這得到你更接近你的目標。不幸的是,你似乎是(非常)非確定性的小提琴,所以我不能很快爲你獲得100%的解決方案。

+0

我試過turret_a.lookAt(turret_a.worldToLocal(ball.position.clone())); 但它只是閃爍,什麼也沒做。但是,我確實找到了一種方法來使其工作..有點。更新OP。 – Lutcikaur

+0

你有一個拼寫錯誤,不能用一個字符的編輯進行更新,它應該是:'Object3D.lookAt()'帶't' – kontur