旋轉變換
旋轉變換最為直觀的表示方法是「軸-角」:繞著某乙個過原點軸,旋轉某一角度。
軸可以用乙個單位長度的點[w1,w2,w3][w1,w2,w3]表示:原點到該點的射線即為此軸。
使用右手座標系,拇指指向軸方向,四指方向即為旋轉的方向。
乙個旋轉變換可以用用尤拉角、四元數或者旋轉矩陣表示。以下討論不同表示方法之間的關係,以及旋轉變換的合成、取逆等操作。
旋轉矩陣
旋轉可以看做一種特殊的座標變換,而座標變換可以用用3×33×3矩陣rr來表示。對乙個座標施加旋轉的結果是x′=rxx′=rx。
旋轉矩陣可以在不同座標系之間進行變換,但不能進行「反演」,即不能在左手系和右手系之間進行變換。
旋轉矩陣是正交矩陣,即|r|=1|r|=1,旋轉變換不改變向量的長度。
尤拉角的物理意義
任何乙個旋轉可以表示為依次繞著三個旋轉軸旋三個角度的組合。這三個角度稱為尤拉角。
三個軸可以指固定的世界座標系軸,也可以指被旋轉的物體座標系的軸。三個旋轉軸次序不同,會導致結果不同。
本文中提到的尤拉角指:繞著世界座標系的x,y,z軸,依次旋轉的結果。其取值範圍如下:
θx∈(−π,π),θy∈(−π2,π2),θz∈(−π,π)
θx∈(−π,π),θy∈(−π2,π2),θz∈(−π,π)
尤拉角→→旋轉矩陣
單獨繞乙個軸旋轉θθ角度的旋轉矩陣為:
如果依次繞x軸、y軸、z軸旋轉,該變換的旋轉矩陣為:
r=rz⋅ry⋅rx
r=rz⋅ry⋅rx
記三個軸尤拉角的正弦和余弦函式為sx,cx,sy,cy,sz,czsx,cx,sy,cy,sz,cz。使用matlab的syms功能可以輕鬆推導旋轉矩陣rr:
⎡⎣⎢cyczcysz−syczsxsy−cxszcxcz+sxsyszcysxsxsz+cxczsycxsysz−czsxcxcy⎤⎦⎥
[cyczczsxsy−cxszsxsz+cxczsycyszcxcz+sxsyszcxsysz−czsx−sycysxcxcy]
旋轉矩陣→→尤拉角
設旋轉矩陣i行j列元素為rijrij。根據旋轉矩陣的表示式,利用三角函式可以推導出尤拉角取值:
θx=atan2(r32,r33)
θx=atan2(r32,r33)
θy=atan2(−r31,r232+r233−−−−−−−√)
θy=atan2(−r31,r322+r332)
θz=atan2(r21,r11)
θz=atan2(r21,r11)
四元數的物理意義
設有乙個通過原點[0,0,0][0,0,0]的旋轉軸,該軸上單位長度的點為[w1,w2,w3][w1,w2,w3]。繞此軸旋轉θθ角的變換可以用乙個向量表示:
[cosθ2,w1sinθ2,w2sinθ2,w3sinθ2]
[cosθ2,w1sinθ2,w2sinθ2,w3sinθ2]
也記為q=[q0,q1,q2,q3]q=[q0,q1,q2,q3],或者q=q0+q1i+q2j+q3kq=q0+q1i+q2j+q3k。四元數的模長為1:
q20+q21+q22+q23=cos2θ2+sin2θ2(w21+w22+w33)=cos2θ2+sin2θ2=1
q02+q12+q22+q32=cos2θ2+sin2θ2(w12+w22+w33)=cos2θ2+sin2θ2=1
四元數→→旋轉矩陣
⎡⎣⎢⎢1−2q22−2q232q1q2+2q3q02q1q3−2q2q02q1q2−2q3q01−2q21−2q232q2q3+2q1q02q1q3+2q2q02q2q3−2q1q01−2q21−2q22⎤⎦⎥⎥
[1−2q22−2q322q1q2−2q3q02q1q3+2q2q02q1q2+2q3q01−2q12−2q322q2q3−2q1q02q1q3−2q2q02q2q3+2q1q01−2q12−2q22]
旋轉矩陣→→四元數
如果r11,r22,r33r11,r22,r33中,r11r11最大:
s=1+r11−r22−r33−−−−−−−−−−−−−−−√
s=1+r11−r22−r33
q0=r32−r23s
q0=r32−r23s
q1=s/4
q1=s/4
q2=r12+r21s
q2=r12+r21s
q3=r21+r12s
q3=r21+r12s
如果r11,r22,r33r11,r22,r33中,r22r22最大:
s=1−r11+r22−r33−−−−−−−−−−−−−−−√
s=1−r11+r22−r33
q0=r13−r31s
q0=r13−r31s
q1=r12+r21s
q1=r12+r21s
q2=s/4
q2=s/4
q3=r23+r32s
q3=r23+r32s
如果r11,r22,r33r11,r22,r33中,r33r33最大:
s=1−r11−r22+r33−−−−−−−−−−−−−−−√
s=1−r11−r22+r33
q0=r21−r12s
q0=r21−r12s
q1=r13+r31s
q1=r13+r31s
q2=r23−r32s
q2=r23−r32s
q3=s/4
q3=s/4
變換的逆
使用尤拉角表示時,必須顛倒三個旋轉軸的順序,同時對旋轉角度取反。
使用旋轉矩陣表示時,求矩陣的逆即可:r∗=r−1r∗=r−1。
使用四元組表示時,考慮其物理意義,對後三位取反即可:q−1=[q0,−q1,−q2,−q3]q−1=[q0,−q1,−q2,−q3]。
向量的叉乘
接下去討論之前,需要先複習向量的叉乘。
三維空間中的乙個點可以表示為向量[xi,yj,zk][xi,yj,zk],其中i,j,ki,j,k是三個座標軸:[1,0,0],[0,1,0],[0,0,1][1,0,0],[0,1,0],[0,0,1]。
兩個向量a,ba,b叉乘的結果是乙個向量,其長度為|a||b|sinθ|a||b|sinθ。θθ表示從向量aa到bb的小於180°的角度。其方向垂直於a,ba,b所在平面,遵循右手定則:四指從aa轉向bb,拇指方向為叉乘結果方向。
四元組作為一種向量,其叉乘涉及到虛數單位的乘法,遵循以下原則:
i×i=−1
i×i=−1
i×j=−j×i
i×j=−j×i
i×j=k,j×k=i,k×i=j
i×j=k,j×k=i,k×i=j
叉乘滿足反交換律:
a×b=−b×a
a×b=−b×a
聯想叉乘的物理意義:交換了a,ba,b順序,則拇指方向反轉。
叉乘滿足加法分配律:
(a+b)×c=a×c+b×c
(a+b)×c=a×c+b×c
特別要注意,叉乘不滿足結合律:
(a×b)×c≠a×(b×c)
(a×b)×c≠a×(b×c)
四元數的叉乘
四元數既不是向量也不是標量。可以看做乙個標量q0q0和乙個三維向量[q1,q2,q3][q1,q2,q3]的結合體:q=q0+q1i+q2j+q3kq=q0+q1i+q2j+q3k。
兩個四元數a1+a2i+a3j+a4ka1+a2i+a3j+a4k,b1+b2i+b3j+b4kb1+b2i+b3j+b4k,相乘的結果q=a×bq=a×b:
q0=a1b1−a2b2−a3b3−a4b4
q0=a1b1−a2b2−a3b3−a4b4
q1=a1b2+a2b1+a3b4−a4b3
q1=a1b2+a2b1+a3b4−a4b3
q2=a1b3−a2b4+a3b1+a4b2
q2=a1b3−a2b4+a3b1+a4b2
q3=a1b4+a2b3−a3b2+a4b1
q3=a1b4+a2b3−a3b2+a4b1
四元數叉乘不滿足交換律、結合律。
變換的組合
使用尤拉角表示時,很難直接組合兩個變換。
使用旋轉矩陣表示時,依次做矩陣相乘即可:r=r2r1r=r2r1。
使用四元組表示時,需要對兩個四元組叉乘:q=q2×q1q=q2×q1。
注意,先發生的變換要放在乘號右側。
由於叉乘不滿足結合律,當有一系列變化q1,q2,q3...q1,q2,q3...陸續發生時,要用括號保證乘法發生的順序:
q=q4×(q3×(q2×q1))
q=q4×(q3×(q2×q1))
使用四元數
首先把待旋轉的點(x,y,z)(x,y,z)表示成四元數形式:p=[0,x,y,z]p=[0,x,y,z]。這裡的四元數不再表示乙個旋轉,所以模長不一定為1。
對該點pp施加旋轉變換qq,通過四元組的兩次叉乘實現:p′=q×p×q−1=[0,x′,y′,z′]p′=q×p×q−1=[0,x′,y′,z′]。
OSG 旋轉矩陣和四元素 尤拉角
osg中需要對節點進行旋轉,是通過matrixtransform節點來進行。osg在描述旋轉時候一般通過osg matrix來描述。比如 osg vec3d pt 10,0,0 通過乘法可以進行對點的旋轉。pt pt matrix matrix 裡面除了含有旋轉,還包含了縮放,平移 它的含義如下 1...
四元素與旋轉矩陣
如何描述三維空間中剛體的旋轉,是個有趣的問題。具體地說,就是剛體上的任意乙個點p x,y,z 圍繞過原點的軸 i,j,k 旋轉 求旋轉後的點p x y z 旋轉矩陣乘以點p的齊次座標,得到旋轉後的點p 因此旋轉矩陣可以描述旋轉,x y z 1 r xy z1 繞x,y,或z軸旋轉 的矩陣為 r x ...
旋轉矩陣 尤拉角 四元數比較
旋轉矩陣 尤拉角 四元數主要用於 向量的旋轉 座標系之間的轉換 角位移計算 方位的平滑插值計算。旋轉矩陣 尤拉角 四元數比較 不同的方位表示方法適用於不同的情況。下面是我們對合理選擇格式的一些建議 1.尤拉角最容易使用。當需要為世界中的物體指定方位時,尤拉角能大大的簡化人機互動,包括直接的鍵盤輸入方...