在三維圖形學中,幾何變換大致分為三種,平移變換(Translation),縮放變換(Scaling),旋轉變換(Rotation)。以下討論皆針對DirectX,所以使用左手坐標系。
平移變換
將三維空間中的一個點[x, y, z, 1]移動到另外一個點[x', y', z', 1],三個坐標軸的移動分量分別為dx=Tx, dy=Ty, dz=Tz, 即
x' = x + Tx
y' = y + Ty
z' = z + Tz
平移變換的矩陣如下。
縮放變換
將模型放大或者縮小,本質也是對模型上每個頂點進行放大和縮小(頂點坐標值變大或變小),假設變換前的點是[x, y, z, 1],變換后的點是[x', y', z', 1],那么
x' = x * Sx
y' = y * Sy
z' = z * Sz
縮放變換的矩陣如下。
旋轉變換
這是三種變換中最復雜的變換,這里只討論最簡單的情況,繞坐標軸旋轉,關於繞任意軸旋轉,在后續的隨筆中介紹。
繞X軸旋轉
繞X軸旋轉時,頂點的x坐標不發生變化,y坐標和z坐標繞X軸旋轉θ度,旋轉的正方向為順時針方向(沿着旋轉軸負方向向原點看)。[x, y, z, 1]表示變換前的點,[x', y', z', 1]表示變換后的點。變換矩陣如下。
關於旋轉的正方向,OpenGL與多數圖形學書籍規定旋轉正方向為逆時針方向(沿着坐標軸負方向向原點看),比如Computer Graphics C Version,p409。
繞Y軸旋轉
繞Y軸旋轉時,頂點的y坐標不發生變化,x坐標和z坐標繞Y軸旋轉θ度。[x, y, z, 1]表示變換前的點,[x', y', z', 1]表示變換后的點。變換矩陣如下。
繞Z軸旋轉
繞Z軸旋轉時,頂點的z坐標不發生變化,x坐標和y坐標繞Z軸旋轉θ度。[x, y, z, 1]表示變換前的點,[x', y', z', 1]表示變換后的點。變換矩陣如下。
繞坐標軸旋轉的矩陣推導
上面三個旋轉矩陣是如何得來的呢?我們推導一下,首先看一下二維的情況,再擴展到三維即可。實際上上面三種繞坐標軸旋轉的情況屬於特殊的二維旋轉,比如繞Z軸旋轉,相當於在與XOY平面上繞原點做二維旋轉。
假設點P(x, y)是平面直角坐標系內一點,其到原點的距離為r,其與X軸的夾角為A,現將點P繞原點旋轉θ度,得到點P'(x', y'),P'與X軸的夾角為B,則A = B - θ。(注意,在二維坐標中,逆時針旋轉時角度為正,順時針旋轉時角度為負,下圖中由P旋轉到P',角度為θ,若是由P'轉到P,則角度為-θ)。
於是可得下面的轉換方程
(式一)
寫成矩陣的形式就是
求得旋轉矩陣為
由於這里使用齊次坐標,所以還需加上一維,最終變成如下形式
繞Z軸旋轉矩陣
和前面給出的繞Z軸旋轉矩陣完全吻合。
對於繞X軸旋轉的情況,我們只需將式一中的x用y替換,y用z替換,z用x替換即可。替換后得到
(式二)
對應的旋轉矩陣為
繞X軸旋轉矩陣
對於繞Y軸旋轉的情況,只需對式二做一次同樣的替換即可,的到的變換方程為
對應的變換矩陣為
繞Y軸旋轉矩陣
逆矩陣
平移變換矩陣的逆矩陣與原來的平移量相同,但是方向相反。
旋轉變換矩陣的逆矩陣與原來的旋轉軸相同但是角度相反。
縮放變換的逆矩陣正好和原來的效果相反,如果原來是放大,則逆矩陣是縮小,如果原來是縮小,則逆矩陣是放大。
== Happy Coding ==