实施弹丸运动

Dom*_*c K 8 c# physics

我已经在互联网上搜索了很多有用的信息,但他们是数学网站试图告诉我如何解决一个对象到达y位置的角度.但是,我正在尝试运行模拟,并且没有找到可以实现代码来模拟抛物线的任何实体方程.那些具有一定物理知识的人可以帮助我吗?

phe*_*cks 7

虽然Benny的答案很好,特别是在一般性方面,但您可以完全解决问题,而不是使用有限的集成步骤.你想要的等式是:

s = u*t + 0.5*a*t^2;
Run Code Online (Sandbox Code Playgroud)

在这里查看它来自何处的解释.

这里s是位移,u是初始速度,a是加速度,t是时间.这个等式只是一维的,但可以很容易地用于你的问题.您需要做的就是将弹丸的运动分成两个部分:一个与加速度平行,一个与垂直相平行.如果我们让Sx描述x方向上的位移和Sy描述y方向上的位移,我们得到:

Sx = Ux*t + 0.5*Ax*t; 
Sy = Uy*t + 0.5*Ay*t;
Run Code Online (Sandbox Code Playgroud)

现在在你的特定例子中,Ax是0,因为唯一的加速度是由于重力引起的,即y方向,即Ay = -g.减号来自于重力将作用于与物体原始运动相反的方向.Ux和Uy来自简单的三角学:

Ux = U*cos(angle);
Uy = U*sin(angle);
Run Code Online (Sandbox Code Playgroud)

把这一切放在一起你会得到两个方程式,描述射弹在发射后的某个时刻t的位置,相对于它的起始位置:

Sx = U*cos(angle)*t;
Sy = U*sin(angle)*t - 0.5*g*t^2;
Run Code Online (Sandbox Code Playgroud)


Ben*_*gan 6

不要将方程用于位置.相反,使用速度方程.从对象的旧速度计算模拟的每个循环的新速度,并将其应用于对象.您需要知道模拟的每个循环之间经过的时间.当然,这适用于垂直或水平速度.

v_new = v_old + acceleration * delta_time  (from wikipedia)
Run Code Online (Sandbox Code Playgroud)

然后申请:

position_new = position_old + v_new * delta_time;
Run Code Online (Sandbox Code Playgroud)

你可以使用简单的加速-9.8 m/s(不要忘记屏幕上的"向下"实际上是垂直位置的增加!所以你可以使用它+9.8来简化).或者您可以获得想象并添加可变加速度(例如,如果您还在建模对象的水平运动,则来自风).

基本上,你应用的加速度是基于施加在物体上的力的总和(重力,摩擦力,喷射推进力等).

F_final = F1 + F2 + ... + Fn
Run Code Online (Sandbox Code Playgroud)

以下内容可以帮助您.

如果要对应用于对象的力进行建模,请首先使用以下方法将力分解为其水平和垂直分量:

F_horiz = F * sin( angle )
F_vert =  F * cos( angle )  where angle is the angle between the force and the horizontal.
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法计算力的加速度:

a = F / mass
Run Code Online (Sandbox Code Playgroud)

(我将这些知识归功于我的第一次编程经验:GORILLA.BAS =))