我希望为飞机模拟生成一些3D轨迹数据。
这个想法是飞机在某个位置x
起飞并继续以某个平均上升速度a_v
和角度a_theta
上升,直到达到最大高度m_a
。然后飞机将在其m_a
处继续行驶,直到距离目的地d_d
一定距离,此时它将以某个角度d_theta
开始下降,平均下降速度为{ {1}}。最后,飞机降落在目的地d_v
。
我希望该函数返回一个3D点列表。
我希望在Python(首选)或C#中实现它。
出于说明目的:
有谁知道我怎么能做到这一点?是否有一些开源项目可以做到这一点?我一直在寻找一段时间,但没有找到任何东西。
答案 0 :(得分:0)
我建议你通过两个独立的步骤解决问题,这样飞机就不会穿过地面了:
对于1.您可以使用spherical interpolation techniques on 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);
}
答案 1 :(得分:0)
你没有写任何代码,所以我也不会写任何代码。使用math
包的Python足以解决这个问题。
必修步骤:
a_theta
旋转。找到它达到m_a
高度的点。d_theta
旋转。找到它达到m_a
高度的点。EarthRadius + m_a
要获取3D积分列表,您不需要a_v
,d_v
或d_d
。