【问题标题】:A C++ function to calculate and sample the trajectory of a projectile in 3D space. Physics programming用于计算和采样 3D 空间中弹丸轨迹的 C++ 函数。物理编程
【发布时间】:2014-07-31 17:48:25
【问题描述】:

我需要用 C++ 编写一个函数,可以对在 3D 空间中移动的物体的轨迹曲线进行建模和采样。

问题陈述:

该函数将需要 3 个参数作为输入。函数原型可能如下所示:

void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
  //...
}

Vec3 方向 是一个结构体。它本质上是 3 个浮点数,表现为描述初始脉冲角的单位向量。

浮动脉冲是脉冲强度的大小。

浮动质量描述了被投射物体的质量。

该函数将采用这 3 个参数,然后预先计算具有此质量的物体的轨迹,给定此瞬时脉冲,沿此向量射击。

它会通过在飞行的前 4 秒内对轨迹进行采样(比如说 200 个)来做到这一点。这些样本将是弹丸位置的 Vec3 并存储在一个数组中。

所有单位均以 SI 给出,重力加速度为 9.81。我们不会考虑任何空气阻力。

我已经学到了什么:

这个问题涉及很多物理学,尤其是经典力学。这个领域不是我的强项,但我对正在发生的事情有一个基本的了解。

我知道我需要物体的速度,我认为可以这样计算:

Vec3 velocity = (direction * impulse)/mass;

我认为这是可行的,因为我的冲动会立即应用,因此这将是重新安排的 f=ma 以找到 a,但作为 3D 矢量。老实说,我什至不确定这是否正确,但我认为它是正确的。

一旦我掌握了速度,我就知道我可以使用网上提供的丰富方程式,例如Wikipedia article on Trajectory

我不太擅长将这些方程式解释为 C++。

设置适当的方程后,我需要在 4 秒内采集 200 个样本。这可以循环完成:

for(int i = 0; i < 200; i++)
{
    int t = 0;
    //sample equation with t
    //store resulting vec3 pos in array
    t = t + 0.02;
}

我的方程在 t 处的解将作为当时对象位置的坐标给出,并且应该有 3 个参数 (x,y,z),因此它将存储在一个 Vec3。

我需要帮助的地方:

我不知道如何进行必要的物理编程来正确设置我的方程以便能够对其进行采样。我无法将 Wikipedia 和其他来源上关于物理学的理论讨论解释为 C++ 函数。

感谢您提供的任何帮助。

【问题讨论】:

  • 从 vec3 开始,位置在 (0,0,0),对于每个 deltaT(您的情况 = 0.02s),对于每个 x、y、z 方向,将坐标更改为v*deltaT,然后根据你所知道的更新 v(例如 y 速度减少 9.81 * deltaT,假设正 Y 向上)
  • 另外,我的循环中有一个错误“int t”应该是“float t”
  • 这个问题似乎是题外话,因为它是关于物理,而不是编程。
  • 正如“我需要帮助的地方”一节中所讨论的,我不知道如何将物理公式转换为编程。我不认为物理学家可以在这方面帮助我,只有懂物理学的程序员才能帮助我。所以我相信这是一个话题,因为它仍然是关于编程的。
  • 我的循环中有另一个错误。 t 不应在内部声明。当我写这个例子循环时,我很草率。

标签: c++ 3d physics projectile


【解决方案1】:

基本上只有一个等式与您的问题相关,即

它会在时间为您提供t 的位置(来自t0)。

现在,您已经得到了 s0v0,这是已经从冲量计算得出的初始速度。你需要的是加速。

在你的情况下,你只是有重力,它在时间上是恒定的,它主要是一个 vec3 指向下方,带有一个前缀量 (9.8 m/s^2)。

你不需要在每一步计算值,因为你可以直接对值进行积分,下一步的结果不依赖于上一步。

这里不考虑任何形式的阻力,否则必须包含它。

【讨论】:

  • 所以 s(t) 是我在时间 t 的位置 s0 是​​我的初始位置,v0 是初始速度,a 是重力。我做对了吗?
  • 这可以为我的轨迹建模。我只需要正确的公式,结果证明我可以把它翻译成 C++。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多