本文目录导读:

在计算机图形学、游戏开发(如 Unity、Unreal)以及 3D 数学中,Transform(变换) 通常指对物体进行平移(Translation)、旋转(Rotation) 和缩放(Scale) 的操作。
这三种变换通常组合成一个 4x4 变换矩阵,用来描述一个物体在世界空间中的位置、朝向和大小。
以下是这三大变换的详解与数学原理:
平移变换(Translation)
作用:将物体从一个位置移动到另一个位置。
数学表示(齐次坐标,4x4矩阵):
假设你想将物体沿 X 轴移动 ( t_x ),沿 Y 轴移动 ( t_y ),沿 Z 轴移动 ( t_z )。
[
T(t_x, t_y, t_z) =
\begin{bmatrix}
1 & 0 & 0 & t_x \
0 & 1 & 0 & t_y \
0 & 0 & 1 & t_z \
0 & 0 & 0 & 1
\end{bmatrix}
]
- 特点:不改变物体的形状、大小和朝向,只改变位置。
- 顺序:在大多数引擎中,平移通常最后应用(相对于世界坐标)。
旋转变换(Rotation)
作用:让物体绕某个轴(X、Y、Z 或任意轴)旋转一定角度。
数学表示(绕坐标轴旋转 θ 角度):
-
绕 X 轴: [ R_x(\theta) = \begin{bmatrix} 1 & 0 & 0 & 0 \ 0 & \cos\theta & -\sin\theta & 0 \ 0 & \sin\theta & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} ]
-
绕 Y 轴: [ R_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \ 0 & 1 & 0 & 0 \ -\sin\theta & 0 & \cos\theta & 0 \ 0 & 0 & 0 & 1 \end{bmatrix} ]
-
绕 Z 轴: [ R_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} ]
-
重要概念:
- 万向锁:使用欧拉角(X/Y/Z顺序)时会出现,通常推荐使用四元数避免。
- 旋转顺序:在Unity中,旋转顺序是 Z -> X -> Y。
缩放变换(Scale)
作用:改变物体的大小。
数学表示:
假设 ( s_x, s_y, s_z ) 分别是 X、Y、Z 方向的缩放因子。
[
S(s_x, s_y, s_z) =
\begin{bmatrix}
s_x & 0 & 0 & 0 \
0 & s_y & 0 & 0 \
0 & 0 & s_z & 0 \
0 & 0 & 0 & 1
\end{bmatrix}
]
- 均匀缩放:( s_x = s_y = s_z )
- 非均匀缩放:不同轴有不同的缩放因子(会使物体变形,如压扁拉长)
- 负缩放:可以用于镜像(如把 X 缩放设为 -1)
变换的复合(组合顺序很重要!)
矩阵乘法不满足交换律,因此应用变换的顺序非常关键。
常见的两种顺序:
-
TRS(先缩放,再旋转,最后平移)
这是最常用的顺序(如 Unity、OpenGL):
[ M = T \times R \times S ]- 先缩放(绕本地原点)
- 再旋转(绕本地轴)
- 最后平移(到世界位置)
-
SRT(先平移,再旋转,最后缩放)
不常用于物体本身,更多用于摄像机或特定算法。
举个例子:
- 如果先平移再旋转:物体会绕世界原点转,而不是绕自己中心转(通常不是你期望的效果)。
在引擎中的实际表现(以 Unity 为例)
| 属性 | Transform 组件中的字段 | 说明 |
|---|---|---|
| Position | transform.position |
世界坐标位置 (Vector3) |
| Rotation | transform.rotation |
四元数 (Quaternion) |
| Local Scale | transform.localScale |
本地缩放 (Vector3) |
操作示例:
// 平移 transform.Translate(1, 0, 0); // 沿 X 轴移动 1 单位 // 旋转 transform.Rotate(0, 90, 0); // 绕 Y 轴旋转 90 度 // 缩放 transform.localScale = new Vector3(2, 2, 2); // 放大两倍
| 变换 | 改变什么 | 矩阵特征 | 顺序建议 |
|---|---|---|---|
| 平移 (T) | 位置 | 最后一列是位移 | 最后做 |
| 旋转 (R) | 朝向 | 左上 3x3 是旋转矩阵 | 中间做 |
| 缩放 (S) | 大小 | 对角线上是缩放因子 | 最先做 |
核心口诀:
TRS 顺序:先缩放,再旋转,最后平移。
如果你需要我进一步解释四元数旋转、矩阵推导或在具体引擎中的实现,我可以提供更详细的说明。