我需要用 C++ 编写一个函数,可以对物体在 3D 空间中移动的轨迹曲线进行建模和采样。
问题陈述:
该函数需要将 3 个参数作为输入。函数原型(prototype)可能看起来像这样:
void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
//...
}
Vec3 方向 是一个结构。它本质上是 3 个 float ,充当描述脉冲初始角度的单位 vector 。
float 冲量 表示冲量的强度。
浮点质量描述了被投影物体的质量。
该函数将采用这 3 个参数,然后预先计算这个质量的物体的轨迹,给定这个瞬时脉冲,沿着这个 vector 发射。
它将通过在飞行的前 4 秒内对轨迹进行采样(假设为 200 个)来执行此操作。这些样本将是弹丸位置的 Vec3,并存储在一个数组中。
所有单位均以 SI 给出,重力加速度为 9.81。我们不会考虑任何空气阻力。
我已经学到了什么:
这个问题涉及很多物理学,尤其是经典力学。这方面不是我的强项,但我对正在发生的事情有基本的了解。
我知道我需要物体的速度,我认为它可以计算为:
Vec3 velocity = (direction * impulse)/mass;
我认为这是有效的,因为我的冲动会立即应用,所以这将是 f=ma 重新安排以找到 a 但作为 3D vector 。老实说,我什至不确定这是正确的,但我认为是正确的。
一旦我有了速度,我就知道我可以使用在线提供的大量方程式,例如 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。
我需要帮助的地方:
我不知道如何进行必要的物理编程来正确设置我的方程以便能够对其进行采样。我无法将维基百科和其他来源的物理理论讨论解释为 C++ 函数。
感谢您提供的任何帮助。
最佳答案
基本上只有一个方程式与您的问题相关,即
它为您提供时间 t
的位置(来自 t0
)。
现在,您已经得到了 s0
和 v0
,这是初始速度,已经从冲量中计算出来了。您需要的是加速。
在您的情况下,您只有随时间恒定的引力,它主要是一个指向下方的带有前缀量 (9.8 m/s^2) 的 vec3。
不需要计算每一步的值,可以直接对值进行积分,下一步的结果不依赖于上一步。
这里没有考虑任何形式的阻力,否则你必须包括它。
关于c++ - 一个 C++ 函数,用于计算和采样射弹在 3D 空间中的轨迹。物理编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065676/