【问题标题】:How to represent a 4x4 matrix rotation?如何表示 4x4 矩阵旋转?
【发布时间】:2011-04-28 07:12:20
【问题描述】:

鉴于以下 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] 

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

从这里的答案来看,我可以假设如果我这样做:

旋转旋转; 旋转.SetX(45); 旋转.SetY(90); 旋转.SetZ(180);

那么,应用旋转的顺序实际上真的很重要吗?或者假设在使用旋转类时,您接受它们以 x、y、z 顺序应用它们是否安全?

【问题讨论】:

  • 这是here的回答。

标签: math matrix


【解决方案1】:

是的,将三个矩阵依次相乘即可组成。

编辑:

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

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

【讨论】:

  • 请注意,它可能是也可能不是您所期望的旋转(请记住,在 3D 中,旋转不会通勤。)
  • 但请注意,组合的顺序很重要——矩阵乘法不可交换,绕不同轴的旋转也不可交换。
  • 首先,决定应用旋转的顺序(比如 X 然后 Y 然后 Z)。然后,它还取决于您的点是行向量还是列向量的约定。对于行向量,您有 ((r*X)*Y)*Z = r*(XYZ) -- 与列向量相比,您有 Z*(Y*(X*c))=(ZYX)*c
  • 我已经更新了我的问题,请您进一步澄清一下吗?
【解决方案2】:

实际上,应用轮换的顺序非常重要。

您想要的顺序取决于您希望轮换执行的操作。例如,如果您正在为一架飞机建模,您可能希望先进行横滚(沿机身的长轴旋转),然后进行俯仰(沿另一个水平轴旋转),然后是航向(沿垂直轴旋转) )。这是因为,如果您先进行航向,则平面将不再沿其他轴对齐。除此之外,您还需要处理您的约定:这些轴中的哪些对应于 X、Y 和 Z?

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

如果您想要只能表示旋转而不能表示其他任何东西的东西,您可以考虑四元数(正如 anand 所建议的那样)。但是,您仍然需要决定执行轮换的顺序,而且为此硬连线所需的顺序也没有任何意义。

【讨论】:

    【解决方案3】:

    顺便说一句,如果您在这里的开发活动足够早,您可能需要考虑使用quaternion rotation。它有许多comparative advantages 到基于矩阵的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 2012-05-24
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多