A C++;函数用于计算和采样三维空间中的弹丸轨迹。物理编程 我需要编写C++中的一个函数,可以对物体在三维空间中的轨迹曲线进行建模和采样。 问题陈述:

A C++;函数用于计算和采样三维空间中的弹丸轨迹。物理编程 我需要编写C++中的一个函数,可以对物体在三维空间中的轨迹曲线进行建模和采样。 问题陈述:,c++,3d,physics,projectile,C++,3d,Physics,Projectile,该函数需要将3个参数作为输入。函数原型可能如下所示: void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass) { //... } Vec3方向是一个结构。它本质上是3个浮点数,作为描述初始冲量角的单位向量 浮动脉冲是脉冲强度的大小 浮动质量描述被投影对象的质量 该函数将取这3个参数,然后预先计算这个质量的物体的轨迹,给定这个瞬时脉冲,沿着这个向量发射 它将通过在飞行的前4秒钟内采集轨道样本(比

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

void CalculateAndSampleTrajectory(Vec3 direction, float impulse, float mass)
{
  //...
}
Vec3方向是一个结构。它本质上是3个浮点数,作为描述初始冲量角的单位向量

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

浮动质量描述被投影对象的质量

该函数将取这3个参数,然后预先计算这个质量的物体的轨迹,给定这个瞬时脉冲,沿着这个向量发射

它将通过在飞行的前4秒钟内采集轨道样本(比如200个)来实现这一点。这些样本将是射弹位置的矢量,并存储在阵列中

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

我已经学到的是: 这个问题涉及许多物理学,特别是经典力学。这方面不是我的强项,但我对正在发生的事情有一个基本的了解

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

Vec3 velocity = (direction * impulse)/mass;
我认为这是可行的,因为我的脉冲会瞬间产生,因此这将是f=ma重新排列,以找到a,但作为一个3D向量。老实说,我甚至不确定这是否正确,但我认为是的

一旦我有了速度,我知道我可以使用丰富的方程,如

我不太擅长把这些方程解释成C++。< /P> 在建立了适当的方程式之后,我需要在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;
}
for(int i=0;i<200;i++)
{
int t=0;
//带t的样本方程
//将生成的vec3 pos存储在数组中
t=t+0.02;
}
t处,我的方程的解将作为当时对象位置的坐标给出,并且应该有3个参数(x,y,z),因此它将存储在Vec3中

我需要帮助的地方: 我不知道如何做必要的物理编程,使我的方程正确设置,以便能够进行采样。我不能把维基百科和其他来源的物理理论讨论变成C++函数。
感谢您提供的任何帮助。

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

这将为您提供时间
t
(从
t0
)的位置

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

在你的例子中,重力在时间上是恒定的,它主要是一个向量3,指向下,带有一个前缀量(9.8 m/s^2)

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


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

首先用vec3表示(0,0,0)处的位置,对于每个deltaT(=0.02s)和每个x、y、z方向,通过v*deltaT更改坐标,然后根据所知更新v(例如y速度下降9.81*deltaT,假设y为正)同样,我的循环中有一个错误“int t”应该是“float t t”。这个问题似乎离题了,因为它是关于物理的,而不是编程的。正如“我需要帮助的地方”中所讨论的我不知道如何将物理公式转换为编程。我认为物理学家在这方面帮不了我,只有懂物理的程序员才能帮我。所以我相信这是一个主题,因为它仍然是关于编程的。我的循环中还有另一个错误。不应该在里面声明。我在编写循环示例时很草率。所以S(t)是我的位置,在时间t S0是我的初始位置,V0是初始速度,是重力。我是不是把所有的都做对了?这是为了模拟我的轨迹。我只需要正确的公式,结果我可以把它翻译成C++。谢谢。