3D游戏中的数学 - 矩阵

矩阵相关知识

$$\boldsymbol{A}\boldsymbol{B} \ne \boldsymbol{B}\boldsymbol{A}$$

单位矩阵(identity matrix)

对角线为1,其余为0的矩阵,表示为 \(\boldsymbol{I}\)。

$$I_{3x3} = \begin{bmatrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

矩阵 \(\boldsymbol{A}\) 的表示为 \(\boldsymbol{A}^{-1}\),且 \(\boldsymbol{A}\boldsymbol{A}^{-1} = \boldsymbol{I}\)。

逆矩阵

变换矩阵的逆矩阵可以理解为其对应的反向变换。

不是所有的矩阵都有逆矩阵,但所有的仿射矩阵都可逆。

$$(\boldsymbol{A}\boldsymbol{B}\boldsymbol{C})^{-1} = \boldsymbol{C}^{-1}\boldsymbol{B}^{-1}\boldsymbol{A}^{-1}$$

矩阵转置 Transposition

矩阵 \(\boldsymbol{M}\) 的转置矩阵记为 \(\boldsymbol{M}^{T}\)

$$ \begin{bmatrix} a & b \\ c & d \end{bmatrix}^{T} = \begin{bmatrix} a & c \\ b & d \end{bmatrix} $$

$$(\boldsymbol{A}\boldsymbol{B}\boldsymbol{C})^{T} = \boldsymbol{C}^{T}\boldsymbol{B}^{T}\boldsymbol{A}^{T}$$

变换矩阵

一个4x4的矩阵可以表示任意一种3D变换(平移、旋转、缩放、剪切),这种矩阵被称为变换矩阵(transformation matrix)

将任意不同的变换矩阵组合一起(相乘)得到的矩阵被称为仿射矩阵(affine matrix),用于仿射变换。

$$ \boldsymbol{M}_{affine} = \begin{bmatrix} \boldsymbol{U}_{3\times3} & 0_{3\times1} \\ \boldsymbol{t}_{1\times3} & 1 \end{bmatrix} $$

其中 \(\boldsymbol{U}_{3\times3}\) 表示缩放与旋转,\(\boldsymbol{t}_{1\times3}\) 表示平移。

为了将三维向量与 4x4 仿射矩阵进行计算,需要将三维向量 \((x, y, z)\) 转化为 \((x, y, z, 1)\)。而对于三维方向向量,由于对其进行平移没有意义,其可表示为 \((x, y, z, 0)\)。

平移变换 Translation

$$ \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ t_x & t_y & t_z & 1 \end{bmatrix} = \begin{bmatrix} \boldsymbol{I} & 0 \\ \boldsymbol{t} & 1 \end{bmatrix} $$

其逆矩阵为 \(\begin{bmatrix}\boldsymbol{I} & 0 \\ -\boldsymbol{t} & 1\end{bmatrix}\)

旋转变换 Rotation

$$\begin{bmatrix}\boldsymbol{R} & 0 \\ 0 & 1\end{bmatrix}$$

$$ rotate_x(\boldsymbol{r}, \phi) = \boldsymbol{r} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos \phi & \sin \phi & 0 \\ 0 & -\sin \phi & \cos \phi & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \qquad (绕\ x\ 轴旋转) $$ $$ rotate_y(\boldsymbol{r}, \theta) = \boldsymbol{r} \begin{bmatrix} \cos \theta & 0 & -\sin \theta & 0 \\ 0 & 1 & 0 & 0 \\ \sin \theta & 0 & \cos \theta & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \qquad (绕\ y\ 轴旋转) $$ $$ rotate_z(\boldsymbol{r}, \gamma) = \boldsymbol{r} \begin{bmatrix} \cos \gamma & \sin \gamma & 0 & 0 \\ -\sin \gamma & \cos \gamma & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \qquad (绕\ z\ 轴旋转) $$

旋转变换矩阵的逆等于其转置矩阵。这是因为旋转 \(\theta\) 角度的变换矩阵的逆为旋转 \(-\theta\) 角度的变换矩阵,而 \(\sin(-\theta) = -\sin\theta, \cos(-\theta) = \cos\theta\)。

缩放 Scale

$$ \boldsymbol{r}\boldsymbol{S} = \boldsymbol{r} \begin{bmatrix} S_x & 0 & 0 & 0 \\ 0 & S_y & 0 & 0 \\ 0 & 0 & S_z & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

其逆矩阵为:

$$ \begin{bmatrix} \frac{1}{S_x} & 0 & 0 & 0 \\ 0 & \frac{1}{S_y} & 0 & 0 \\ 0 & 0 & \frac{1}{S_z} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

当 \(S_x = S_y = S_z\) 时称之为统一缩放(uniform scale)

由于 4x4 仿射矩阵的最后一列始终为 \([0\ 0\ 0\ 1]^T\),所以在实际应用中为了节约空间往往会将其省略。

坐标空间

在父坐标空间中的物体可以拥有自己的子坐标空间,从而形成坐标空间的继承关系。将一个坐标在相关坐标空间之间的转换操作被称为 change of basis。

全局空间(world space)没有父坐标空间,其为坐标空间继承树的根。

将点和方向从子坐标空间 C 转换到父坐标空间 P 的矩阵表示为 \(\boldsymbol{M}_{C\to P}\)。

对于任意子坐标空间 C 中的位置向量 \(\boldsymbol{P}_C\),且其在父坐标空间 P 中的表示为 \(\boldsymbol{P}_P\),存在以下公式:

$$\boldsymbol{P}_P = \boldsymbol{P}_C \boldsymbol{M}_{C\to P}$$

$$ \boldsymbol{M}_{C\to P} = \begin{bmatrix} \boldsymbol{i}_C & 0 \\ \boldsymbol{j}_C & 0 \\ \boldsymbol{k}_C & 0 \\ \boldsymbol{t}_C & 0 \end{bmatrix} $$

其中 \(\boldsymbol{i}_C\ \boldsymbol{j}_C\ \boldsymbol{k}_C\) 为子坐标空间坐标轴上的单位基向量在父坐标空间内的表示。\(\boldsymbol{t}_C\) 为子坐标空间坐标原点相对于父坐标空间坐标原点的平移。

对子坐标系统的缩放可直接表示为对 \(\boldsymbol{i}_C\ \boldsymbol{j}_C\ \boldsymbol{k}_C\) 的缩放。

将子坐标空间中的法向量转换到父坐标空间中,需要使用 \((\boldsymbol{M}_{C\to P}^{-1})^T\)。这是因为法向量是一个伪向量。