2017-03-04 95 views
1

所以我在3D空間中有一點,並且我在3D空間中定位和旋轉了相機。Point look at Point

所以對象上基本上有Vector3。 相機Vector3Quaternion

我需要得到如何看待這一點。

我想告訴用戶如何移動到那一點。 用戶應該將相機向左還是向右還是向後?

+0

如果您要引導用戶,則答案取決於用戶界面。它是一個標準的FPS風格的相機,用戶可以通過鼠標x軸和y軸進行俯仰而不旋轉嗎? – samgak

+0

它不能旋轉,是的,它是標準的FPS風格 –

回答

1

這樣做的一種方法是計算相機當前面向的偏航角度(如羅盤標題)的方向,並計算出需要面對的方向以查看點。

從另一箇中減去一個,並調整結果使其在-180到180度範圍內(或pi到pi弧度),然後根據標誌告訴用戶左轉或右轉。如果絕對值超過120度(或某個可配置的值),那麼告訴他們它在它們後面。

要找到相機的當前標題,請用四元數轉換矢量(0,0,1)以獲取正向矢量,然後使用atan2(forward.z, forward.x)計算標題。

要計算一下點,從點減去當前的相機位置以獲得所需的正向矢量,然後傳遞給反正切所需的標題:

Vector3 desired_forward = point - camera_pos; 
float desired_heading = atan2(desired_forward.z, desired_forward.x); 

然後找到需要的旋轉:

float rotation_needed = desired_heading - heading; 
if(rotation_needed > Math.PI) 
    rotation_needed -= 2 * Math.PI; 
if(rotation_needed < -Math.PI) 
    rotation_needed += 2 * Math.PI; 

現在告訴用戶根據所需旋轉的符號向左或向右旋轉。

float xzLength = sqrt(forward.x * forward.x + forward.z * forward.z); 
float pitch_angle = atan2(forward.y, xzLength); 

執行:

如果你想這樣做的查找上/下,你可以通過先計算向前向量的長度在XZ平面,然後用ATAN2重新計算的俯仰角對於期望的正向矢量相同並從期望中減去電流。檢查標誌以告知用戶是查看還是查看。

有一些可能的併發症。例如,取決於相機四元數是指定從世界空間到相機空間的變換還是相反,您可能需要取消計算的相機標題。

+0

非常感謝你的出色答案! 我一直在想,我正在實施類似的東西。 現在這對我來說很清楚。 :) –