3D遊戲數學基礎中的計算原理及幾何意義(一、矩陣)

-前言-

在3D開發中,矩陣的運算是極爲頻繁的,幾乎任何關於3D場景中的對象運算都會用到矩陣的知識。

-正文-

在我們日常遊戲開發中使用到的矩陣多爲方針(行數等於列數),通常爲2x2、3x3、4x4的方陣。

下面列舉一個一般的3x3方陣:\begin{bmatrix} m_{11}&m_{12} &m_{13} \\ m_{21} &m_{22} &m_{23} \\ m_{31}&m_{32} & m_{33} \end{bmatrix}

對角矩陣及單位矩陣

對角矩陣是矩陣中非對角線元素均爲0則爲對角矩陣,上面3x3方陣中當m12,m13,m23,m21,m31,m32爲0是爲對角矩陣。

單位矩陣則是一種特殊的對角矩陣,同樣以上面3x3方陣爲例,當滿足對角矩陣的情況下,m11,m22,m33爲1時則爲3x3矩陣的單位矩陣。

矩陣的轉置

矩陣轉置是沿着對角線翻折之後的矩陣。比如一個行向量轉置後爲一個列向量。

                                                              行向量轉置:\begin{bmatrix} x &y &z \end{bmatrix}^{\tau} =\begin{bmatrix} x\\ y\\ z\\ \end{bmatrix}

既然說到行向量與列向量,不同平臺默認使用的向量方式不一樣,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)表示爲矩陣爲:\begin{bmatrix} x & y & z \end{bmatrix},能與之相乘的必然是一個三行的矩陣

在上面3x3矩陣中的方塊中我們不管填什麼值都無法滿足右側的結果,因此通過3x3矩陣是無法實現3D對象的平移的,因此4x4齊次矩陣能爲我們解決這個問題。下面我通過手寫構造了一個平移矩陣:

旋轉

旋轉軸可以是x軸,y軸,z軸,他們的基向量均不相同

當繞x軸旋轉的基向量

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

當繞y軸旋轉的基向量

R_{y}(\Theta ) = \begin{bmatrix} cos\Theta & 0 &-sin\Theta \\ 0& \1 & 0 \\ sin\Theta& 0 & cos\Theta \end{bmatrix}

當繞z軸旋轉的基向量

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

縮放

在3D中存在3個維度的縮放因子,分別爲kx,ky,kz。在不同的方向應用不同的因子,被稱爲非均勻縮放。非均勻縮放時,物體角度將發生變換,視各方向縮放因子的不同,長度、面積、體積的變換因子也各不相同。

                                                            S(k_{x},k_{y},k_{z}) = \begin{bmatrix} k_{x} &0 &0 \\ 0& k_{y} &0 \\ 0& 0& k_{z} \end{bmatrix}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章