如何表示一个4x4矩阵的旋转?

12

给定x、y、z旋转矩阵的定义,如何将它表示为一个完整的矩阵?只需将x、y和z矩阵相乘即可。

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浮点值,稍后我会将其转换为矩阵,以便与其他平移/缩放/旋转组合。

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

Rotation rotation; rotation.SetX(45); rotation.SetY(90); rotation.SetZ(180);

那么应用旋转的顺序实际上非常重要?或者在使用旋转类时,接受它们按照x、y、z的顺序应用是安全的吗?


这里有答案:[https://dev59.com/blTTa4cB1Zd3GeqPweL9#5188904]。 - Glenn
3个回答

8

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

编辑:

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

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
请注意,可能不是您期望的旋转(请记住,在三维中,旋转不可交换)。 - user168715
但请注意,组合的顺序很重要——矩阵乘法不是可交换的,不同轴的旋转也不是可交换的。 - walkytalky
1
首先,确定应用旋转的顺序(比如先X再Y然后Z)。然后,还取决于您的约定是将点表示为行向量还是列向量。对于行向量,您有 ((r*X)*Y)*Z = r*(XYZ) — 而对于列向量,您有 Z*(Y*(X*c))=(ZYX)*c - comingstorm
我已经更新了我的问题,请您能再进一步澄清一下吗? - Mark Ingram

2
实际上,你应用旋转的顺序非常重要。
你所需的顺序取决于你想让旋转做什么。例如,如果你正在建模一个飞机,你可能希望先进行横滚(沿着机身的长轴旋转),然后是俯仰(沿着另一个水平轴旋转),最后是航向(沿着垂直轴旋转)。这是因为,如果你首先进行航向旋转,飞机将不再与其他轴对齐。此外,你需要处理约定:这些轴中哪些对应X、Y和Z?
通常,你只想为特定应用程序选择特定的旋转顺序。定义一个通用的“XYZ旋转”对象并没有太多意义;通常,你会有通用的变换(即可以是任何旋转、平移等的矩阵)以及各种获取它们的方式(例如rotX、rotY、translate、scale...),还可以通过矩阵乘法以特定顺序应用它们。
如果你想要表示旋转而不含其他内容的东西,你可以考虑四元数(如anand所建议的)。但是,你仍然需要决定旋转的顺序,而且再次强制规定一个必需的顺序并没有太多意义。

1

顺便提一下,如果你在开发活动中还处于早期阶段,你可能想考虑使用四元数旋转。它相对于基于矩阵的方法有许多比较优势


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接