从三维笛卡尔坐标,对象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)的
---编辑---
任何人都可以验证以下假设吗?
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
答案 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子矩阵中分解。