5

我需要用 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 向量。老实说,我什至不确定这是否正确,但我认为它是正确的。

一旦我有了速度,我就知道我可以使用在线可用的丰富方程,例如关于轨迹的维基百科文章

我不太擅长将这些方程式解释为 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 中。

我需要帮助的地方:

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

感谢您提供任何帮助。

4

1 回答 1

3

Basically there is just one equation relevant to your problem, which is

enter image description here

which gives you the position at time t (from a t0).

Now, you've already got s0 and you have got v0, which is the initial velocity, already calculated from the impulse. What you need is the acceleration.

In your case you just have gravity which is constant in time and it's mostly a vec3 pointing down with a prefixed amount (9.8 m/s^2).

You don't need to calculate the values at each step, since you can integrate the value directly, the next step result doesn't depend from the previous.

This is not considering any form of drag force, otherwise you must include it.

于 2014-07-31T18:02:19.387 回答