關於旋轉(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,

使用歐拉角可以表示任何種類的旋轉角度。但是仍存在着一個歐拉角的問題:
對兩個朝向進行插值比較難,簡單對x,y,z簡單插值得到結果不理想;
實施多次旋轉很復雜且不准確,必須計算出最終的旋轉矩陣,然后據此推測歐拉角
不同角度可產生同樣的旋轉;
針對有些操作會很復雜;如繞指定的軸旋轉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的出現;避免了旋轉矩陣的運算量和數據量;可以很容易的插值操作
