6

我希望为飞机模拟生成一些 3D 轨迹数据。这个想法是飞机在某个位置起飞x并继续以某个平均上升速度a_v和角度上升,a_theta直到达到最大高度m_a。然后飞机将继续前进,m_a直到距离d_d目的地一定距离,此时它将以某个角度开始下降,d_theta平均下降速度为d_v。最后,飞机降落在目的地y

我希望该函数返回一个 3D 点列表。

我希望在 Python(首选)或 C# 中实现这一点。

出于说明目的:

在此处输入图像描述

有谁知道我怎么能做到这一点?是否有一些开源项目可以做到这一点?我一直在寻找一段时间,但没有找到任何东西。

4

2 回答 2

0

你没有写任何代码,所以我也不会写任何代码。带包的 Pythonmath足以解决这个问题。

所需步骤:

  • 飞机应该绕一个大圈飞行。这意味着您只需要一个距离来描述 X 和 Y。
  • 您可以将原点放置在 X 上并用纬度指定 Y。
  • 计算地球在 X 处的切线,然后旋转a_theta. 找到它到达m_a高度的点。
  • 计算地球在 Y 处的切线,然后旋转d_theta。找到它到达m_a高度的点。
  • 在前两点之间画一条圆弧,半径为EarthRadius + m_a
  • 每个坐标在大圆的 2D 中都是已知的,您只需将它们旋转回 3D 坐标。

a_v对于 3D 点列表,您不需要d_vd_d

于 2017-08-01T12:42:16.437 回答
0

我建议你分两个独立的步骤解决问题,这样飞机就不会穿过地面:

  1. 计算球体表面上的路径。
  2. 沿此路径插入高度。

对于 1. 您可以在 Quaternions 上使用球面插值技术

Quaternion slerp(Quaternion v0, Quaternion v1, double t) {
    // Only unit quaternions are valid rotations.
    // Normalize to avoid undefined behavior.
    v0.normalize();
    v1.normalize();

    // Compute the cosine of the angle between the two vectors.
    double dot = dot_product(v0, v1);

    const double DOT_THRESHOLD = 0.9995;
    if (fabs(dot) > DOT_THRESHOLD) {
        // If the inputs are too close for comfort, linearly interpolate
        // and normalize the result.

        Quaternion result = v0 + t*(v1 – v0);
        result.normalize();
        return result;
    }

    // If the dot product is negative, the quaternions
    // have opposite handed-ness and slerp won't take
    // the shorter path. Fix by reversing one quaternion.
    if (dot < 0.0f) {
        v1 = -v1;
        dot = -dot;
    }  

    Clamp(dot, -1, 1);           // Robustness: Stay within domain of acos()
    double theta_0 = acos(dot);  // theta_0 = angle between input vectors
    double theta = theta_0*t;    // theta = angle between v0 and result 

    Quaternion v2 = v1 – v0*dot;
    v2.normalize();              // { v0, v2 } is now an orthonormal basis

    return v0*cos(theta) + v2*sin(theta);
}
于 2017-08-01T12:22:24.970 回答