在一段时间后计算加速物体的位置

21

如何计算加速运动物体(例如汽车)在某个时间(例如1秒)后的位置?

对于匀速运动的物体,其运动是线性关系,因此我推测对于加速运动的物体,其中涉及到平方。

有什么想法吗?


这个问题似乎不适合讨论,因为它涉及到数学而非编程。 - George Stocker
5个回答

36
方程为:s = ut + (1/2)a t^2。
其中,s表示位置,u表示t=0时的速度,t表示时间,a表示恒定加速度。
例如,如果一辆汽车从静止开始,并以3m/s^2的加速度加速2秒钟,则它将移动(1/2)*3*2^2 = 6米。
这个方程式来自于对速度是位置变化率、加速度是速度变化率这两个方程进行解析积分得出的。
通常在游戏编程中,人们会使用稍微不同的公式:在每一帧中,速度和位置的变量并不是解析地而是数值地进行积分。
s = s + u * dt;
u = u + a * dt;

其中dt是帧的长度(使用计时器测量:大约1/60秒)。这种方法的优点是加速度可以随时间变化。

编辑 有几个人指出,欧拉数值积分法(如此处所示)虽然最容易演示,但精度相对较差。参见Velocity Verlet(常用于游戏)和四阶龙格-库塔法(一种用于科学应用的“标准”方法)以获取更好的算法。


2
对于2D游戏,您需要针对x和y(替换s)分别进行此操作,了解x和y方向上的速度和加速度。添加z以进行3D物理学计算。 - Bill the Lizard
1
需要注意的是,这种方法被称为欧拉方法,即使对于小步长也会产生不准确的结果,通常是一种非常粗糙的方法。 - freespace
6
如果使用此方法,您需要首先更新 u,然后更新 s(即使用新计算出的速度获取位置,遵循逻辑上的加速度=> 速度=> 位置推导路径)。 - Alan
1
@Alan:那被称为 半隐式欧拉法 方法。 - MestreLion
1
顺便提一下,如果加速度是恒定的,位置的速度Verlet方程就是你在第一行提到的解析解s += vt + (at^2)/2。对于速度来说也是如此,它也与欧拉方程相同。 - MestreLion
@Chris Johnson 为了确保,你能告诉我欧拉方法中的 delta t (dt) 究竟是什么吗?它是当前时间 (ti) 和初始时间 (t0) 之间的差异还是当前时间 (ti) 和计算的最后一个时间点 (ti-1) 之间的差异? - Dawid

7
嗯,这取决于加速度是否恒定。如果是恒定的话,那就简单了。
s = ut+1/2 at^2

如果a不是常数,你需要进行数值积分。现在有各种方法,但没有一种方法能够像手动计算那样准确,因为它们最终都是近似解决方案。
最简单但最不准确的方法是欧拉方法。在这里,您将时间分成称为时间步长的离散块,并执行。
v[n] = v[n-1] * t * a[t]

n 是索引,t 是时间步长的大小。位置同样也被更新。这种方法只适用于精度不是特别重要的情况。欧拉方法的一个特殊版本可以得出抛体运动的精确解(参见维基百科),因此虽然该方法比较粗糙,但在某些情况下可能是完美的选择。

在游戏和一些化学模拟中最常用的数值积分方法是Velocity Verlet,它是更通用的Verlet方法的一个特殊形式。如果欧拉方法太粗糙,我会推荐使用这种方法。


这是 v[n] = v[n-1] + t * a[t]t*a[t] 组件被到之前的速度上,而不是乘以它。 - MestreLion

3

1

假设您正在处理恒定加速度,公式如下:

距离 =(初始速度 * 时间)+(加速度 * 时间 * 时间)/ 2

其中

距离是行驶的距离

初始速度是初始速度(如果物体最初静止,则为零,因此在这种情况下可以省略此项)

时间是时间

加速度是(恒定的)加速度

计算时请确保使用正确的单位,例如米,秒等。

关于此主题的一本非常好的书籍是《游戏开发物理学》


1

假设加速度恒定且初始速度为v0,

x(t) = (1/2 * a * t^2) + (v0 * t)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接