2015-01-15 14 views

回答

3

lookAt不可用作矢量,它實際上是一個在THREE.Object3D中的方法,您可以看到here。該方法用於創建旋轉矩陣,該矩陣應用於對象以更改對象的旋轉(方向)。

所以如果你想知道對象的當前方向(lookAt)是什麼,你必須從對象的旋轉中提取這些信息。

在本地空間中,攝像頭正在俯視z軸。如果將相機旋轉應用於該矢量,結果爲相機的lookAt或方向。

var vector = new THREE.Vector3(0, 0, -1); 
vector.applyQuaternion(camera.quaternion); 

也檢查this answer到類似的問題。

+0

謝謝你的幫助。我添加了上面的代碼並在控制檯中接收了向量的值:{x:0,y:0,z:-1,構造函數:function,set:function ...}。然後我嘗試了vector.applyEuler(camera.rotation,camera.eulerOrder);並收到此:{x:-0.5773502588272095,y:-0.5773502743708339,z:-0.5773502743708337,構造函數:function,set:function ...}。這些值可能顯示相機的當前旋轉。糾正我,如果我錯了。那麼我需要找到相機在哪裏看?不知道如何! – mbehnaam

+0

如果你希望得到一個空間點,我不得不讓你失望。相機不看一點,但它從相機原點(位置)看到您計算的方向。 – Wilt

6

Wilt的這個答案很有洞察力,但不完全正確。代碼返回一個指向相機指向相同方向的矢量。這是一個很好的開始!但是除非攝像機位於原點(0,0,0)(或者恰好位於將原點連接到旋轉的矢量點而沒有超過該點的線段上,以便該點位於相機後面)相機不會看這一點。顯然 - 僅僅是常識 - 攝像頭的位置也影響着正在觀察的點。考慮一下。無論相機在哪裏,相機方法lookAt()都會查看3D空間中的一個點。因此,通過調用拿到一分,該相機在看着你需要調整攝像頭位置:

vec.add(camera.position);

還值得一提的是,相機在單點不是看,而是低頭一系列無限數量的點,每個點與相機距離不同。上述來自Wilt的代碼返回的矢量長度恰好是一個單位,因爲將四元數應用於歸一化的z軸矢量(0,0,-1)將返回另一個歸一化矢量(以不同的方向)。從照相機使用計算的外表在點在任意的距離x

(new THREE.Vector3(0, 0, -x)).applyQuaternion(camera.quaternion).add(camera.position);

這從原點取沿着z軸的點的距離x,它旋轉到攝像機的方向然後通過添加相機的位置創建一個「世界點」。我們想要一個「世界點」(而不是「相對於相機點」),因爲camera.lookAt()也需要一個「世界點」作爲參數。