旋轉變換(一)旋轉矩陣

1. 簡介html

計算機圖形學中的應用很是普遍的變換是一種稱爲仿射變換的特殊變換,在仿射變換中的基本變換包括平移、旋轉、縮放、剪切這幾種。本文以及接下來的幾篇文章重點介紹一下關於旋轉的變換,包括二維旋轉變換、三維旋轉變換以及它的一些表達方式(旋轉矩陣、四元數、歐拉角等)。ide

2. 繞原點二維旋轉函數

首先要明確旋轉在二維中是繞着某一個點進行旋轉,三維中是繞着某一個軸進行旋轉。二維旋轉中最簡單的場景是繞着座標原點進行的旋轉,以下圖所示:idea

 

 

如圖所示點v 繞 原點旋轉θ 角,獲得點v’,假設 v點的座標是(x, y) ,那麼能夠推導獲得 v’點的座標(x’, y’)(設原點到v的距離是r,原點到v點的向量與x軸的夾角是ϕ )
x=rcosϕy=rsinϕ
x′=rcos(θ+ϕ)y′=rsin(θ+ϕ)
經過三角函數展開獲得
x′=rcosθcosϕrsinθsinϕ
y′=rsinθcosϕ+rcosθsinϕ
帶入x和y表達式獲得
x′=xcosθysinθ
y′=xsinθ+ycosθ
寫成矩陣的形式是: spa

 

儘管圖示中僅僅表示的是旋轉一個銳角θ的情形,可是咱們推導中使用的是三角函數的基本定義來計算座標的,所以當旋轉的角度是任意角度(例如大於180度,致使v’點進入到第四象限)結論仍然是成立的。3d

3. 繞任意點的二維旋轉htm

繞原點的旋轉是二維旋轉最基本的狀況,當咱們須要進行繞任意點旋轉時,咱們能夠把這種狀況轉換到繞原點的旋轉,思路以下:
1. 首先將旋轉點移動到原點處
2. 執行如2所描述的繞原點的旋轉
3. 再將旋轉點移回到原來的位置blog

 

也就是說在處理繞任意點旋轉的狀況下須要執行兩次平移的操做。假設平移的矩陣是T(x,y),也就是說咱們須要獲得的座標 v’=T(x,y)*R*T(-x,-y)(咱們使用的是列座標描述點的座標,所以是左乘,首先執行T(-x,-y))圖片

在計算機圖形學中,爲了統一將平移、旋轉、縮放等用矩陣表示,須要引入齊次座標。(假設使用2x2的矩陣,是沒有辦法描述平移操做的,只有引入3x3矩陣形式,才能統一描述二維中的平移、旋轉、縮放操做。同理必須使用4x4的矩陣才能統一描述三維的變換)。ip

對於二維平移,以下圖所示,P點通過x和y方向的平移到P’點,能夠獲得:

 

 

x′=x+tx

y′=y+ty
因爲引入了齊次座標,在描述二維座標的時候,使用(x,y,w)的方式(通常w=1),因而能夠寫成下面矩陣的形式


按矩陣乘法展開,正好獲得上面的表達式。也就是說平移矩陣是

 

若是平移值是(-tx,-ty)那麼很明顯平移矩陣式

 

 

咱們能夠把2中描述的旋轉矩陣也擴展到3x3的方式,變爲:

 


從平移和旋轉的矩陣能夠看出,3x3矩陣的前2x2部分是和旋轉相關的,第三列與平移相關。有了上面的基礎以後,咱們很容易得出二維中繞任意點旋轉的旋轉矩陣了,只須要把三個矩陣乘起來便可:

 

4. 三維基本旋轉

咱們能夠把一個旋轉轉換爲繞基本座標軸的旋轉,所以有必要討論一下繞三個座標值x、y、z的旋轉。
本文在討論過程當中使用的是相似於OpenGL中定義的右手座標系,同時旋轉角度的正負也遵循右手座標系的約定。以下圖所示

 

 

4.1 繞X軸的旋轉

在三維場景中,當一個點P(x,y,z)繞x軸旋轉θ角獲得點P’(x’,y’,z’)。因爲是繞x軸進行的旋轉,所以x座標保持不變,y和z組成的yoz(o是座標原點)平面上進行的是一個二維的旋轉,能夠參考上圖(y軸相似於二維旋轉中的x軸,z軸相似於二維旋轉中的y軸),因而有:
x′=x
y′=ycosθzsinθ
z′=ysinθ+zcosθ
寫成(4x4)矩陣的形式

 

4.2 繞Y軸旋轉

繞Y軸的旋轉和繞X軸的旋轉相似,Y座標保持不變,除Y軸以外,ZOX組成的平面進行一次二維的旋轉(Z軸相似於二維旋轉的X軸,X軸相似於二維旋轉中的Y軸,注意這裏是ZOX,而不是XOZ,觀察上圖中右手系的圖片能夠很容易瞭解到這一點),一樣有:
x′=zsinθ+xcosθ
y′=y
z′=zcosθxsinθ
寫成(4x4)矩陣的形式

 

 

4.3 繞Z軸旋轉

與上面相似,繞Z軸旋轉,Z座標保持不變,xoy組成的平面內正好進行一次二維旋轉(和上面討論二維旋轉的狀況徹底同樣)

 

 

4.4 小結

上面描述了三維變換中繞單一軸旋轉的矩陣表達形式,繞三個軸旋轉的矩陣很相似,其中繞y軸旋轉的矩陣與繞x和z軸旋轉的矩陣略有點不一樣(主要是三個軸向順序和書寫矩陣的方式不一致致使的,繞三個不一樣座標旋轉軸以及其餘二個座標軸組成平面的順序是: XYZ(繞x軸) YZX(繞y軸) ZXY(繞z軸),其中繞y軸旋轉,其餘兩個軸是ZX,這和咱們書寫矩陣按

 

 

 


的方式不一致,而致使看起來繞Y軸旋轉的矩陣彷佛是和其餘兩個矩陣不一致。若是咱們顛倒寫法,將公式寫成

 


的方式,那麼這三個旋轉矩陣看起來在形式上就統一了,都是

 

 


這種表現形式了(左上角都是−sinθ

5. 繞任意軸的三維旋轉

繞任意軸的三維旋轉可使用相似於繞任意點的二維旋轉同樣,將旋轉分解爲一些列基本的旋轉。繞任意軸旋轉以下圖所示:

 

 

P點繞向量u旋轉θ角,獲得點Q,已知P點的座標和向量u,如何求Q點的座標。
咱們能夠把向量u進行一些旋轉,讓它與z軸重合,以後旋轉P到Q就做了一次繞Z軸的三維基本旋轉,以後咱們再執行反向的旋轉,將向量u變回到它原來的方向,也就是說須要進行的操做以下:
1. 將旋轉軸u繞x軸旋轉至xoz平面
2. 將旋轉軸u繞y軸旋轉至於z軸重合
3. 繞z軸旋轉θ
4. 執行步驟2的逆過程
5. 執行步驟1的逆過程
原始的旋轉軸u以下圖所示:

 


第一、二、3步驟以下圖所示:

 

 


步驟1將向量u旋轉至xoz平面的操做是一個繞x軸的旋轉操做,步驟2將向量u旋轉到與z軸重合,第一、2步驟的示意圖以下:

 


做點P在yoz平面的投影點q,q的座標是(0, b, c),原點o與q點的連線oq和z軸的夾角就是u繞x軸旋轉的角度。經過此次旋轉使得u向量旋轉到xoz平面(圖中的or向量)【步驟1】
過r點做z軸的垂線,or與z軸的夾角爲β, 這個角度就是繞Y軸旋轉的角度,經過此次旋轉使得u向量旋轉到與z軸重合【步驟2】

步驟1中繞x軸旋轉的是一次基本的繞x軸的三維旋轉,按照以前的討論,旋轉矩陣是:

 

 


這裏的θ就是圖中所示的α角 (注意α角度是繞x旋轉的正的角度)
從圖中咱們還能夠獲得:


因而旋轉矩陣(記做 Rx(α))爲:

 


在完成步驟1以後,向量u被變換到了r的位置,咱們繼續步驟2的操做,繞y軸旋轉負的β角(注意:這裏的β是負的),通過此次變換以後向量u與z軸徹底重合,因爲這一步也是執行的一次繞Y軸的基本旋轉,旋轉矩陣(記做 Ry(−β))爲:

 

 


使用−β替換表達式中的θ,此外根據圖中描述,咱們能夠計算獲得:

 

 


帶入上面的表達式,因而旋轉矩陣(記做 Ry(−β))爲:

 

在完成前面兩個步驟以後,u方向和z軸徹底重合,所以執行旋轉θ角,執行的是一次繞z軸的基本三維旋轉(記做 R(θ),根據以前的討論,咱們能夠獲得:


最後兩步驟是前面1和2的逆操做,也就是繞Y軸旋轉β 和繞X軸旋轉−α,這兩個矩陣分別記做 Ry(β) 和 Rx(−α),獲得它們的方式很簡單,只須要將上面步驟1和步驟2中的角度修改爲相反數便可,也就是:

 

 

最終獲得 繞任意軸u旋轉的旋轉矩陣是【由於使用的列向量,所以執行的是左乘(從右往左)】:

MR=Rx(−α)Ry(β)Rz(θ)Ry(−β)Rx(α)=

 

 



(注:式中的(u,v,w)對應上文中向量(a,b,c),公式我本身筆算過,爲了減小編輯公式的時間(使用LaTex編輯太繁瑣,所以找了一張公式的圖片貼在此處)

若是向量是通過單位化的(單位向量),那麼有a2+b2+c2=1,能夠簡化上述的公式,獲得:

 

 

參考文獻:

  1. Wiki Rotation (mathematics)
  2. Euler’s rotation theorem
  3. Maths - Rotation Matrices
  4. 繞任意軸旋轉
  5. Rotation About an Arbitrary Axis in 3 Dimensions
  6. Rotation about an Arbitrary Axis (Line)
相關文章
相關標籤/搜索