欧拉的角度旋转

时间:2014-02-18 09:31:22

标签: rotation cartesian-coordinates

从三维笛卡尔坐标,对象A的坐标可以表示为xyzwpr(绿色箭头)。从对象A的坐标世界,对象B也可以表示为xyzwpr(蓝色箭头)。

然后任何人都可以写下C#代码来计算对象B的xyzwpr相对于原始坐标系(红色箭头)吗?

说A的坐标是(30,50,70,-15,44,-80)B(60,90,110,33,150,-90)。

并且说旋转的顺序是偏航(z) - > pitch(x) - >辊(y)的

rotation

---编辑---

任何人都可以验证以下假设吗?

B点xyz的假设。

点B的xyz,较小的飞机,可以通过添加点A的Ayz,第一架飞机和B的xyz来计算,然后在A的xyz上应用A的wpr的三维旋转。

这样做的顺序是;

1)将A点转换为原点(减去A,由-Ax,-Ay,-Az翻译)

2)围绕原点旋转(可以使用A的3×3矩阵R0)

3)然后翻译回来。 (添加A,即+ Ax,+ Ay,+ Az)

B点的wpr假设 只是两点轮换的继承。 AwApArBwBpBr。

---已解决。一些参考文献详细解释和代码---

Global frame-of-reference VS Local frame-of-reference

3D matrix rotation about an arbitrary point

Euler to matrix conversion

1 个答案:

答案 0 :(得分:2)

这个问题有一些问题。

首先,我认为直接请求代码并不是一种好习惯。相反,展示您尝试过的代码,询问代码中的错误,或者更好的方法,或者可以帮助您的库。

我建议改述你的问题。现在它看起来像“任何人都可以做我的作业吗?”。

你面临什么问题?也许您不想实现矩阵乘法,并且您想知道已经执行过它的库,或者您不知道如何调用atan2。

一旦你得到矩阵乘法,转换矩阵构建,旋转矩阵构建和atan2(由你自己或由库制作),你只需要(伪代码):

Matrix c = a;
Matrix yaw, pitch, roll;
Matrix pos;

buildTranslationMatrix(pos, x, y, z);
buildRotationZMatrix(yaw, w);
buildRotationXMatrix(pitch, p);
buildRotationYMatrix(roll, r);

mult (c, c, pos);    //c = c*pos

mult (c, c, yaw);    //c = c*yaw
mult (c, c, pitch);
mult (c, c, roll);

decomposePos(c, x, y, z);  // obtain final xyz from c
decomposeAngles(c, w, p, r);   // obtain final wpr from c

注意后乘法。

希望我提出建设性的批评。 :)

修改

第二个假设是正确的。

也许我误解了第一个,但我认为这是错误的。因为我更习惯于转换矩阵而不是欧拉角(你指出了那个链接),我这样理解:

为了获得xyz(以及wpr),我将计算包含所有值的变换矩阵。在原始坐标系中,第二个平面的最终变换矩阵计算如下:

M = TA * RA * TB * RB

TA是平面A的平移矩阵,RA是其旋转矩阵)

转换矩阵可以这样理解:

    r r r t
    r r r t
M = r r r t
    s s s w

我们只关心轮换和翻译。如果你乘以TA*RA

1 0 0 x   r r r 0   r r r x
0 1 0 y   r r r 0   r r r y
0 0 1 z * r r r 0 = r r r z
0 0 0 1   0 0 0 1   0 0 0 1 

这就是我们如何理解A的坐标系。请记住,这意味着首先旋转,就像它在原点一样,然后转换到位置x,y,z。后乘法意味着实习变换,移动坐标系中的变换。因此,如果我们继续后乘法,我们将合成最终的变换矩阵。

此外,矩阵是关联的,所以

M = (TA * RA) * (TB * RB)

相同
M = ((TA * RA) * TB) * RB

重演

xyz将位于M的最后一列,wpr必须从M的3 * 3子矩阵中分解。