四元素與旋轉矩陣

如何描述三維空間中剛體的旋轉,是個有趣的問題。具體地說,就是剛體上的任意一個點P(x, y, z)圍繞過原點的軸(i, j, k)旋轉θ,求旋轉後的點P\'(x\', y\', z\')。

旋轉矩陣

旋轉矩陣乘以點P的齊次座標,得到旋轉後的點P',因此旋轉矩陣可以描述旋轉,

⎡⎣⎢⎢⎢⎢xyz1⎤⎦⎥⎥⎥⎥=R⎡⎣⎢⎢⎢⎢xyz1⎤⎦⎥⎥⎥⎥

繞x,y,或z軸旋轉θ的矩陣爲:

Rx(θ)=⎡⎣⎢⎢1000cosθsinθ0sinθcosθ⎤⎦⎥⎥

Ry(θ)=⎡⎣⎢⎢cosθ0sinθ010sinθ0cosθ⎤⎦⎥⎥

Rz(θ)=⎡⎣⎢⎢cosθsinθ0sinθcosθ0001⎤⎦⎥⎥

所以,繞任意軸旋轉的矩陣爲

Rx(p)Ry(q)Rz(θ)Ry(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順規”的。對於順規的次序,學術界沒有明確的約定。

歐拉角的旋轉矩陣爲:

Rz(α)Rx(β)Rz(γ)

在旋轉矩陣一節中,最先進行的旋轉其矩陣在最右側,說明該矩陣最先與點的齊次座標相乘,旋轉矩陣按照旋轉的次序從右向左排列。而在歐拉角中,最先進行的旋轉其旋轉矩陣在最左邊。這是因爲,**對於前者(旋轉矩陣),我們始終是以絕對參考系爲參照來的,對於後者(歐拉角),我們每一次旋轉的刻畫都是基於剛體的座標系。**比如,在歐拉角中的第2步,繞x軸旋轉β,這裏的x軸實際上是N軸了(而不是藍色的x軸)。

爲什麼旋轉參考系的不同會導致旋轉矩陣次序的差異呢?細想一下便知,旋轉矩陣左乘疊加用以描述三維變換效果的疊加,這本身就是基於絕對座標系的,所以旋轉矩陣一節沒有疑問;而對於歐拉角一節的這種旋轉方式,這樣考慮:

1. 如果有一個“影子座標系3”與原座標系重合,然後首先進行了第3步(繞z軸旋轉γ);
2. 然後有一個“影子座標系2”也與原座標系重合,然後與“影子座標系3”一起(視作同一個剛體)進行了第二步;
3. 最後一個“影子座標系1”,與前兩個座標系一起進行了第一步。

此時,考察“影子座標系”1和2,他們就分別落在了歐拉角旋轉的兩個“快照”上,而“影子座標系3”就落在旋轉後的位置上(紅色的)。而在上述過程中,“影子座標系3”就是相對於絕對座標系依次進行了第三步,第二步,和第一步。所以歐拉角的旋轉矩陣寫成那樣,也是行得通的。

這個想法,我猜在很多第一人稱遊戲中,已經得到了廣泛應用了。這樣,玩家對人物的控制就可以繞開人物的實時狀態(位置,角度等)直接對人物的模型矩陣產生影響。

萬向節死鎖是歐拉角的一個弊端,這是一個直觀的例子

四元數

四元數是今天的主角,它能夠很方便的刻畫剛體繞任意軸的旋轉。四元數是一種高階複數,四元數q表示爲:

q=(x,y,z,w)=xi+yj+zk+w

其中,i,j,k滿足:

i2=j2=k2=1

ij=k,jk=i,ki=j

由於i,j,k的性質和笛卡爾座標系三個軸叉乘的性質很像,所以可以將四元數寫成一個向量和一個實數組合的形式:

q=(v⃗ +w)=((x,y,z),w)

可以推導出四元數的一些運算性質,包括:

* 四元數乘法

q1q2=(v1×v2+w1v2+w2v1,w1w2v1v2)

* 共軛四元數

q=(v⃗ ,w)

* 四元數的平方模

N(q)=N(v⃗ )+w2

* 四元數的逆

q1=qN(q)

四元數可以看做是向量和實數的一種更加一般的形式,向量可以視作爲實部爲0的四元數,而實數可以是作爲虛部爲0的四元數。上述四元數的運算性質也是實數或向量的運算性質的更一般的形式。

四元數可用來刻畫三維空間中的旋轉,繞單位向量(x,y,z)表示的軸旋轉θ,可令:

q=((x,y,z)sinθ2,cosθ2)

剛體座標系中的點p(P,0)(寫成四元數的形式),旋轉後的座標p'爲:

p=qpq1

接下來我們來證明這一點。

首先,我們證明

qpq1=(sq)p(sq)1

其中s爲實數。顯然

(sq)p(sq)1=sqpq1s1=sqp1

此時,我們可以將q看做是單位矩陣,因爲如果q不是單位矩陣,我們就可以乘以一個常數s將其化爲單位矩陣。

然後,我們證明qpq^{-1}和p的模長相等

下面將q視爲單位四元數:

q1=q

四元數q的標量:

S(q)=(q+q)/2

那麼:

2S(qpq1)=2S(qpq)=qpq+(qpq)=qpq+qpq=q(p+p)q=q2S(p)q=2S(p)

最後,我們證明

p=qpq

如圖所示,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的單位四元數,表示單位向量,我們有:

wk=(qvq1)k=qvqk=qvvkk=q

所以

wk=kv

上面的式子拆分成實部和虛部,虛部表明w與-k的平面和k與-v的平面重合,實部表明w和-k之間的夾角與k和-v之間的夾角相等,都是π-σ/2。這就說明了w與v的夾角是σ,原命題就得證了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章