2011-04-01 24 views
1

我有用C#編寫的四元數相機(無恥地從在線教程中獲取)。我試圖在攝像機「面向」的方向上將攝像機在世界空間中的位置(表示爲Vector3)進行轉換。但是,我希望相機在Y軸上保持固定的高度(假設相機永遠不會「顛倒」,因爲相機可能不會垂直向上或向下看Y軸)。簡而言之,我希望相機的行爲方式類似於RTS遊戲中的相機,例如命令&征服。向前推動應該使你「向上」地圖,並保持在地形以上的恆定高度。我在下面給出的天真嘗試是不夠的,因爲相機的速度取決於相機俯視世界的角度。翻譯固定高度的四元數相機

var Y = mPosition.Y; 
mPosition += mInverseViewMatrix.Backward * amount; 
mPosition.Y = Y; 

在上面,mPosition是一個表示世界位置的Vector3。 mInverseViewMatrix是視圖矩陣的逆。

我正在使用XNA和C#,但任何關於四元數和矢量操縱的一般建議可能都會有用。

回答

1

我已經通過兩種方式處理了這個問題。

1)使用四元數來旋轉指向'forward'的單位矢量,以便它指向適當的方向。清除矢量的組成部分。重新歸一化矢量。乘以速度並添加到當前位置。

編輯 2)製作一份四元數。四捨五入組成的四元數的xz。重新規範化四元數。通過四元數旋轉單位矢量,乘以速度並添加到位置。旋轉的四元數表示是修改的軸角表示。因此,如果您將發生旋轉的軸的'x'和'z'部分清零,則剩餘的唯一旋轉是圍繞y軸的旋轉'偏轉'(假設「前進」與z對齊-軸)。

+0

我用你的第二個建議,它工作的一種享受。它看起來像是一個間接的解決方案,但我肯定會採取一個不正確的解決方案。謝謝。 – Necrototem 2011-04-01 09:50:18

+0

我回想起來,我剛剛意識到,這種轉換在圍繞Y軸旋轉時看起來並不穩定。也許我錯了,任何指針? var orient = new Quaternion(new Vector3(0,mOrientation.Y,mOrientation.Z),mOrientation.W); orient.Normalize(); var vect = Vector3.Transform(Vector3.UnitX,Matrix.CreateFromQuaternion(orient)); // Vector3.UnitX * Matrix.CreateFromQuaternion(orient); mPosition + = vect * amount; – Necrototem 2011-04-01 10:03:12

+0

糟糕。是的,你還需要將** z **清零,只剩下w和x。 – JCooper 2011-04-01 15:34:04