这个问题有一些问题。
首先,我认为直接请求代码不是一个好习惯。相反,显示您尝试过的代码,询问代码中的错误,或者更好的方法,或者可以帮助您的库。
我建议改写你的问题。现在看起来像“任何人都可以做我的作业吗?”。
您面临哪些问题?也许您不想实现矩阵乘法并且您想知道已经这样做的库,或者您不知道如何调用 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 必须从 的 3*3 子矩阵分解M
。