歐拉角研究


  對於在三維空間里的一個參考系,任何其它坐標系的取向,都可以用三個歐拉角來表現。參考系又稱為實驗室參考系,是靜止不動的。而坐標系則固定於剛體,隨着剛體的旋轉而旋轉。
  歐拉角是用來表示三維坐標系中方向和方向變換的。我們平時說的歐拉角其實還可以細分為歐拉角(Euler-angles)和泰特布萊恩角(Tait-Bryan-angles),這兩種方法都利用了笛卡爾坐標系的三軸作為旋轉軸,主要區別在於選取順序。歐拉角的選取順序有 (x, y, x), (x, z, x), (y, x, y), (y, z, y), (z, x, z), (z, y, z) 這6種,可見選取順序是a,b,a這樣的順序,也就是繞a軸旋轉某角度后,繞新生成的b軸旋轉一個角度,最后繞兩次旋轉以后的a軸再旋轉一個角度,以此表示最終的方向。泰特布萊恩角的旋轉軸選取有 (x, y, z), (x, z, y), (y, x, z), (y, z, x), (z, x, y), (z, y, x) 這6種,也就是歷遍笛卡爾坐標系的三軸,比如我們最常見到的Roll-Pitch-Yaw角就是其中 (x,y,z) 的情況。但這兩種方法,其實都是在空間中用最直觀的方式和最少的參數表示任意方向的通用方法。

(一)zxz順序歐拉角

如下圖所示。設定xyz-軸為參考系的參考軸XYZ-軸為物體上的坐標系軸。稱xy-平面與XY-平面的相交為交點線,用英文字母(N)代表。zxz順規的歐拉角可以靜態地這樣定義

 

α 是x-軸與交點線的夾角,

β 是z-軸與Z-軸的夾角,

γ 是交點線與X-軸的夾角。

(可以證明Z,z軸與N是垂直的)

對於夾角的順序和標記,夾角的兩個軸的指定,並沒有任何常規。不同的作者會用不同組合的歐拉角來描述,或用不同的名字表示同樣的歐拉角。因此,使用歐拉角前,必須先做好明確的定義。

這個過程中新生成的坐標系 \left(\begin{matrix}X \\Y \\Z\end{matrix}\right) 可以通過運算由原坐標系 \left(\begin{matrix}x \\y \\z\end{matrix}\right) 得到:

\left(\begin{matrix}X \\Y \\Z\end{matrix}\right) = M\left(\begin{matrix}x \\y \\z\end{matrix}\right)

其中,矩陣M表示了上面三次旋轉的總過程。我們簡單推一下:

M = Rot(z,\alpha)\cdot Rot(x,\beta)\cdot Rot(z,\gamma) = \left( \begin{matrix}cos\gamma&sin\gamma&0\\-sin\gamma&cos\gamma&0 \\0&0&1\end{matrix}\right)\left(\begin{matrix}1&0&0\\0&cos\beta&sin\beta \\0&-sin\beta&cos\beta\end{matrix}\right)\left( \begin{matrix}cos\alpha&sin\alpha&0\\-sin\alpha&cos\alpha&0 \\0&0&1\end{matrix}\right)

M = \left(\begin{matrix} cos\alpha cos\gamma-sin\alpha cos\beta sin\gamma &sin\alpha cos\gamma+cos\alpha cos\beta sin\gamma & sin\beta sin\gamma\\ -cos\alpha sin\gamma-sin\alpha cos\beta cos\gamma &-sin\alpha sin\gamma+cos\alpha cos\beta cos\gamma& sin\beta cos\gamma\\ sin\alpha sin\beta & -cos\alpha sin\beta& cos\beta \end{matrix}\right)


以上歐拉角  (z,x,z) 的情況。
  用歐拉角表示方向(或者說,方向變換)只需要用到三個參數,即三個旋轉角度(因為坐標軸是旋轉軸,所以不用增加特別的參數描述旋轉軸),這樣做有一個非常大的優點,就是表述清晰易懂。但隨之而來的有一個很重要的問題,簡單來說就是,當給定了歐拉角以后,我們很容易找到歐拉角表述的方向,但是當我們獲得了一個方向以后,卻不一定能唯一寫出目標歐拉角來描述旋轉,三維空間中的任意一個方向都可以通過至少兩種不同歐拉角表示。比如說(0,0,0)和(1,0,-1)在以上歐拉角選取順序上,是表示同一個目標方向。

(二)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軸旋轉的角度。

                                                                                                  

  現在我們如果想實現一個旋轉,只要依次繞三個軸轉對應的角度就可以實現。但是由於 萬向節死鎖的問題,簡單的說就是一旦選擇±90°作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了一個表示維度。比如說(5,90,10)與(1,90,14)表示相同的方向,此時繞X軸旋轉與繞Z軸旋轉沒有區別。我們獲得一個方向后不一定能得到確定的歐拉角來描述它。所以在通常有關旋轉的應用場景中基本不使用歐拉角來旋轉,而使用四元數Quaternion,因為四元數可以實現平滑插值。
  

(三)歐拉角萬向鎖效應

在游戲中,當角色旋轉的動畫觸發時,角色就會做一系列連續的旋轉變換,每一個變換都要用一組歐拉角來表示,但是不可能吧每一個方位的歐拉角都存儲起來,因此動畫師定義了一系列關鍵幀,指定關鍵幀處角色的方位(用一組歐拉角描述),然后計算機根據時間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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM