这个问题存在一些问题。
首先,我认为直接请求代码并不是一个好的做法。相反,应该展示你尝试过的代码,并询问其中的错误或更好的方法,或者可能有帮助的库。
我建议重新表述你的问题。现在看起来像“有人能帮我做作业吗?”
你遇到了什么问题?也许你不想实现矩阵乘法,而是想知道已经实现了它的库,或者你不知道如何调用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。