四元素與旋轉矩陣

2021-07-10 08:53:26 字數 4147 閱讀 4662

如何描述三維空間中剛體的旋轉,是個有趣的問題。具體地說,就是剛體上的任意乙個點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空間的向量,它...