3D图形矩阵变换完全指南:平移、旋转与缩放详解
🧮 一文搞懂 3D 图形中的矩阵变换(Matrix Transformations)
在 3D 图形开发、游戏引擎或建模软件(如 Autodesk Maya)中,“矩阵(Matrix)”几乎无处不在。无论是移动(Translation)、缩放(Scaling)还是旋转(Rotation),这些操作在底层其实都通过矩阵运算来实现。
为什么?——因为矩阵运算在计算机中极高效,可以一次性表示并组合多个变换,比单独处理每个操作要快得多。
一、矩阵是什么?
矩阵(Matrix)就是一个矩形的数字数组,例如:
[0.2 3 1.7 0.3]
[-0.6 2 0.1 1.2]
[-0.9 0 1 0.4]
[1.2 4 0.6 1 ]
矩阵可以有不同的维度,比如 2×2、3×3 或 4×4。而**向量(Vector)**其实就是一个一维矩阵,例如 [1, 12, 6]
。
在三维空间中,我们通常使用 4×4 矩阵 来表示物体的位置、旋转和缩放。
二、单位矩阵(Identity Matrix)
当一个物体没有进行任何变换(即处于原点 (0,0,0)
,没有旋转,缩放为 1,1,1
)时,它的矩阵是:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
这就是单位矩阵。它代表“什么都没发生”。
任何向量与单位矩阵相乘,结果都不会改变。
三、缩放(Scaling)
如果我们想把物体在 Y 轴方向放大 3 倍,可以这样表示:
[1 0 0 0]
[0 3 0 0]
[0 0 1 0]
[0 0 0 1]
对角线上数值代表各轴的缩放比例(Sx, Sy, Sz)。
四、平移(Translation)
平移是由矩阵的最后一行(或最后一列)表示的。
例如,把一个物体沿 X 轴移动 6 个单位,Y 轴移动 -1 个单位:
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[6 -1 0 1]
这样,一个点 (0,0,0)
经过该矩阵变换后就会移动到 (6,-1,0)
。
五、旋转(Rotation)
旋转是矩阵中最复杂但也最有趣的部分。
每个三维物体都有 X、Y、Z 三个旋转轴,我们通常需要为每个轴分别计算旋转矩阵。
例如,围绕 Z 轴 旋转 θ 角度的矩阵是:
[cosθ -sinθ 0 0]
[sinθ cosθ 0 0]
[0 0 1 0]
[0 0 0 1]
如果我们旋转 40°,那么:
cos(40°) ≈ 0.76
sin(40°) ≈ 0.64
带入后:
[0.76 -0.64 0 0]
[0.64 0.76 0 0]
[0 0 1 0]
[0 0 0 1]
六、组合旋转:X、Y、Z 顺序很重要!
在实际 3D 系统中(如 Maya、Unreal、Unity),旋转顺序非常关键。
通常我们使用的旋转矩阵是通过依次应用 X、Y、Z 三个方向的旋转矩阵相乘得来的。不同顺序的乘法结果不同——这也是为什么同样的角度在不同引擎中可能表现不同的原因。
例如:
RotateX → RotateY → RotateZ
和
RotateZ → RotateY → RotateX
得到的姿态可能完全不一样。
非常好的问题 👍
——这其实是理解 3D 图形数学的核心概念之一。
我们来系统地讲清楚:
🧩 为什么在三维空间中使用 4×4 矩阵?
在 3D 空间中,我们最直观地想到的变换是:
- 平移(Translation)
- 旋转(Rotation)
- 缩放(Scaling)
其中,旋转和缩放都可以用一个 3×3 矩阵 表示,因为它们只是改变点的相对位置或大小,不涉及移动原点。
那为什么我们还要多出一行、一列,变成 4×4 呢?
🧮 3×3 矩阵能表示旋转和缩放,但不能表示平移
我们先来看一个点的坐标变化:
P = [x, y, z]
假设我们只旋转或缩放它:
P' = M3x3 × P
OK,这没问题。
但如果我们要“平移”它,比如移动 5 个单位到右边、2 个单位到上方,
数学上是:
P' = M3x3 × P + T
这里 T
是平移向量 [tx, ty, tz]
。
这就意味着我们必须做 矩阵乘法 + 向量加法,无法用一个矩阵搞定。
🧠 引入“齐次坐标(Homogeneous Coordinates)”
为了让所有变换都能用一次矩阵乘法完成,
我们引入了第4个维度 w,把三维坐标 [x, y, z]
变成 [x, y, z, 1]
。
这个“1”叫做齐次坐标(homogeneous coordinate)。
于是我们的变换矩阵也变成了 4×4:
[x' y' z' 1] = [x y z 1] × M4x4
这时,无论是旋转、缩放还是平移,都能统一地通过矩阵乘法实现。
🧱 4×4 矩阵的结构含义
一个典型的 4×4 变换矩阵长这样:
[ R11 R12 R13 0 ]
[ R21 R22 R23 0 ]
[ R31 R32 R33 0 ]
[ Tx Ty Tz 1 ]
我们逐块看:
部分 | 含义 | 说明 |
---|---|---|
左上 3×3 | 旋转 + 缩放 | 控制物体的朝向和尺寸 |
最后一列 | 一般是 [0, 0, 0, 1] | 维持齐次坐标格式 |
最后一行前三个 [Tx, Ty, Tz] | 平移向量 | 控制物体在空间中的位置 |
右下角的 1 | 齐次坐标标识 | 保证矩阵可逆并能区分平移与旋转 |
🧩 举例:一个物体平移 + 旋转 + 缩放的 4×4 矩阵
假设:
- 缩放 2 倍
- 绕 Z 轴旋转 90°
- 平移 (5, 3, 2)
对应矩阵:
[ 0 -2 0 0 ]
[ 2 0 0 0 ]
[ 0 0 2 0 ]
[ 5 3 2 1 ]
现在任何点 [x, y, z, 1]
乘上这个矩阵:
- 会先被旋转 90°(绕 Z 轴)
- 再缩放 2 倍
- 最后移动到 (5, 3, 2)
所有这些变换一步到位!
🧭 为什么一定要“4×4”
✅ 原因总结:
- 3×3 只能表示线性变换(旋转、缩放、错切)
- 平移是仿射变换(affine transform),需要额外的“1”来统一计算
- 4×4 矩阵 = 线性变换 + 平移 + 齐次坐标的统一表达
- 可方便地与摄像机投影矩阵、视图矩阵拼接(所有矩阵都 4×4 才能链式相乘)
🧮 通俗总结
可以这样记忆:
矩阵大小 | 用途 | 能做什么 |
---|---|---|
2×2 | 2D 旋转缩放 | 平面变换 |
3×3 | 3D 旋转缩放 | 不含平移 |
4×4 | 3D 综合变换 | 平移 + 旋转 + 缩放,一步到位 |
七、总结
矩阵让 3D 世界的几何变换变得优雅且高效。一个 4×4 的矩阵,就能同时包含:
- ✅ 物体的位置(Translation)
- ✅ 旋转角度(Rotation)
- ✅ 缩放比例(Scaling)
也就是说,16 个数字 就能描述物体在三维空间中的完整状态。
✍️ 结语
理解矩阵不仅是学习 3D 编程的基础,更是理解渲染、动画、物理引擎等领域的钥匙。
下次当你在 Blender、Maya 或 Unreal 中看到“Transform Matrix”时,希望你能微笑着说一句:
“啊,我知道它在干什么。”