2010-10-20 136 views
8

给出x,y,z旋转矩阵的下列定义,我如何将其表示为一个完整矩阵?只需乘以x,y,&矩阵?如何表示4x4矩阵旋转?

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 float值,后来我将它转换为矩阵以便与其他值相结合呃翻译/尺度/旋转。

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

旋转的旋转;旋转.SetX(45);旋转90°(90);旋转180°旋转。旋转180°(180°)。

那么这对于应用旋转的顺序其实非常重要?或者是否安全地假设在使用旋转类时,您接受它们是以x,y,z顺序应用的?

+0

这是回答[这里](http://stackoverflow.com/questions/5188876/rotation-matrix-given-angle-and-point-in-x-y-z/5188904#5188904)。 – Glenn 2013-12-12 01:01:06

回答

6

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

编辑:

您应用乘法矩阵将决定轮换将被应用到该点的订单的订单。

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 
+1

请注意,它可能是也可能不是你期望的旋转(记住比在3D中,旋转不会通过) – user168715 2010-10-20 21:26:49

+0

但请注意组成的顺序很重要 - 矩阵乘法不是可交换的,也不是旋转不同的轴。 – walkytalky 2010-10-20 21:29:28

+0

首先,决定应用旋转的顺序(如X然后Y然后Z)。然后,它也取决于您的点是行向量还是列向量的惯例。对于行向量,您有'((r * X)* Y)* Z = r *(XYZ)' - 与列向量,您有'Z *(Y *(X * C))=(ZYX) * c'。 – comingstorm 2010-10-20 23:29:20

2

它实际上是非常重要的,你申请什么样的顺序在旋转。

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

通常,您只想为特定应用程序选择特定的旋转订单。定义一个通用的“XYZrotation”对象没有什么意义;通常情况下,您将拥有一般转换(即可以是任何旋转,翻译等级的矩阵)以及获取它们的各种方式(例如,rotX,rotY,translate,scale ...)以及应用程序的能力他们以特定的顺序(通过矩阵乘法)。

如果你想要的东西只能代表旋转而没有别的东西,你可能会考虑四元数(作为anand建议)。但是,您仍然需要决定执行旋转的顺序,并且再次,硬连线所需的顺序也没有意义。