虽然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)
不要将方程用于位置.相反,使用速度方程.从对象的旧速度计算模拟的每个循环的新速度,并将其应用于对象.您需要知道模拟的每个循环之间经过的时间.当然,这适用于垂直或水平速度.
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 =))
归档时间: |
|
查看次数: |
7965 次 |
最近记录: |