引言
如果说向量是游戏世界的“积木”,那么矩阵 (Matrix) 就是“胶水”。 矩阵的主要作用是变换 (Transformation)。它能把一个物体从一个位置移动到另一个位置,旋转它,缩放它,甚至把它从 3D 世界投影到 2D 屏幕上。
1. 什么是矩阵?
在 3D 游戏开发中,我们最常用的是 4x4 矩阵。它是一个 4 行 4 列的数字网格。
\[ M = \begin{bmatrix} m_{00} & m_{01} & m_{02} & m_{03} \\ m_{10} & m_{11} & m_{12} & m_{13} \\ m_{20} & m_{21} & m_{22} & m_{23} \\ m_{30} & m_{31} & m_{32} & m_{33} \end{bmatrix} \]
为什么是 4x4?
因为我们需要处理 3D 坐标 \((x, y, z)\)。 但是,3x3 矩阵只能表示线性变换(旋转、缩放),无法表示平移 (Translation)。 为了统一处理平移、旋转和缩放,我们引入了齐次坐标 (Homogeneous Coordinates),即增加第四个分量 \(w\)。 一个 3D 点表示为 \((x, y, z, 1)\),一个 3D 向量表示为 \((x, y, z, 0)\)。
2. 基础变换
平移矩阵 (Translation)
将物体移动 \((tx, ty, tz)\)。 \[ \begin{bmatrix} 1 & 0 & 0 & tx \\ 0 & 1 & 0 & ty \\ 0 & 0 & 1 & tz \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
缩放矩阵 (Scale)
将物体在各轴上缩放 \((sx, sy, sz)\)。 \[ \begin{bmatrix} sx & 0 & 0 & 0 \\ 0 & sy & 0 & 0 \\ 0 & 0 & sz & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
旋转矩阵 (Rotation)
绕各轴旋转。例如绕 Z 轴旋转 \(\theta\): \[ \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]
3. 矩阵乘法与组合变换
矩阵最强大的地方在于组合。 如果你想先把物体放大 2 倍,然后绕 Y 轴旋转 90 度,再向前移动 10 米。你不需要分别对每个顶点做三次计算。 你可以将这三个矩阵相乘,得到一个模型矩阵 (Model Matrix),然后只用这个矩阵乘以顶点即可。
乘法顺序很重要!
矩阵乘法不满足交换律。\(A \times B \neq B \times A\)。 在大多数游戏引擎(如 Unity,使用列向量)中,变换顺序是从右向左读的: \[ M_{final} = M_{translate} \times M_{rotate} \times M_{scale} \] 这意味着:先缩放,再旋转,最后平移。(这是最常用的顺序,也就是 TRS)。
4. 坐标系转换
矩阵的本质是坐标系转换。 在渲染管线中,顶点要经历一系列“空间跳跃”:
- 本地空间 (Local Space): 模型的原始坐标。
- 世界空间 (World Space): 乘以 Model Matrix。物体在游戏世界中的位置。
- 观察空间 (View Space): 乘以 View Matrix。以摄像机为原点的坐标。
- 裁剪空间 (Clip Space): 乘以 Projection Matrix。准备投影到屏幕。
\[ P_{clip} = M_{projection} \times M_{view} \times M_{model} \times P_{local} \] 这就是著名的 MVP 变换。
总结
- 矩阵用于存储和组合变换(平移、旋转、缩放)。
- 4x4 矩阵配合齐次坐标 \((x,y,z,w)\) 可以统一处理所有变换。
- 矩阵乘法顺序至关重要 (通常是 TRS)。
- MVP 矩阵将顶点从模型空间一路送到屏幕上。
< 上一篇: 向量 | 回到目录 | 下一篇: 四元数 >