我正在研究太空船模拟器,并且遇到两个空间物体之间的弧线问题。 每个对象都有一个如下定义的旋转矩阵:
//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 |的向量方向 - | object1 |和| b |是row1(前弧),row2(右舷弧)或row3(上弧)。我做错了,因为它没有按预期行事。 所以我正在寻求帮助,找到我犯错误的地方。
P.S。偏航,俯仰和滚转以度(0-360)存储,并通过乘以PI / 180.0转换为rad。
答案 0 :(得分:1)
我认为你通过在滚动,俯仰和偏航方面描述轴承来错误地解决问题。这些是欧拉角,描述了宇宙飞船在船舶当前坐标系本身方面的运动。这些角度不是独立的,当其中一个角度为±90°时会产生问题。如果你想描述船的运动,滚动,俯仰和偏航是很有用的。
我会以不同的方式对你的情况进行建模:每艘船都有一个位置{P},它在全球笛卡尔x,y,z系统中给出。它还具有一个方位,在全局空间中给出三个正交向量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代表up。这描述了一个左手系统。我建议使用右手系统,因为这几乎是所有笛卡尔系统所遵循的。例如,你可以使用u代表前锋,y代表右舷,w代表向下。
您可以在球面坐标中用w方向的天顶表示笛卡尔向量{s}。这将给出物体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。这将为您提供投影到该平面上的距离矢量的角度。