欧拉角旋转

3

从三维笛卡尔坐标系,物体A的坐标可以表示为xyzwpr(绿色箭头)。而从物体A的坐标系中,物体B也可以表示为xyzwpr(蓝色箭头)。

那么,有谁能编写C#代码来计算相对于原始坐标系统(红色箭头)的物体B的xyzwpr?

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

并且假设旋转的顺序是偏航角(z)->俯仰角(x)->横滚角(y)。

rotation

--- 编辑 ---

有谁能验证以下假设吗?

关于点B的xyz假设。

点B的xyz,即较小的飞机,可以通过添加点A的xyz和B的xyz,然后将A的wpr的3D旋转应用于A的xyz来计算。

操作顺序如下:

1)将A点翻译到原点(减去被-Ax,-Ay,-Az翻译的A)

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

3)然后再翻译回来(加上由+Ax,+Ay,+Az翻译的A)

关于点B的wpr假设 仅是两个点的连续旋转。AwApArBwBpBr。

--- 已解决。一些详细说明和代码的参考资料 ---

全局坐标系与本地坐标系

关于任意点的3D矩阵旋转

Euler角转矩阵转换


http://nghiaho.com/?page_id=846 - somatic rev
1个回答

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

总结

M的最后一列将包含xyz,并且需要从M的3*3子矩阵中分解出wpr。


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