三維旋轉:旋轉矩陣,歐拉角,四元數

原文見個人博客主站,歡迎你們過去評論。html

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

旋轉矩陣

旋轉矩陣乘以點P的齊次座標,獲得旋轉後的點P',所以旋轉矩陣能夠描述旋轉,htm

$$\begin{bmatrix}x'\\ y'\\ z'\\ 1\end{bmatrix}=R\cdot \begin{bmatrix}x\\ y\\ z\\ 1\end{bmatrix}$$blog

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

$$R_{x}(\theta)=\begin{bmatrix}1 & 0 & 0\\ 0 & \cos\theta & -\sin\theta\\ 0 & \sin\theta & \cos\theta\end{bmatrix}$$get

$$R_{y}(\theta)=\begin{bmatrix}\cos\theta & 0 & -\sin\theta\\ 0 & 1 & 0\\ \sin\theta & 0 & \cos\theta\end{bmatrix}$$博客

$$R_{z}(\theta)=\begin{bmatrix}\cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\ 0 & 0 & 1\end{bmatrix}$$it

因此,繞任意軸旋轉的矩陣爲im

$$R_{x}(-p)\cdot R_{y}(-q)\cdot R_{z}(\theta)\cdot R_{y}(q)\cdot R_{x}(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}(α)\cdot R_{x}(β)\cdot 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)=xi+yj+zk+w$$

其中,i,j,k知足:

$$i^2=j^2=k^2=-1$$

$$ij=k,jk=i,ki=j$$

因爲i,j,k的性質和笛卡爾座標系三個軸叉乘的性質很像,因此能夠將四元數寫成一個向量和一個實數組合的形式:

$$q=(\vec{v}+w)=((x,y,z),w)$$

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

* 四元數乘法

$$q1q2=(\vec{v_1}\times \vec{v_2}+w_1\vec{v_2}+w_2\vec{v_1}, w_1w_2-\vec{v_1}\cdot \vec{v_2})$$

* 共軛四元數

$$q^*=(-\vec{v},w)$$

* 四元數的平方模

$$N(q)=N(\vec{v})+w^2$$

* 四元數的逆

$$q^{-1}=\frac{q^*}{N(q)}$$

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

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

$$q=((x,y,z)\sin{\frac{\theta}{2}},\cos{\frac{\theta}{2}})$$

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

$$p'=qpq^{-1}$$

接下來咱們來證實這一點。

首先,咱們證實

$qpq^{-1}=(sq)p(sq)^{-1}$

其中s爲實數。顯然

$$(sq)p(sq)^{-1}=sqpq^{-1}s^{-1}=sqp^{-1}$$

此時,咱們能夠將q看作是單位矩陣,由於若是q不是單位矩陣,咱們就能夠乘以一個常數s將其化爲單位矩陣。

而後,咱們證實qpq^{-1}和p的模長相等

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

$$q^{-1}=q^*$$

四元數q的標量:

$$S(q)=(q+q^*)/2$$

那麼:

$$2S(qpq^{-1})=2S(qpq^*)=qpq^*+(qpq^*)^*=qpq^*+qp^*q^*=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=(\vec{u}\sin{\frac{\theta}{2}},\cos{\frac{\theta}{2}})=(\vec{v}\times\vec{k},\vec{v}\cdot \vec{k})=(\vec{v},0)(-\vec{k},0)=kv^*$$

如今令

$$w=qvq^*$$

若是能證實w與v的夾角是σ,那麼就說明w確實是v旋轉σ獲得的,整個命題就得證了。

注意v,k和w都是實部爲0的單位四元數,表示單位向量,咱們有:

$$wk^*=(qvq^{-1})k^*=qvq^*k^*=qvvk^*k^*=q$$

因此

$$wk^*=kv^*$$

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

相關文章
相關標籤/搜索