【问题标题】:Calculate Pitch and Yaw between two unknown points计算两个未知点之间的 Pitch 和 Yaw
【发布时间】:2013-08-12 10:36:20
【问题描述】:

我一直在处理 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 平面上,但这不起作用。

非常感谢任何帮助。

【问题讨论】:

    标签: java computational-geometry angle


    【解决方案1】:

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

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

    【讨论】:

    • 这会导致弧度还是度数?
    • 我认为是度数,但我不确定。 ^^ 正如我所说,这不是我的!
    • 仍在检查一些调整等,所以还没有接受
    • 以防万一有人提出这个问题并且想知道它是度数还是弧度,答案是 弧度。更多信息请参考Java Math library documentation
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 2016-10-25
    • 1970-01-01
    • 2019-06-19
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多