關於旋轉(Rotation)

 

關於旋轉(Rotation工具

 

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

 

在計算機圖形學中,一個物體的位置很容易肯定,直接拿到position就能夠準確地定位物品的位置,可是其方向(orientation)是一個值得探討的話題。那麼經過旋轉角度來能夠定義兩兩orientation之間的改變。「朝向」是狀態,「旋轉」是操做。blog

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

1,旋轉矩陣 io

假設當前的朝向方向是 (x, y, z)    那麼旋轉能夠由旋轉矩陣獲得:nio

沿着X軸旋轉:方法


沿着y軸旋轉:
im

沿着z軸旋轉:
數據

先沿着X軸轉動而後在沿着Y軸轉動,極可能就會致使一個問題萬向節死鎖問題(Gimbal Lockimg

  補充: 出現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的出現;避免了旋轉矩陣的運算量和數據量;能夠很容易的插值操做

相關文章
相關標籤/搜索