Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第三章:變換
學習目標
- 理解如何用矩陣表示線性變換和仿射變換;
- 學習在座標系中縮放,旋轉和移動幾何體;
- 學習利用矩陣的乘法合併幾個變換矩陣;
- 學習如何在座標系之間轉換,並且表示為轉換矩陣;斜體樣式
- 學習如何利用DirectX Math庫提供的方法構造轉換矩陣。
1 線性轉換
1.1 線性轉換的定義
現在有方程
,當且僅當它滿足下列屬性的時候:
我們稱它為一個線性變換。其中u和v是3D向量,k是標量。
例如定義
;τ(1, 2, 3) = (1, 4, 9);這個方程不是線性的,因為如果k = 2和u = (1, 2, 3):τ(ku) = τ(2, 4, 6) = (4, 16, 36),但是kτ(u) = 2(1, 4, 9) = (2, 8, 18)
所以不符合性質2,如果它是線性的,它應該符合:
1.2 矩陣表示
令u = (x, y, z)我們可以把它寫成如下形式:
其中向量i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1),是座標系軸方向的單位向量,它們分別被稱為
的標準基本向量,現在令τ為一個線性變換,它具備下面性質:
那麼它可以被寫成向量和矩陣相乘的形式:
其中,我們稱矩陣A是線性變換τ的矩陣表現。
1.3 縮放
我們使用下面的公式來定義縮放:
它是物體在x軸方向縮放
倍,在y軸和z軸同理;我們現在要證明S 是一個線性轉換:
為了得到矩陣表現,我們把S應用到每個標準基本向量中,然後把結果放到矩陣的每一行中:
所以S的矩陣表現為:
我們稱這個矩陣為縮放矩陣,其逆矩陣為:
1.4 旋轉
這一節我們描述將一個向量V關於軸n旋轉θ角度;其中角度是當我們看向n軸時的順時針方向,並且||n|| = 1:
首先將v分解為2部分:平行於n(
)和垂直於n(
);因為n是一個單位向量,所以
;值得注意的是
是平行於n的,它在旋轉的過程中不變,所以我們只需要關注垂直那部分如果旋轉,即旋轉向量的結果就等於:
;
為了計算
,我們在旋轉的平面上構建一個2D座標系,首先使用
為第一個引用向量,為了得到第二個引用向量,我們使用叉積得到一個同時垂直於v和n的向量
,根據之前第一章練習14證明的公式(α是n和v之間的夾角):
所以所有引用向量的長度都是一樣的,並且都是同一個園的半徑,現在我們可以建立起他們之間的聯絡,得到公式如下:
進一步,可以得到旋轉公式:
然後根據1.2中的公式,將上述線性變換轉成矩陣(其中c為cosθ,s為sinθ):
旋轉矩陣有一個有趣的性質,它每一行的向量都是單位長度,並且互相垂直,所以它的行向量們是標準正交的;一個矩陣的行向量們標準正交的話,該矩陣稱為標準正交矩陣。標準正交矩陣有一個很吸引人的性質:它的逆矩陣等於它的轉置矩陣,所以:
通常來說,標準正交矩陣是非常值得使用的,因為它的逆矩陣可以很簡單和高效的計算出來。
在特殊情況下,如果我們要圍繞x,y,z軸旋轉,我們可以得到下列矩陣:
2 仿射變換
2.1 齊次座標系
在下一節中,我們將看到仿射變換其實是線性變換結合位移;位移不適用於向量,因為向量只表示方向和長度,其次座標系中提供了一個計數方法可以點和向量的變化一致:
1、使用(x, y, z, 0)表示向量(w = 0可以保證向量在變化中不進行位移);
2、使用(x, y, z, 0)表示點。
2.2 矩陣表示的定義
一個仿射變換是一個線性變化加一個位移變化:
或者用矩陣表示:
如果我們使用w = 1來擴充套件到齊次座標系,那麼可以使用更簡潔的寫法:
這個4 x 4矩陣就是仿射變換的矩陣表示,如果是針對向量,不想做位移操作,只需要把第四行w設定為0即可。
2.3 位移
位移矩陣:
位移矩陣的逆矩陣:
2.4 仿射矩陣的縮放和旋轉
2.5 仿射矩陣變換的幾何解釋
令τ是一個旋轉變換,b是一個平移變換,那麼這個變換就可以描述為一個仿射變換:
用其次座標系(對於頂點w=1,對向量w=0)的矩陣表示為:
我們可以看到τ只是旋轉了每一個標準分向量i,j和k;α(x, y, z) = xτ(i) + yτ(j) + zτ(k) + b,向量b只是平移了每一個頂點:
相同的思路也可以解釋縮放變換:
3 變換的結合
假設S是一個縮放矩陣,R是一個旋轉矩陣,T是一個平移矩陣;如果我們要對一個具有8個頂點的立方體做如何變換,最顯而易見的方法是一步一步變換:
因為矩陣的乘法具有結合律,所以:
我們可以設C = SRT為一個同時封裝了3個變換的矩陣。
4 座標系變換
在3D計算機圖形學中,我們需要使用到多個座標系和座標系之間的變換,對於頂點和向量的座標系變幻是不同的。
4.1 向量
下圖中,有兩個座標系A和B,與一個向量P。
很明顯 p = xu + yv,其中u和v是座標系A中,x和y方向上的單位向量;那麼
就可以解釋為
;所以,如果我們知道