在我們的3D數(shù)學(xué)中茂装,如果使用矩陣來旋轉(zhuǎn)的話就會顯得十分的復(fù)雜和笨拙怠蹂。計算中使用最為廣泛的旋轉(zhuǎn)方式為歐拉角善延。
??歐拉角用三個旋轉(zhuǎn)角表示3D空間中的方位和旋轉(zhuǎn)(角位移),這三個旋轉(zhuǎn)角都是繞著三個相互垂直的坐標軸旋轉(zhuǎn)(可以是世界坐標系也可以是局部坐標系)同時也是計算機最能理解和高效的旋轉(zhuǎn)方式城侧。
??heading-pitch-bank分別對應(yīng)著三個相互垂直的軸向易遣。
heading:垂直向上的是heading角(yaw)(笛卡爾的y軸),控制3D中的左右旋轉(zhuǎn)嫌佑。
pitch角:繞x軸旋轉(zhuǎn)時pitch角豆茫,控制著物體在3D中的上下旋轉(zhuǎn)。
- bank(roll):z軸屋摇。
3D中的經(jīng)過旋轉(zhuǎn)變換澜薄,就會旋轉(zhuǎn)到一個新的方位,旋轉(zhuǎn)前后所形成的夾角稱為旋轉(zhuǎn)角(也叫角位移)從上圖可以看出使用歐拉角可以輕松的控制物體的旋轉(zhuǎn)摊册,無論物體在哪只需要控制它三個軸的旋轉(zhuǎn)角就可以完成旋轉(zhuǎn)肤京。
相較于旋轉(zhuǎn)矩陣的復(fù)雜變換,歐拉角輕巧明了茅特。但是歐拉角也有需要缺點比如:無法使用歐拉角進行插值運算(如果你想進行插值需要先將歐拉角轉(zhuǎn)換為矩陣或者四元數(shù))忘分,還有萬向鎖現(xiàn)象。
萬向鎖:
萬向鎖是歐拉角最大的缺點白修,歐拉角在插值過程中很容易碰見萬向鎖現(xiàn)象妒峦。為什么會出現(xiàn)萬向鎖現(xiàn)象呢?
??萬向鎖:因為我們的歐拉角旋轉(zhuǎn)是通過3個旋轉(zhuǎn)角來控制的兵睛,但是這些旋轉(zhuǎn)并不是同時進行的肯骇。它們是具有先后的順序的。
比如我們來看看unity中的歐拉角旋轉(zhuǎn)順序:
我們可以看出unity中的歐拉角是按照先旋轉(zhuǎn)z軸祖很,在旋轉(zhuǎn)x軸笛丙,最后旋轉(zhuǎn)y軸的順序來進行的,所以它們是具有旋轉(zhuǎn)順序的假颇,而這個順序也是非常重要的胚鸯。
??當(dāng)我們旋轉(zhuǎn),由于旋轉(zhuǎn)是有先后順序笨鸡,它們的三個軸向就存在著父子級關(guān)系姜钳。(如z軸為父級,那z軸旋轉(zhuǎn)時會帶動x軸形耗,x軸旋轉(zhuǎn)時則不會影響z軸)哥桥,此時問題就發(fā)生了,如果x軸旋轉(zhuǎn)了正負90度激涤,那它很有可能就和z軸重合了拟糕。z軸在進行旋轉(zhuǎn)時,就會帶動x軸也旋轉(zhuǎn),這時就產(chǎn)生了萬向鎖現(xiàn)象已卸。
??老外講解萬向鎖的視頻:講得十分的棒!硼一。
http://v.youku.com/v_show/id_XNjk1MTkzMTM2.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0
萬向鎖的解決方案:
- 使用歐拉角轉(zhuǎn)化為四元數(shù)進行插值累澡。
- 改變?nèi)齻€軸的旋轉(zhuǎn)次序(我目前就只能理解這個解決方案)
程序中的歐拉角使用3x3的旋轉(zhuǎn)矩陣(RotationMatrix)來表示由于它是繞著三個相互垂直的軸向進行旋轉(zhuǎn),所以在旋轉(zhuǎn)變換的時候般贼,需要考慮將物體坐標系到世界坐標系的轉(zhuǎn)化過程:
- 3x3的旋轉(zhuǎn)矩陣: