自: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軸的轉動角
);
關於歐拉角講到這里就差不多了,下面來探討一個和歐拉角有關的概念萬向節死鎖。
講到歐拉角一般都會提到萬向節死鎖,什么是萬向節死鎖(Gimbal Lock)呢?
萬向節死鎖有時又被簡稱為萬向節鎖或者萬向鎖,是指當三個萬向節其中兩個的軸發生重合時,會失去一個自由度的情形。
下面的視頻很好的說明了這一點。
正因萬向節死鎖的存在,使用歐拉角是無法實現球面平滑插值的,
如上圖,此時如果下一幀要讓箭頭指向右側后方,那么綠色和藍色對應的旋轉角必定要發生突變,因為目前如果想朝着垂直紅色圈的方向旋轉箭頭就像被卡住一樣,我想這就是叫它死鎖的原因吧。
總之萬向節死鎖會導致位置上連續變化 在數值表示上確是非連續的。給定的兩個關鍵幀之間無法平滑過渡。順便提一下解決方法,可以使用四元數球面線性插值(Slerp)