计算两个未知点之间的俯仰角和偏航角

5

我已经在一个三维空间中使用点(X、Y、Z)进行工作,并想要计算两个点之间的俯仰角和偏航角。

我的当前代码:

pitch = (float) (1/Math.tan((Y1 - Y2) / (Z1 - Z2)));
yaw = (float) (1/Math.tan((X1 - X2) / (Z1 - Z2)));

在运行时,X1、X2、Y1、Y2、Z1、Z2都是未知的,直到此时它们才从两个随机生成的点中收集。

但出现了一些问题,我的结果明显错误,我尝试了许多不同的组合并搜索了无数内容,但一无所获。

一些限制条件包括:

  1. 俯仰角只能小于或等于90°,或大于或等于-90°(90°≥ pitch ≥ -90°)
  2. 永远没有翻滚,因此不适用
  3. 在程序中声明之前,所有坐标都是未知的
  4. 俯仰角始于Z轴,即前后方向,其中向上的俯仰为正
  5. Y为上方,Z为前后方向,X为侧面
  6. 偏航角始于直接朝向Z轴

这是我第一次处理3D角度,我已经读到俯仰和偏航可以分别计算,就像我的示例中,在两个不同的2D平面上进行计算,但这样并不起作用。

任何帮助都将不胜感激。

1个回答

9
也许这可以帮助你。这是由LucasEmanuel制作的教程,它是关于Minecraft的俯仰和偏航计算,但是它也适用于你的情况!
首先,你需要计算delta x、y、z:
double dX = first_location.getX() - second_location.getX();
double dY = first_location.getY() - second_location.getY();
double dZ = first_location.getZ() - second_location.getZ();

接下来,您需要计算偏航角:

double yaw = Math.atan2(dZ, dX);

并为此提出的建议:

double pitch = Math.atan2(Math.sqrt(dZ * dZ + dX * dX), dY) + Math.PI;

如果你需要矢量图,则应按以下方式进行:
double X = Math.sin(pitch) * Math.cos(yaw);
double Y = Math.sin(pitch) * Math.sin(yaw);
double Z = Math.cos(pitch);

Vector vector = new Vector(X, Z, Y);

原始教程

基本上计算应该是一样的。 如果这并没有帮助到你,我很抱歉!


这会导致弧度还是角度? - pathurs
我认为这是度数,但我不确定。^^正如我所说,这不是来自我! - Gerret
仍在检查一些微调和其他问题,所以尚未接受。 - pathurs
1
以防万一有人来到这个问题并且也想知道是角度还是弧度,答案是弧度。请参考Java Math库文档获取更多信息。 - JolonB
你可以通过以下方式将角度转换为弧度: lat_radians = lat_degrees * (M_PI / 180); long_radians = long_degrees * (M_PI / 180); 高度 = _altitude; - Earl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接