-前言-
在3D開發中,矩陣的運算是極爲頻繁的,幾乎任何關於3D場景中的對象運算都會用到矩陣的知識。
-正文-
在我們日常遊戲開發中使用到的矩陣多爲方針(行數等於列數),通常爲2x2、3x3、4x4的方陣。
下面列舉一個一般的3x3方陣:
對角矩陣及單位矩陣
對角矩陣是矩陣中非對角線元素均爲0則爲對角矩陣,上面3x3方陣中當m12,m13,m23,m21,m31,m32爲0是爲對角矩陣。
單位矩陣則是一種特殊的對角矩陣,同樣以上面3x3方陣爲例,當滿足對角矩陣的情況下,m11,m22,m33爲1時則爲3x3矩陣的單位矩陣。
矩陣的轉置
矩陣轉置是沿着對角線翻折之後的矩陣。比如一個行向量轉置後爲一個列向量。
行向量轉置:
既然說到行向量與列向量,不同平臺默認使用的向量方式不一樣,DirectX中默認使用行向量,OpenGL中默認使用列向量。
1.對於任意矩陣M,轉置後轉置等於原矩陣
2.對於任意對角矩陣D,轉置矩陣等於原矩陣(單位矩陣更是如此)
矩陣的乘法
矩陣中是沒有除法的概念的,不過矩陣的乘法也是夠打腦殼的。矩陣一般我們都是叫法都是行列,一個4x2的矩陣就是4行2列的矩陣,這個矩陣能與之相乘的矩陣必定滿足行數爲2,否則它們相乘沒有意義。下面來看看一個4x2的矩陣乘以2x5的矩陣是如何相乘的(公式編輯器太麻煩了我就手寫了):
矩陣乘法滿足一下特性:
- 任意矩陣M乘以方陣,不管從哪邊乘,都將得到與原矩陣大小相同的矩陣
- 矩陣乘法不滿足交換律
- 矩陣乘法滿足結合律,即(AB)C = A(BC)
- 矩陣乘積的轉置等於先轉置矩陣然後以相反順序乘以矩陣,(AB)' = B'A'
矩陣的主要實際運用
在遊戲開發中矩陣住還要用於對象的旋轉、縮放、投影、鏡像、仿射(平移)
除了仿射不是線性變換,其餘變換都是線性變換。平移是不能使用3x3矩陣完成的,必須使用4x4齊次矩陣完成。
那我們首先來說說爲什麼3x3矩陣爲什麼不能平移,而必須使用4x4齊次矩陣才能完成3D對象的平移。
平移
一個3D對象的平移可以理解成在x,y,z分量上分別移動x‘,y’,z’的距離。根據上面所講的矩陣乘法概念。
當一個3D座標點Vector3(x,y,z)表示爲矩陣爲:,能與之相乘的必然是一個三行的矩陣
在上面3x3矩陣中的方塊中我們不管填什麼值都無法滿足右側的結果,因此通過3x3矩陣是無法實現3D對象的平移的,因此4x4齊次矩陣能爲我們解決這個問題。下面我通過手寫構造了一個平移矩陣:
旋轉
旋轉軸可以是x軸,y軸,z軸,他們的基向量均不相同
當繞x軸旋轉的基向量
當繞y軸旋轉的基向量
當繞z軸旋轉的基向量
縮放
在3D中存在3個維度的縮放因子,分別爲kx,ky,kz。在不同的方向應用不同的因子,被稱爲非均勻縮放。非均勻縮放時,物體角度將發生變換,視各方向縮放因子的不同,長度、面積、體積的變換因子也各不相同。