代码之家  ›  专栏  ›  技术社区  ›  Mark Ingram

如何表示4x4矩阵旋转?

  •  10
  • Mark Ingram  · 技术社区  · 14 年前

    给定x,y,z旋转矩阵的以下定义,如何将其表示为一个完整的矩阵?简单地乘以x、y和矩阵?

    X旋转:

    [1 0 0 0]
    [0 cos(-X Angle) -sin(-X Angle) 0]
    [0 sin(-X Angle) cos(-X Angle) 0]
    [0 0 0 1]
    

    Y旋转:

    [cos(-Y Angle) 0 sin(-Y Angle) 0]
    [0 1 0 0]
    [-sin(-Y Angle) 0 cos(-Y Angle) 0]
    [0 0 0 1]
    

    Z旋转:

    [cos(-Z Angle) -sin(-Z Angle) 0 0]
    [sin(-Z Angle) cos(-Z Angle) 0 0]
    [0 0 1 0]
    [0 0 0 1] 
    

    编辑: 我有一个单独的rotation类,它包含一个x,y,z浮点值,稍后我将其转换为一个矩阵,以便与其他平移/缩放/旋转相结合。

    从这里的答案来看,我可以假设如果我做了如下事情:

    旋转旋转; 旋转SetY(90); 旋转SetZ(180);

    那么旋转的顺序到底是什么,这真的很重要?或者假设在使用rotation类时,您接受它们是按x、y、z顺序应用的,这样做安全吗?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Ignacio Vazquez-Abrams    14 年前

    是的,将这三个矩阵依次相乘就构成了它们。

    编辑:

    将乘法应用于矩阵的顺序将决定旋转应用于点的顺序。

    P × (X × Y × Z)     Rotations in X, Y, then Z will be performed
    P × (Y × X × Z)     Rotations in Y, X, then Z will be performed
    P × (Z × X × Y)     Rotations in Z, X, then Y will be performed
    
        2
  •  2
  •   comingstorm    14 年前

    你想要的顺序取决于你想要旋转做什么。例如,如果正在为飞机建模,可能需要先进行滚转(沿机身长轴旋转),然后进行俯仰(沿其他水平轴旋转),然后进行航向(沿垂直轴旋转)。这是因为,如果你先做航向,飞机将不再沿其他轴对齐。除此之外,您还需要处理您的约定:哪些轴对应于X、Y和Z?

    通常,您只想为特定应用程序选择特定的旋转顺序。定义一个通用的“XYZrotation”对象没有多大意义;通常,您将有通用转换(即,矩阵可以是旋转、平移等的任何串联)和各种获取它们的方法(例如,rotX、rotY、translate、scale…),加上按特定顺序应用它们的能力(通过进行矩阵乘法)。

    如果你想要的东西只能代表旋转而不能代表其他,你可以考虑四元数(正如阿南德建议的那样)。但是,您仍然需要决定在中执行旋转的顺序,而且,再次强调,硬连线所需的顺序并没有实际意义。

        3
  •  1
  •   andand    14 年前

    quaternion rotation . 它有很多 comparative advantages 基于矩阵的方法。