我需要在C ++中编写一个函数,可以对在3D空间中移动的对象的轨迹曲线进行建模和采样。
该函数需要将3个参数作为输入。函数原型可能如下所示:
void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
//...
}
Vec3方向是一个结构。它基本上是3个浮点数,表现为描述脉冲初始角度的单位向量。
浮动脉冲是冲动力的强弱程度。
浮动质量描述了投影对象的质量。
该函数将采用这3个参数,然后根据此向量拍摄的瞬时脉冲,预先计算该质量对象的轨迹。
这将通过在飞行的前4秒内采集轨迹的样本(比如说200)来实现。这些样本将是射弹位置的Vec3s并存储在阵列中。
所有单位均为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。
我不知道如何进行必要的物理编程,以便正确设置方程式以便对其进行采样。我无法将维基百科和其他来源的物理理论讨论解释为C ++函数。
感谢您提供任何帮助。
答案 0 :(得分:3)
基本上只有一个与您的问题相关的等式,即
,它为您提供t
时的位置(来自t0
)。
现在,您已经获得了s0
并且您已经获得v0
,这是初始速度,已经根据冲动计算出来。你需要的是加速度。
在你的情况下,你的重力在时间上是恒定的,并且它主要是一个以预定量(9.8 m / s ^ 2)指向下方的vec3。
您不需要计算每一步的值,因为您可以直接对值进行整合,下一步结果并不依赖于前一步。
这不考虑任何形式的阻力,否则你必须包括它。