對比三維空間旋轉的幾種方法——尤拉角、繞軸的旋轉、矩陣、四元數、雙四元數
三維空間的旋轉可以用尤拉角,旋轉矩陣,軸-角,四元數,雙四元數來表示,本文主要總結這些表示方法的優缺點。像矩陣、四元數等的實現的下載地址,可以參考這裡,也可以參考Ogre渲染引擎的核心,都有很高效的實現方法。
一. 尤拉角(Euler-Angles)
1.1 介紹
尤拉角包括3個旋轉,根據這3個旋轉來指定一個剛體的朝向。這3個旋轉分別繞x軸,y軸和z軸,分別稱為Pitch,Yaw和Roll,如下圖所示。尤拉角可以表示成z-x-z,x-y-x,z-y-z等形式,旋轉的順序影響結果。
Pitch Yaw Roll圖1. 尤拉角的表示
尤拉角很重要的一個優點就是直觀,容易理解。
尤拉角主要有下面幾個缺點:
(1) 尤拉角是不可傳遞的,旋轉的順序影響旋轉的結果,不同的應用又可能使用不同的旋轉順序,旋轉順序無法統一;
(2) 3個旋轉的角度可以不受限制,即可以是10000度,也可以是-1500度;
(3) 可能造成萬向節死鎖(Gimbal Lock)。
1.2 平萬向節死鎖
當兩個環發生重疊的時候,就有丟失了一個自由度,如圖2所示。對萬向節死鎖可以參考【1】【2】【3】,特別是【1】提供的視訊,對知識點的介紹非常的形象生動。也正是由於鎖的存在,無法使用尤拉角實現球面平滑的插值。
圖2. 萬向節死鎖
二. 旋轉矩陣
用3*3的矩陣,可以表示三維空間中所有的旋轉,設 θ
X=⎛⎝⎜1000cosθsinθ0−sinθcosθ⎞⎠⎟ Y=⎛⎝⎜cosθ0−sinθ010sinθ0cosθ⎞⎠⎟ Z=⎛⎝⎜cosθsinθ0−sinθ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."