關於旋轉(Rotation)


 

關於旋轉(Rotation

 

很多萌新在接觸計算機圖形學的時候,不明白為啥要用四元數來表示旋轉角度,那這篇文章主要從比較各大旋轉角度,在比較中突出四元數的優點和實用。

 

在計算機圖形學中,一個物體的位置很容易確定,直接拿到position就可以准確地定位物品的位置,但是其方向(orientation)是一個值得探討的話題。那么通過旋轉角度來可以定義兩兩orientation之間的改變。“朝向”是狀態,“旋轉”是操作。

關於旋轉這個話題,接下來分成三個步驟,由淺入深地來討論:

1,旋轉矩陣

假設當前的朝向方向是 (x, y, z)    那么旋轉可以由旋轉矩陣得到:

沿着X軸旋轉:


沿着y軸旋轉:

沿着z軸旋轉:

先沿着X軸轉動然后在沿着Y軸轉動,很可能就會導致一個問題萬向節死鎖問題(Gimbal Lock

  補充: 出現Gimbal Lock的本質原因在於:當第二次旋轉角度為90度時,第三個軸和第一個軸轉到了同個方向,因此缺少了一個自由度,導致了運動空間的限制。

 

取代上面方案的是沿着任意軸進行旋轉特定的角度 

但這種方法也是不能完全解決萬向節死鎖問題

 

 

2,歐拉角

針對上面的旋轉問題,旋轉數據量大,且存在問題,那使用歐拉角 可以使用vec3來存儲一個歐拉角

Vec3 EulerAngles(RotationX, RotationY, RotationZ);

歐拉角可以分為三個部分,俯仰角:圍繞x軸的pitch,偏航角:圍繞y軸的yaw,滾轉角:圍繞z軸的roll

 

 

使用歐拉角可以表示任何種類的旋轉角度。但是仍存在着一個歐拉角的問題:

對兩個朝向進行插值比較難,簡單對xyz簡單插值得到結果不理想;

實施多次旋轉很復雜且不准確,必須計算出最終的旋轉矩陣,然后據此推測歐拉角

不同角度可產生同樣的旋轉;

針對有些操作會很復雜;如繞指定的軸旋轉N角度。

 

3,四元數,表示旋轉的好工具。

四元數是由4個數[x, y, z, w]構成,表示了如下的旋轉

x = RotationAxis.x * sin(RotationAngle / 2)

y = RotationAxis.y * sin(RotationAngle / 2)

z = RotationAxis.z * sin(RotationAngle / 2)

w = cos(RotationAngle / 2)

其中 RotationAxis 旋轉軸,RotationAngle 旋轉的角度。 

這樣四元數中實際上存儲了一個旋轉軸和一個旋轉角度。其中xyz分別代表了各個軸上的旋轉分量。

其中[0, 0, 0, 1]表示單位四元數 (unit quaternion),表示沒有旋轉。

 

3. (1)如何從兩個方向向量得到旋轉角度:

      r = v1 X v2 是旋轉軸

      O = acos(v1 * v2)  是旋轉角度 

    然后帶入上面的公式即可。

 

3.(2)如果先轉動了q1,再轉動了q2, 那么結果轉動了q’ = q2 * q1

 

3.(3) 

 

四元數(quaternion)的好處是:使用角度和坐標軸的表示方法來防止了Gimbal lock的出現;避免了旋轉矩陣的運算量和數據量;可以很容易的插值操作

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM