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

时间:2013-08-12 10:36:20

标签: java computational-geometry angle

我一直在使用3D空间中的点(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轴
  7. 这是我第一次使用3D角度,我已经读过,可以单独计算俯仰和偏航,如我的例子所示,在两个不同的2D平面上,但这不起作用。

    任何帮助都非常感激。

1 个答案:

答案 0 :(得分:4)

也许这会对你有所帮助。这是一个由 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);

Original Tutorial

基本上计算应该是相同的。 如果它没有帮助你,我很抱歉!