我已经知道执行旋转必须使用的矩阵。如果必须先在z轴上旋转,然后在x轴上旋转,我将分两步进行。我的问题是,是否可以将两个旋转组合成一个矩阵?感谢您的反馈。

#1 楼

(此答案与Stefan的答案基本相同,但我想添加一些有关行向量和列向量以及如何确定要使用的向量的细节。)

是的,这是可能的,但是细节取决于有关将向量表示为行还是列的说明。

列向量

如果使用列向量,通常将左乘以矩阵来变换它们:

vector = mRotateZ * vector;
vector = mRotateX * vector;


当然,您也可以一步完成此操作:

vector = mRotateX * mRotateZ * vector;


但是矩阵乘法是关联的,这意味着先执行哪个乘法都没关系:

A * B * C = (A * B) * C = A * (B * C)


因此我们可以编写

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;


我们现在创建了一个矩阵,等效于首先旋转Z,然后旋转X。对于任何数量的转换,这都很简单。请注意,转换是从右到左应用的。

行向量

如果另一方面,如果您使用行向量,则通常将矩阵右乘:

vector = vector * mRotateZ;
vector = vector * mRotateX;


再一次编写,我们得到

vector = vector * mRotateZ * mRotateX;


,可以将其重写为

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;


请注意,在这种情况下,转换是从左到右应用的。

评论


$ \ begingroup $
我很高兴这种关联性评论容易被误解
$ \ endgroup $
– joojaa
2015年10月13日,下午3:55

$ \ begingroup $
@joojaa我不知道您的意思是什么,但我已尝试澄清这一点。
$ \ endgroup $
–马丁·恩德(Martin Ender)
2015年10月13日在7:36

$ \ begingroup $
对于外行人来说,将事物相乘的顺序和元素相乘的顺序很难分开。
$ \ endgroup $
– joojaa
15年10月13日在11:25

$ \ begingroup $
,所以他们不了解同化和交换之间的区别。因此,如果您谈到乘法的阶数,许多人可能会想到可交换性
$ \ endgroup $
– joojaa
2015年10月13日11:37



#2 楼

是的,只需以相反的顺序将它们相乘:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);


编辑。
我的答案仅在使用列向量的情况下适用。请参阅MartinBüttner的详细答案。

评论


$ \ begingroup $
很抱歉,我不明白。您所说的“逆序”到底是什么意思?
$ \ endgroup $
– JORGE
2015年10月9日在20:21

$ \ begingroup $
x乘以z而不是z乘x;
$ \ endgroup $
– Stefan Agartsson
2015年10月9日在20:27

$ \ begingroup $
实际上,顺序是任意的,一个可以使用行向量建模,另一个可以对列向量建模。两者的计算结果相同,但是乘法顺序改变。但是,是的,这是正确的答案。
$ \ endgroup $
– joojaa
2015年10月10日,下午5:11

$ \ begingroup $
Joojaa,感谢您澄清这一点!行矩阵表示乘法的倒序,对吗?
$ \ endgroup $
– Stefan Agartsson
2015年10月10日19:55

#3 楼

从数学:


从单元四元数到SO(3)(旋转组)有2:1的同态。


什么这(基本上)意味着:


每个方向都可以表示为四元数
四元数表示一个旋转
四元数相乘会生成另一个四元数(闭包) ,并且等效于组成旋转。
因此,任何数量的旋转都可以表示为一个旋转!

考虑一下。从对象空间开始,您只需要旋转一次就可以将对象旋转到任何方向。


我想指出的是,引入四元数不仅仅是随机的数学运算。与其他答案相反,图形中最受欢迎的方法实际上是将旋转表示为四元数,因为它们占用的空间较小且合并起来更快。

有许多可通过Google搜索的方法可以在旋转之间进行转换矩阵和四元数,具体取决于您的偏好。关键是旋转是数学意义上的四元数,因此它们的组合也是单旋转。