對於在三維空間里的一個參考系,任何其它坐標系的取向,都可以用三個歐拉角來表現。參考系又稱為實驗室參考系,是靜止不動的。而坐標系則固定於剛體,隨着剛體的旋轉而旋轉。
歐拉角是用來表示三維坐標系中方向和方向變換的。我們平時說的歐拉角其實還可以細分為歐拉角(Euler-angles)和泰特布萊恩角(Tait-Bryan-angles),這兩種方法都利用了笛卡爾坐標系的三軸作為旋轉軸,主要區別在於選取順序。歐拉角的選取順序有 這6種,可見選取順序是a,b,a這樣的順序,也就是繞a軸旋轉某角度后,繞新生成的b軸旋轉一個角度,最后繞兩次旋轉以后的a軸再旋轉一個角度,以此表示最終的方向。泰特布萊恩角的旋轉軸選取有
這6種,也就是歷遍笛卡爾坐標系的三軸,比如我們最常見到的Roll-Pitch-Yaw角就是其中
的情況。但這兩種方法,其實都是在空間中用最直觀的方式和最少的參數表示任意方向的通用方法。
(一)zxz順序歐拉角
如下圖所示。設定xyz-軸為參考系的參考軸XYZ-軸為物體上的坐標系軸。稱xy-平面與XY-平面的相交為交點線,用英文字母(N)代表。zxz順規的歐拉角可以靜態地這樣定義
α 是x-軸與交點線的夾角,
β 是z-軸與Z-軸的夾角,
γ 是交點線與X-軸的夾角。
(可以證明Z,z軸與N是垂直的)
對於夾角的順序和標記,夾角的兩個軸的指定,並沒有任何常規。不同的作者會用不同組合的歐拉角來描述,或用不同的名字表示同樣的歐拉角。因此,使用歐拉角前,必須先做好明確的定義。
這個過程中新生成的坐標系 可以通過運算由原坐標系
得到:
其中,矩陣M表示了上面三次旋轉的總過程。我們簡單推一下:
以上歐拉角

(二)x,y,z順序歐拉角
空間中有三個旋轉歐拉角α,β,γ,選取順序為x,y,z,可以通過構建旋轉矩陣Rx,Ry,Rz得到旋轉矩陣R=Rz(γ)Ry(β)Rx(α),空間某點m(x,y,z)在新的坐標系下的坐標為:Rm(x,y,z)。
旋轉矩陣計算歐拉角公式:
俯仰角θ(pitch):圍繞Y軸旋轉的角度。
偏航角ψ(yaw):圍繞Z軸旋轉的角度。
滾轉角Φ(roll):圍繞X軸旋轉的角度。
(三)歐拉角萬向鎖效應
在游戲中,當角色旋轉的動畫觸發時,角色就會做一系列連續的旋轉變換,每一個變換都要用一組歐拉角來表示,但是不可能吧每一個方位的歐拉角都存儲起來,因此動畫師定義了一系列關鍵幀,指定關鍵幀處角色的方位(用一組歐拉角描述),然后計算機根據時間t對這幾組歐拉角進行插值,得到一系列歐拉角。
如果pitch不是±90°,就不會出現萬向鎖現象,插值后的一系列歐拉角完全可以刻畫出我們所期望的角色旋轉路徑。
如果某個關鍵幀的pitch即繞第二個軸的旋轉為90°,就會遇到萬向鎖
為了能有一個感性的認識,還是以手機為例,下面我指定了四個關鍵幀,四個關鍵幀處手機的方位分別用R0,R1,R2,R3四組歐拉角表示(逆時針為正方向,右手法則):
(注意R0處的物體坐標系與世界坐標系的指向是相同的,我假定z軸向上,x軸p向右,y軸指向自己的胸口)
繞z軸旋轉角度 繞y軸旋轉角度 繞x軸旋轉角度
R0: 0 0 0
R1: 90 0 0
R2: 90 90 0
R3: 0 0 90
請先分別對手機做這四個變換,然后記住手機的這四個方位,想象一下你“期望”的連續的動畫應該是什么樣子的。
但實際情況是否是這樣的呢?
你可以自己嘗試對這個四個方位角插值,然后進行旋轉,看看得到的路徑是否和上述我們所期望的相同。
以下是我的嘗試:
求出R0 到R1以及R1到R2的插值,然后旋轉,完全符合上面的路徑。但是再求出R2到R3的幾個插值后,旋轉得到的路徑與期望不符。比如這兩個插值:
z:60 y:60 x:30
z: 45 y:45 x:45
做這兩個旋轉,你會發現手機與桌面不垂直,也就是R2到R3的路徑與期望的發生了偏移(本來R2到R3的過程按照預想應該是手機一直與桌面垂直)。
其實這是由於歐拉角插值的不光滑引起的。通俗的講兩個歐拉角插值得到的新歐拉角,不一定在你想要的軌跡上。
總結:如果動畫師在某個關鍵幀處指定了會引發萬向鎖的方位,則下一個關鍵幀的方位一旦超出了萬向鎖的約束范圍,則這兩個關鍵幀之間的路徑就可能會發生偏移,反映在角色動畫上是旋轉偏移,反映在鏡頭控制上就是鏡頭抖動。
要獲得路徑偏移的感性認識,可以參考這個視頻:這個視頻和我的描述有些不同,該視頻使用一個稱為萬向節的奇怪裝置解釋的,而我是直接用的物體坐標系但路徑偏移都是一樣的。
視頻網址:http://v.youku.com/v_show/id_XNzkyOTIyMTI=.html
疑問:當第二次旋轉角不是90度時,兩幀圖片插值是否得到不同的軌跡?
歐拉角插值問題分析。
事實1 . 單個歐拉角能夠正確表示旋轉無論死鎖還是不死鎖。但是當兩個歐拉角插值的時候,由於死鎖的存在,導致插值后的歐拉角表示的旋轉與原始的兩個歐拉角表示的旋轉差異很大。
事實2. 一種旋轉可以用多種歐拉角表示。例如,x角度為100,與x角度為460其實是一樣的。X角度為-179其實和+179很接近。更有甚者,當出現死鎖的時候,同一種旋轉有無數種歐拉角表示。具體方法參照文章Computing Euler angles from a rotation matrix
事實4. 當歐拉角接近死鎖的時候會引起抖動。例如48.5557 82.8384 48.0888以及 141.922 81.0177 142.027.這兩個歐拉角其實非常相近,但是除了y角之外其余兩個坐標差異比較大。因為兩個歐拉角的y旋轉角度都接近90°了,越靠近90°,y軸的微小變動就對xz兩個角度影響非常大,所以進行插值的時候直接進行插值會引起抖動。例如上面的插值結果可能為5.23894 90.9103 5.05811,這個結果與上面兩個原始角度所表達的方向都不一樣。
參考文獻:
www.cnblogs.com/xiaoxiaoqingyi/p/6932008.html
www.zhihu.com/question/47736315/answer/236808639
www.cnblogs.com/tclikang/archive/2012/11/29/2794687.html