(轉)歐拉角與萬向節死鎖


自:http://www.cnitblog.com/luckydmz/archive/2010/09/07/68674.html

 

首先來看一下什么是歐拉角(Euler angles)?
構件在三維空間中的有限轉動,可依次用三個相對轉角表示,即進動角、章動角和自旋角,這三個轉角統稱為歐拉角。——引自百度百科
萊昂哈德·歐拉用歐拉角來描述剛體在三維歐幾里得空間的取向。對於任何一個參考系,一個剛體的取向,是依照順序,從這參考系,做三個歐拉角的旋轉而設定的。所以,剛體的取向可以用三個基本旋轉矩陣來決定。換句話說,任何關於剛體旋轉的旋轉矩陣是由三個基本旋轉矩陣復合而成的。——引自wikipedia

好了,引完了,我來說一下我的理解吧,歐拉角是對旋轉的一種刻畫方式,就像其他刻畫方式一樣如旋轉矩陣,四元數。歐拉角對應的旋轉矩陣可以看作是三個繞軸旋轉的旋轉矩陣的復合。
問題來了,三個繞軸旋轉的旋轉矩陣繞的是什么坐標系下的軸?
對於坐標系E下的歐拉角(α,β,r)和以下哪個旋轉矩陣是等價的
1.繞坐標系E下的x軸旋轉α,繞坐標系E下的y軸旋轉β,繞坐標系E下的z軸旋轉r,三個矩陣的復合
2.繞坐標系E下的x軸旋轉α,繞 坐標系E在繞x軸旋轉α后的新系E'下的y軸旋轉β,繞 坐標系E'在繞y軸旋轉β后的新系E''下的z軸旋轉r,三個矩陣的復合
通俗的講,我們在旋轉時,要不要把坐標系一起轉動?
事實上兩種理解都可以,當然,兩種轉法並不等價,下面我來解釋這個問題,
當我們講到坐標系E下的歐拉角(α,β,r)時,這句話是有歧義的,我們必須定義旋轉順序,因為旋轉順序會影響旋轉結果。
如果假設旋轉順序是先繞x軸再y軸再z軸,x-y-z,那么這個歐拉角對應的旋轉矩陣是指上述的2所表示的旋轉矩陣。
如果假設旋轉順序是先繞z軸再y軸再x軸,z-y-x,那么這個歐拉角對應的旋轉矩陣是指上述的1所表示的旋轉矩陣,等等,你肯定會問,這難道不是把2中的先后順序換一下就行了嗎,"繞坐標系E下的z軸旋轉r,繞 坐標系E在繞z軸旋轉r后的新系E'下的y軸旋轉β,繞 坐標系E'在繞y軸旋轉β后的新系E''下的x軸旋轉α,三個矩陣的復合"難道不是這樣嗎?是的,當然也是這樣。

下面我來證明兩種復合方式是相等的,
為了方便證明我先定義一些記號,
記:
繞坐標系E下的x軸旋轉α的旋轉矩陣為Rx,
繞坐標系E下的y軸旋轉β的旋轉矩陣為Ry,
繞坐標系E下的z軸旋轉r的旋轉矩陣為Rz,

繞坐標系E下的z軸旋轉r的旋轉矩陣為Rr(Rr=Rz),
繞 坐標系E在繞z軸旋轉r后的新系E'下的y軸旋轉β的旋轉矩陣為Rb,
繞 坐標系E'在繞y軸旋轉β后的新系E''下的x軸旋轉α的旋轉矩陣為Ra,

另外,將矩陣R的逆記作R~

求證:Rx*Ry*Rz = Rr*Rb*Ra

證明:
Rr = Rz  定義就是一樣的,顯然相等

Rb = Rr~*Ry*Rr 要得到繞 坐標系E在繞z軸旋轉r后的新系E'下的y軸旋轉β的旋轉矩陣為Rb,可以先應用Rr~這時可以視作在E下,然后使用E下的旋轉Ry繞舊的y軸旋轉,在應用Rr轉回到E'

Ra = (Rr*Rb)~*Rx*(Rr*Rb) 理由同上

所以 右邊=Rr*Rb * Ra
         =Rr*Rb * (Rr*Rb)~*Rx*(Rr*Rb)
         =(Rr*Rb)* (Rr*Rb)~*Rx*(Rr*Rb)
         =Rx*(Rr*Rb)
         =Rx*(Rr*Rr~*Ry*Rr)
         =Rx*Ry*Rz =左邊 
#證畢

這與DirectX在文檔中對D3DXMatrixRotationYawPitchRoll的描述是一致的

D3DXMATRIX * D3DXMatrixRotationYawPitchRoll(
  D3DXMATRIX *pOut,
  FLOAT Yaw,     //繞y軸的轉動角
  FLOAT Pitch,   //繞x軸的轉動角
  FLOAT Roll     //繞z軸的轉動角
);

The order of transformations is roll first, then pitch, then yaw. Relative to the object's local coordinate axis, this is equivalent to rotation around the z-axis, followed by rotation around the x-axis, followed by rotation around the y-axis.



關於歐拉角講到這里就差不多了,下面來探討一個和歐拉角有關的概念萬向節死鎖。

講到歐拉角一般都會提到萬向節死鎖,什么是萬向節死鎖(Gimbal Lock)呢?
萬向節死鎖有時又被簡稱為萬向節鎖或者萬向鎖,是指當三個萬向節其中兩個的軸發生重合時,會失去一個自由度的情形。
下面的視頻很好的說明了這一點。



正因萬向節死鎖的存在,使用歐拉角是無法實現球面平滑插值的,

如上圖,此時如果下一幀要讓箭頭指向右側后方,那么綠色和藍色對應的旋轉角必定要發生突變,因為目前如果想朝着垂直紅色圈的方向旋轉箭頭就像被卡住一樣,我想這就是叫它死鎖的原因吧。
總之萬向節死鎖會導致位置上連續變化 在數值表示上確是非連續的。給定的兩個關鍵幀之間無法平滑過渡。順便提一下解決方法,可以使用四元數球面線性插值(Slerp)


免責聲明!

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



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