三維幾何中的旋轉表示:四元數、歐拉角和旋轉矩陣


在三維幾何中,有三種用於表示旋轉的方式,它們分別是四元數、歐拉角和旋轉矩陣。本文將對它們的概念以及運算進行講解。

本文全部基於左手坐標系進行討論。

歐拉角

歐拉角用三個角度來描述物體的旋轉,這三個角度又被稱為roll-pitch-yaw,它們分別代表着物體繞z、x和y軸進行的旋轉,其中roll又被稱為bank,yaw又被稱為heading。通過將三個軸的旋轉組合起來,就可以得到最終的旋轉結果。因此,不同的旋轉順序所得到的的結果是不同的,這一點需要萬分注意。

為了避免歐拉角給定方位的表達式不唯一的問題,我們將歐拉角的數值限制在一定范圍以內,稱作限制歐拉角。一般將heading和bank限定在[-180,180]度之間,pitch限制在[-90,90]度之間;為了避免萬向鎖問題,規定萬向鎖情況下由heading完成繞豎直軸的全部旋轉,也就是在限制歐拉角下,如果pitch為+90或-90,則bank為零。

關於萬向鎖可以參考這篇文章:

https://blog.csdn.net/qq_35957011/article/details/77188036

另外,根據歐拉角對物體進行旋轉時,需要考慮所繞的軸是內在(intrinsic)的還是外在(extrinsic)的,“內在”的意思是繞着世界坐標系的坐標軸進行旋轉;“外在”的意思是繞着物體本身局部坐標系的坐標軸進行旋轉(前提是在旋轉前物體自身的坐標系與世界坐標軸是一致的)。需要注意的一點是,如果是外在旋轉的話,相當於按相反順序的軸用內在的方式進行旋轉。也就是說如果是讓該物體繞自身坐標系按xyz軸的順序旋轉,則相當於將該物體按世界坐標系按zyx軸旋轉。

四元數

相比於歐拉角,四元數采用四個數值來表達物體的旋轉,一般記為[x,y,z,w],代表了復數w+xi+yj+zk。可以利用它來代表旋轉:設物體的方位為繞着n軸旋轉θ角度,則可設:[x,y,z,w] = [sin(θ/2)nx,sin(θ/2)ny,sin(θ/2)nz,cos(θ/2)]。這樣就可以表達旋轉了,我們設這樣的四元數為q

四元數有它自己的旋轉公式:

(1)

根據四元數表達旋轉的意義可知,q和-q所代表的的實際角位移是相等的。

設單位四元數為[0,0,0,1],任意四元數q乘以單位四元數均為它本身;若乘以[0,0,0,-1]則得到-q

假設知道了一個三維頂點(x,y,z)和代表旋轉的四元數q,我們可以用四元數乘法來計算出按照q旋轉后的點p'

p' = qpq-1

其中p=[x,y,z,0], p'為四維向量,且q的旋轉軸必須是單位向量

四元數乘法可以連接多次旋轉。舉個例子,設兩個四元數a和b,先進行a旋轉再進行b旋轉等價於進行ba所代表的旋轉。

相比於歐拉角,四元數有一個特別的優點:可以很方便地做兩個四元數之間的插值,該插值算法叫做slerp插值(Spherical Linear Interpolation)。在這里我們隱去推導過程,直接上公式:

        (2) 

其中t代表插值的比例,ω代表兩個四元數之間的夾角(可以通過點乘計算得出)。為了防止出現數值誤差,當sinω非常小時可以直接使用簡單的線性插值。

旋轉矩陣

除了四元數和歐拉角,也可用矩陣的形式來代表旋轉。一般3*3的矩陣就可以表示3維空間中任意的旋轉了。

設旋轉軸為(x,y,z),旋轉角度為θ,我們設c=cosθ,s=sinθ,那么可以得到繞任意軸的旋轉矩陣:

       (3)

繞着單個軸的旋轉矩陣如下:

(4)

歐拉角、四元數和旋轉矩陣之間的轉換

歐拉角轉換到旋轉矩陣

歐拉角轉換到旋轉矩陣的方法比較簡單,直接上旋轉矩陣的疊加就可以,這里列出內在形式下按照zxy軸順序的計算公式:

  (5)

旋轉矩陣轉換到歐拉角

從旋轉矩陣轉換到歐拉角需要注意將roll、pitch、bank限定在限制歐拉角的范圍以內。假設要通過上一小節的旋轉矩陣推導出zxy軸內在形式下的歐拉角,可以這么去做:

設上一小節推導出的矩陣為M,M(1,1)代表矩陣最左上角的項,那么首先可以得到pitch = asin(-M(3,2))。(直接調用C語言內置的函數,范圍正好在[-90°,90°]之間)

如果|pitch|為90°,那么按照限定歐拉角的做法,roll此時為0, yaw = atan2(-M(1,3), M(1, 1)) (利用C語言內置的atan2函數,正好可以將范圍限制在[-180°,180°]之間)

如果|pitch|不是90°,我們可以推導roll和yaw為:

roll = atan2(M(1, 2), M(2, 2))
yaw = atan2(M(3, 1), M(3, 3))

如果是外在或者其他坐標軸的順序,推導方法也是大同小異。

四元數轉換到旋轉矩陣

四元數中記載了旋轉軸和旋轉角度,那么我們可以通過這些信息根據公式(3)推導出旋轉矩陣。

但其實還是有更直接的推導方式,在這里給出結論,已知四元數(x,y,z,w),我們可以得到旋轉矩陣:

(6)

旋轉矩陣轉換到四元數

想將旋轉矩陣轉換為四元數,可以檢查相對於對角線的對稱位置上元素的和與差:

(7)

然后可以先用對角線元素和/差的平方根解得四個值中的一個,就能用公式(7)去計算其他三個:

(8)

那么應當用這四種解法中的哪一個呢?Shoemake建議取計算出的w,x,y,z最大的一個(不必解平方根),然后再計算出其他三個,這樣可以避免由於分母太小導致的數值不穩定問題。

這種方法不用在意求解的平方根的正負,因為四元數q和-q在旋轉方位上是等價的。

歐拉角轉換到四元數

從歐拉角轉換到四元數,可以將歐拉角的三個旋轉都轉換為四元數,然后將這三個四元數連接為一個四元數即可。

四元數轉換到歐拉角

 通過旋轉矩陣轉換到歐拉角的過程,可以得:

(9)

而已知:

M(3,2) = 2yz - 2wx

M(1,2) = 2xy + 2wz

M(2,2) = 1 - 2x^2 - 2z^2

M(3,1) = 2xz + 2wy

M(3,3) = 1 - 2x^2 - 2y^2

M(1,3) = 2xz - 2wy

M(1,1) = 1 - 2y^2 - 2z^2

帶入(9)中可得:

(10)

參考文獻:《3D數學基礎:圖形與游戲開發》 第10章

 


免責聲明!

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



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