4

我一直在处理 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 => 音高 => -90)
  2. 从来没有卷所以不适用
  3. 在程序中声明之前,所有坐标都是未知的
  4. 俯仰沿 Z 轴开始,即向前/向后,向上俯仰为正
  5. Y 向上,Z 向前/向后,X 向侧面
  6. 偏航开始正对着 Z 轴

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

非常感谢任何帮助。

4

1 回答 1

7

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

原创教程

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

于 2013-08-12T11:06:02.740 回答