1. 程式人生 > >對比三維空間旋轉的幾種方法——尤拉角、繞軸的旋轉、矩陣、四元數、雙四元數

對比三維空間旋轉的幾種方法——尤拉角、繞軸的旋轉、矩陣、四元數、雙四元數

三維空間的旋轉可以用尤拉角,旋轉矩陣,軸-角,四元數,雙四元數來表示,本文主要總結這些表示方法的優缺點。像矩陣、四元數等的實現的下載地址,可以參考這裡,也可以參考Ogre渲染引擎的核心,都有很高效的實現方法。

一.  尤拉角(Euler-Angles

1.1    介紹

尤拉角包括3個旋轉,根據這3個旋轉來指定一個剛體的朝向。這3個旋轉分別繞x軸,y軸和z軸,分別稱為Pitch,Yaw和Roll,如下圖所示。尤拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋轉的順序影響結果。

euler_pitch
Pitch
euler_yaw
Yaw
euler_roll
Roll

圖1. 尤拉角的表示

尤拉角很重要的一個優點就是直觀,容易理解。

尤拉角主要有下面幾個缺點:

(1)       尤拉角是不可傳遞的,旋轉的順序影響旋轉的結果,不同的應用又可能使用不同的旋轉順序,旋轉順序無法統一;

(2)       3個旋轉的角度可以不受限制,即可以是10000度,也可以是-1500度;

(3)       可能造成萬向節死鎖(Gimbal Lock)。

1.2 平萬向節死鎖

當兩個環發生重疊的時候,就有丟失了一個自由度,如圖2所示。對萬向節死鎖可以參考【1】【2】【3】,特別是【1】提供的視訊,對知識點的介紹非常的形象生動。也正是由於鎖的存在,無法使用尤拉角實現球面平滑的插值。

Gimbal_lock_airplane

圖2. 萬向節死鎖

二. 旋轉矩陣

用3*3的矩陣,可以表示三維空間中所有的旋轉,設 θ

 表示沿著軸的方向望去時,方向是順時針的旋轉角度。則繞著X軸、Y軸、Z軸旋轉 θ 角,對應的旋轉矩陣表示如下所示:

X=1000cosθsinθ0sinθcosθ   Y=cosθ0sinθ010sinθ0cosθ   Z=cosθsinθ0sinθcosθ0001

旋轉矩陣支援傳遞性,使用起來很簡單方便,但是存在下面一些缺點:

(1)       浪費記憶體,至少需要12個引數,來表示一個6個自由度的結構;

(2)       可能就引入不該有的縮放(Scaling)和錯切(Sheering)

(3)       矩陣插值的實現難度很大;

(4)       不直觀。

三.  -角度

繞著單位長度的軸旋轉某個角度,使用組合對 (n⃗ ,θ) 。

該方向很直觀,避免了尤拉角使用時的萬向節死鎖;但是實現多個旋轉的組合時,比較困難;不能簡單的通過對4個元素的線性插值來實現軸-角度的插值,會引起錯誤。

四. 四元數

參考《四元數》和《雙四元數》,也可以參考【5】【6】【7】,這裡只簡單的描述下該方法的優缺點。

它的缺點就是很不直觀,理解起來較費勁。但是存在很多優點:

(1)       更健壯,不會出現尤拉角中出現的萬向節死鎖。

(2)       更高效,花費更少的空間和時間;當使用有限的精度對矩陣進行大量的操作,就會發生漂移(Drift),實數的四捨五入就會不斷累積到矩陣中。由於漂移的存在,旋轉的操作就可能發生錯誤,所以要對矩陣進行歸一化操作,重置矩陣,這是很費時的操作。四元數只有4個值,而矩陣有9個,它經歷的漂移作用就小,而且歸一化時間就更少。

(3)       使用起來很簡單

五. 雙四元數

雙四元數,參考《雙四元數》一文。簡單來說,就是它使用了兩個四元數,8個引數,不僅可以表示旋轉,也可以表示位移。

六. 參考

【4】       Kenwright, Ben. "A Beginners Guide to Dual-Quaternions."