3d 矢量的三维Z-Y-X旋转

3d 矢量的三维Z-Y-X旋转,3d,matrix,rotation,3d,Matrix,Rotation,我试图通过创建一个从世界到新旋转的旋转矩阵来旋转一个三维向量。我先绕Z轴旋转,然后绕Y轴旋转,最后绕X轴旋转,使用右手符号 我使用的矩阵可以在维基百科()上找到。在转换矩阵列表中,它位于页面中间稍下方。我正在使用ZYX one: 我现在创建它,Z轴旋转+45度,Y轴旋转+45度,没有X轴旋转。这给了我以下矩阵: [ 0.5 -0.707 0.5 ] [ 0.5 0.707 0.5 ] [ -0.707 0.0 0.707 ] 现在我用下面的向量乘以它: [ 10

我试图通过创建一个从世界到新旋转的旋转矩阵来旋转一个三维向量。我先绕Z轴旋转,然后绕Y轴旋转,最后绕X轴旋转,使用右手符号

我使用的矩阵可以在维基百科()上找到。在转换矩阵列表中,它位于页面中间稍下方。我正在使用ZYX one:

我现在创建它,Z轴旋转+45度,Y轴旋转+45度,没有X轴旋转。这给了我以下矩阵:

[  0.5   -0.707 0.5   ]
[  0.5    0.707 0.5   ]
[ -0.707  0.0   0.707 ]
现在我用下面的向量乘以它:

[ 10 ]
[  0 ]
[  0 ]
可以看出,它是一个沿x轴的10单位长的向量。我预计旋转后的结果在x、y和z场中大约为6(z为负),因为这给出了长度大约为10的向量。即向量首先在世界x轴和y轴之间精确旋转(第一次z轴旋转),然后从那里向下倾斜45度,最后在x-y平面和负z轴之间精确旋转(第二次y轴旋转)。在我看来,这意味着三个同样长的单位向量代表这个向量

但是,我的matrix类和所有其他程序都给出了这个向量:

[  5    ]
[  5    ]
[ -7.07 ]

这似乎是正确的,因为它的长度是预期的10。所以问题是我错在哪里?我肯定我在某个明显的地方犯了一些愚蠢的想法错误,因为它肯定没有三条等长的手臂:p

记住,第二次旋转是相对于轴的,而不是相对于向量的。在XY平面中旋转后,想象整个平面绕Y轴旋转45度。这与直接向上扭曲旋转矢量(即围绕X=-Y旋转)直到其与XY平面成45度不同。很难解释,但我希望这能有所帮助:-)


(编辑:使轴正确旋转)

ZYX Euler角度旋转矩阵定义为

R_ZYX(dz, dy, dx) = R(Z, dz) * R(Y, dy) * R(X, dx)
有两种不同的方式来读取旋转顺序:从左到右或从右到左。从左到右读取时,旋转是围绕坐标系的局部轴进行的,这是正确的。只有从右向左读取时,旋转才是关于固定坐标系的

现在要回答这个问题,让我们计算旋转向量的所有坐标都具有相同绝对值的角度
dy

r
v
的长度,设
a
为绝对坐标值。Pythogoras认为,
a^2+a^2+a^2=r^2
,因此
a=r/sqrt(3)
。旋转矢量相对于XY平面的角度为
dy=asin(a/r)=asin(1/sqrt(3))
,约为35.3度。此角度与您当前使用的45度(或
asin(1/sqrt(2))
弧度)不同

测试(使用Python和库):

输出:

ZYX Euler angle transformations:
(5.774, 5.774, -5.774)
(5.000, 5.000, -7.071)

dz=dy=pi/4
的最后一行显示程序与您的Euler角实现一致。

好吧,假设我想先在x-y平面上旋转我的系统45度,然后在新旋转的系统中围绕y轴画一个圆(比如半径为10个单位)。我想把它分成359个等长的部分(计算360个点)。就我所见,使用这个矩阵,如果我让y旋转角度为每个点增加1度,那么圆的所有部分的线段长度将不相等。我该怎么做呢?对我来说,重要的特性是角度与计算点成比例。没关系,我现在知道它是如何工作的。正如我所写的,一切都是正确的,只是我没有看到它们是如何结合在一起的。在X-Y平面上成45度角的矢量由沿X轴和Y轴的两个5单位长度矢量描述。这意味着角度向量的长度为sqrt(5^2+5^2),即7.07。因此,如果两个臂的长度为5,一个臂的长度为7.07,那么我们在所有三维中都有一个完美的45度角向量。就这么简单!
ZYX Euler angle transformations:
(5.774, 5.774, -5.774)
(5.000, 5.000, -7.071)