gpt4 book ai didi

计算两个 3d 旋转矩阵之间的面对弧

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:27 25 4
gpt4 key购买 nike

我正在研究 spaceship 模拟器,在处理两个太空物体之间的弧线时遇到了问题。每个对象都有一个旋转矩阵,定义如下:

//Top row
rotation[0][0] = cos(pitch)*cos(yaw);
rotation[0][1] = -sin(yaw)*cos(pitch);
rotation[0][2] = sin(pitch);
//Middle row
rotation[1][0] = cos(yaw)*sin(pitch)*sin(roll) + sin(yaw)*cos(roll);
rotation[1][1] = -sin(yaw)*sin(pitch)*sin(roll) + cos(yaw)*cos(roll);
rotation[1][2] = -cos(pitch)*sin(roll);
//Bottom row
rotation[2][0] = -cos(yaw)*sin(pitch)*cos(roll) + sin(yaw)*sin(roll);
rotation[2][1] = sin(yaw)*sin(pitch)*cos(roll) + cos(yaw)*sin(roll);
rotation[2][2] = cos(pitch)*cos(roll);

还有 XYZ 坐标。

使用此信息,我需要能够确定 object1 和 object1 之间的 90 度弧:前向、右舷、左舷、后部、背侧(上)和腹侧(下)我试图使用以下公式:

arc = acos( sum(a*b) / ( sqrt(sum(a * a)) * sqrt(sum(b * b)) ) )

哪里|a|是 |object2| 的 vector 方向- |对象1|和|b|是 row1(前弧)、row2(右舷弧)或 row3(上弧)。我做错了什么,因为它没有按预期运行。所以我请求帮助找出我在哪里犯了错误。

附言偏航、俯仰和滚动以度 (0-360) 存储,并通过乘以 PI/180.0 转换为弧度。

最佳答案

我认为您通过滚动、俯仰和偏航来描述轴承是错误地解决了问题。这些是欧拉角,根据飞船的当前坐标系本身描述飞船的运动。这些角度不是独立的,当其中一个角度为±90°时会出现问题。如果您想描述船舶的运动,横摇、俯仰和偏航非常有用。

我会以不同的方式为您的案例建模:每艘船都有一个位置 {P},它在全局笛卡尔 x、y、z 系统中给出。它还有一个方位角,在全局空间中以三个正交 vector u、v、w 给出。然后你还会有一个旋转矩阵:

      | ux   vx   wx |
[R] = | uy vy wy |
| uz vz wz |

然后您可以描述任何其他具有位置 S 的物体在船的局部坐标系中的位置:

{s} = [R] · {S - P}

注意事项:

  • 您可以通过确定 {s} = {su, sv, sw} 的最大绝对分量来确定从您的飞船以哪种方式查看其他物体的最佳方式。例如,如果 s = {-12, 8, 10},则对象在您身后。 (或者,也许更准确地说,它比其他五个方向中的任何一个都在您身后;船尾是主要方向)如果 s = {2, -5, 8},则对象在你下面。

  • 您使用 u 表示向前,y 表示右舷,z 表示向上。这描述了一个左手系统。我建议使用右手系统,因为几乎所有笛卡尔系统都符合这一点。例如,您可以使用 u 表示向前,y 表示右舷,w 表示向下。

  • 您可以在球坐标系中表示笛卡尔 vector {s},顶点在 w 方向。这将为您提供物体的距离 r 和两个独立的角度,船的 (u, v) 平面中的方位角和描述物体从该平面的仰角的天顶。

  • 当您的船移动时,您可以通过横摇、俯仰和偏航更新全局方位。

  • 您仍然可以使用上面的公式计算您想要的弧。在船舶坐标中使用 {s} = {su, sv, sw},您的引用轴是 u = {1, 0, 0},v = {0, 1, 0} 和 w = {0, 0, 1} :

    uarc = acos(su / r)
    varc = acos(sv / r)
    warc = acos(sw / r)

    这里,r 是距离,r² = {s}·{s}。您计算的弧线不是很有用。他们告诉你轴和物体之间的角度,但这些角度是不明确的。计算平面中的角度可能更好,例如

    uvarc = atan2(sv, su)
    vwarc = atan2(sw, sv)
    wuarc = atan2(su, sw)

    零度引用是表达式中的第二个轴,即 u 代表 uvarc。这将为您提供投影到该平面上的距离 vector 的角度。

关于计算两个 3d 旋转矩阵之间的面对弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com