2012-10-09 88 views
0

讓方向爲d的第一人稱相機。執行旋轉的旋轉軸

爲了讓攝像機指向目標t(與相關的方向d2),我將不得不圍繞某個軸旋轉d,對不對?這個軸應該穿過相機,並且應該垂直於由d和d2形成的平面,對吧?

假設我每幀向某個角度旋轉向量d,旋轉軸不應該改變,因爲儘管d正慢慢接近d2,它們相應的平面不會改變,對嗎?

那麼,如果這都是真的,那麼我想知道爲什麼我的旋轉軸在下面的示例中每次調用都會改變。旋轉工作正確,但速度從旋轉開始到結束減少。

本文來自current question here的背景,您可以在其中看到源代碼。

回答

0

方向_rotationAxis因爲你的狀態是恆定和正確的,因此點的旋轉方向不會改變。但_rotationAxis的大小正在改變,因此您可以得到x,y,z分量和不同旋轉量的不同值。

當執行交叉得到的旋轉軸線,所得到的矢量的長度是進行雜交AND將它們分開的角度這兩個向量的長度的函數。結果矢量的方向對於兩個輸入矢量總是90度。

最有可能的是,您使用的2個向量的長度是一致的,並且最接近單位長度,但由於它們之間的角度小於每個幀,因此每個幀的結果長度不同。

在Xna中,由CreateFromAxisAngle產生的旋轉量不僅取決於您插入的角度作爲參數,還取決於軸向量的長度(在文檔中不明顯,但確實不會少) 。因此,您每幀都使用更短和更短的旋轉軸,這會導致每幀的旋轉量越來越小。如果旋轉軸向量的長度爲1.0(單位長度向量),則只會導致插入的旋轉角度。

CreateFromAxisAngle中使用它之前,您必須將_rotationAxis標準化爲單位長度。

_rotationAxis = Vector3.Cross(Direction, _flyTargetDirection); 
_rotationAxis.Normalize(); 
_rotation = Matrix.CreateFromAxisAngle(_rotationAxis, MathHelper.ToRadians(_flyViewingSpeed - Math.ToRadians(rotationSpeed)));