Transform旋转缩放平移变换

wen java案例 2

本文目录导读:

Transform旋转缩放平移变换

  1. 平移变换(Translation)
  2. 旋转变换(Rotation)
  3. 缩放变换(Scale)
  4. 变换的复合(组合顺序很重要!)
  5. 在引擎中的实际表现(以 Unity 为例)

在计算机图形学、游戏开发(如 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)

变换的复合(组合顺序很重要!)

矩阵乘法不满足交换律,因此应用变换的顺序非常关键。

常见的两种顺序:

  1. TRS(先缩放,再旋转,最后平移)
    这是最常用的顺序(如 Unity、OpenGL):
    [ M = T \times R \times S ]

    • 先缩放(绕本地原点)
    • 再旋转(绕本地轴)
    • 最后平移(到世界位置)
  2. 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 顺序:先缩放,再旋转,最后平移。

如果你需要我进一步解释四元数旋转矩阵推导在具体引擎中的实现,我可以提供更详细的说明。

抱歉,评论功能暂时关闭!