如何描述三維空間中剛體的旋轉,是個有趣的問題。具體地說,就是剛體上的任意乙個點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(θ)
=⎡⎣⎢⎢10
00cosθ
sinθ0−
sinθ
cosθ
⎤⎦⎥⎥
ry(θ)
=⎡⎣⎢⎢
cosθ
0sinθ0
10−sinθ0
cosθ
⎤⎦⎥⎥
rz(θ)
=⎡⎣⎢⎢
cosθ
sinθ0−
sinθ
cosθ00
01⎤⎦⎥⎥
所以,繞任意軸旋轉的矩陣為 r
x(−p
)⋅ry
(−q)
⋅rz(
θ)⋅r
y(q)
⋅rx(
p)這表示:
1. 繞x軸旋轉角度p使指定的旋轉軸在xz平面上
2. 繞y軸旋轉角度q使指定的旋轉軸與z軸重合
3. 繞z軸旋轉角度θ
4. 繞y軸旋轉角度-q
5. 繞x軸旋轉角度-p
其中,p和q的值需要用i,j,k計算出來。
尤拉角也可以描述三維剛體旋轉,它將剛體繞過原點的軸(i,j,k)旋轉θ,分解成三步(藍色是起始座標系,而紅色的是旋轉之後的座標系。)。
1. 繞z軸旋轉α,使x軸與n軸重合,n軸是旋轉前後兩個座標系x-y平面的交線
2. 繞x軸(也就是n軸)旋轉β,使z軸與旋轉後的z軸重合
3. 繞z軸旋轉γ,使座標系與旋轉後的完全重合
按照旋轉軸的順序,該組尤拉角被稱為是「zxz順規」的。對於順規的次序,學術界沒有明確的約定。
尤拉角的旋轉矩陣為: r
z(α)
⋅rx(
β)⋅r
z(γ)
在旋轉矩陣一節中,最先進行的旋轉其矩陣在最右側,說明該矩陣最先與點的齊次座標相乘,旋轉矩陣按照旋轉的次序從右向左排列。而在尤拉角中,最先進行的旋轉其旋轉矩陣在最左邊。這是因為,**對於前者(旋轉矩陣),我們始終是以絕對參考係為參照來的,對於後者(尤拉角),我們每一次旋轉的刻畫都是基於剛體的座標系。**比如,在尤拉角中的第2步,繞x軸旋轉β,這裡的x軸實際上是n軸了(而不是藍色的x軸)。
為什麼旋轉參考係的不同會導致旋轉矩陣次序的差異呢?細想一下便知,旋轉矩陣左乘疊加用以描述三維變換效果的疊加,這本身就是基於絕對座標系的,所以旋轉矩陣一節沒有疑問;而對於尤拉角一節的這種旋轉方式,這樣考慮:
1. 如果有乙個「影子座標系3」與原座標系重合,然後首先進行了第3步(繞z軸旋轉γ);
2. 然後有乙個「影子座標系2」也與原座標系重合,然後與「影子座標系3」一起(視作同乙個剛體)進行了第二步;
3. 最後乙個「影子座標系1」,與前兩個座標系一起進行了第一步。
此時,考察「影子座標系」1和2,他們就分別落在了尤拉角旋轉的兩個「快照」上,而「影子座標系3」就落在旋轉後的位置上(紅色的)。而在上述過程中,「影子座標系3」就是相對於絕對座標系依次進行了第三步,第二步,和第一步。所以尤拉角的旋轉矩陣寫成那樣,也是行得通的。
這個想法,我猜在很多第一人稱遊戲中,已經得到了廣泛應用了。這樣,玩家對人物的控制就可以繞開人物的實時狀態(位置,角度等)直接對人物的模型矩陣產生影響。
萬向節死鎖是尤拉角的乙個弊端,這是乙個直觀的例子。
四元數是今天的主角,它能夠很方便的刻畫剛體繞任意軸的旋轉。四元數是一種高階複數,四元數q表示為: q
=(x,
y,z,
w)=x
i+yj
+zk+
w其中,i,j,k滿足: i
2=j2
=k2=
−1 i
j=k,
jk=i
,ki=
j由於i,j,k的性質和笛卡爾座標系三個軸叉乘的性質很像,所以可以將四元數寫成乙個向量和乙個實數組合的形式: q
=(v⃗
+w)=
((x,
y,z)
,w)可以推導出四元數的一些運算性質,包括:
* 四元數乘法 q
1q2=
(v1→
×v2→
+w1v
2→+w
2v1→
,w1w
2−v1
→⋅v2
→)* 共軛四元數 q
∗=(−
v⃗ ,w
)* 四元數的平方模 n
(q)=
n(v⃗
)+w2
* 四元數的逆 q
−1=q
∗n(q
)四元數可以看做是向量和實數的一種更加一般的形式,向量可以視作為實部為0的四元數,而實數可以是作為虛部為0的四元數。上述四元數的運算性質也是實數或向量的運算性質的更一般的形式。
四元數可用來刻畫三維空間中的旋轉,繞單位向量(x,y,z)表示的軸旋轉θ,可令: q
=((x
,y,z
)sinθ2
,cosθ2
)剛體座標系中的點p(p,0)(寫成四元數的形式),旋轉後的座標p'為: p
′=qp
q−1
接下來我們來證明這一點。
首先,我們證明qp
q−1=
(sq)
p(sq
)−1
其中s為實數。顯然 (
sq)p
(sq)
−1=s
qpq−
1s−1
=sqp
−1
此時,我們可以將q看做是單位矩陣,因為如果q不是單位矩陣,我們就可以乘以乙個常數s將其化為單位矩陣。
然後,我們證明qpq^和p的模長相等
下面將q視為單位四元數: q
−1=q
∗ 四元數q的標量: s
(q)=
(q+q
∗)/2
那麼: 2s
(qpq
−1)=
2s(q
pq∗)
=qpq
∗+(q
pq∗)
∗=qp
q∗+q
p∗q∗
=q(p
+p∗)
q∗=q
2s(p
)q∗=
2s(p
)最後,我們證明 p
′=qp
q∗
如圖所示,u為旋轉軸,旋轉角度為σ,向量v旋轉到w處。旋轉到σ/2處為k(圖中未標出)。
下面也用相同的字母指代四元數,如u就表示向量u的四元數形式((ux,uy,uz),0)。
首先,令u方向上的單位向量為u(為了方便,命名不變,後面的u都是指旋轉軸方向的單位四元數),那麼根據q的定義,參見四元數乘法法則: q
=(u⃗
sinθ2,
cosθ2)
=(v⃗
×k⃗ ,
v⃗ ⋅k
⃗ )=(
v⃗ ,0
)(−k
⃗ ,0)
=kv∗
現在令 w=
qvq∗
如果能證明w與v的夾角是σ,那麼就說明w確實是v旋轉σ得到的,整個命題就得證了。
注意v,k和w都是實部為0的單位四元數,表示單位向量,我們有: w
k∗=(
qvq−
1)k∗
=qvq
∗k∗=
qvvk
∗k∗=
q所以 w
k∗=k
v∗
上面的式子拆分成實部和虛部,虛部表明w與-k的平面和k與-v的平面重合,實部表明w和-k之間的夾角與k和-v之間的夾角相等,都是π-σ/2。這就說明了w與v的夾角是σ,原命題就得證了。
旋轉矩陣,四元素,尤拉角
旋轉變換 旋轉變換最為直觀的表示方法是 軸 角 繞著某乙個過原點軸,旋轉某一角度。軸可以用乙個單位長度的點 w1,w2,w3 w1,w2,w3 表示 原點到該點的射線即為此軸。使用右手座標系,拇指指向軸方向,四指方向即為旋轉的方向。乙個旋轉變換可以用用尤拉角 四元數或者旋轉矩陣表示。以下討論不同表示...
OSG 旋轉矩陣和四元素 尤拉角
osg中需要對節點進行旋轉,是通過matrixtransform節點來進行。osg在描述旋轉時候一般通過osg matrix來描述。比如 osg vec3d pt 10,0,0 通過乘法可以進行對點的旋轉。pt pt matrix matrix 裡面除了含有旋轉,還包含了縮放,平移 它的含義如下 1...
四元數和旋轉矩陣
quaternion 四元數 quaternion 的定義 四元數一般定義如下 q w xi yj zk 其中 w,x,y,z是實數。同時,有 i i 1 j j 1 k k 1 四元數也可以表示為 q w,v 其中v x,y,z 是向量,w是標量,雖然v是向量,但不能簡單的理解為3d空間的向量,它...