3

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

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

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

并说旋转的顺序是 yaw(z)-> pitch(x) -> roll(y)

回转

- - 编辑 - -

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

假设 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。

- - 解决了。一些带有详细解释和代码的参考资料---

全局参考系 VS 局部参考系

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

欧拉到矩阵的转换

4

1 回答 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

概括

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

于 2014-02-23T16:03:17.883 回答