土法炼钢兴趣小组的算法知识备份

游戏中的数学 (2) - 矩阵与变换

目录

引言

如果说向量是游戏世界的“积木”,那么矩阵 (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. 基础变换

Matrix Transforms

平移矩阵 (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. 坐标系转换

矩阵的本质是坐标系转换。 在渲染管线中,顶点要经历一系列“空间跳跃”:

  1. 本地空间 (Local Space): 模型的原始坐标。
  2. 世界空间 (World Space): 乘以 Model Matrix。物体在游戏世界中的位置。
  3. 观察空间 (View Space): 乘以 View Matrix。以摄像机为原点的坐标。
  4. 裁剪空间 (Clip Space): 乘以 Projection Matrix。准备投影到屏幕。

\[ P_{clip} = M_{projection} \times M_{view} \times M_{model} \times P_{local} \] 这就是著名的 MVP 变换

总结


< 上一篇: 向量 | 回到目录 | 下一篇: 四元数 >


By .