根据运动物体到目标的距离计算运动物体的速度

Calculating the speed of a moving object based on its distance to a target

我正在编写一个模拟,其中对象在 2D 世界中向目标位置移动,存储为矢量 target(x,y)。对象位置也存储为位置向量 pos(x,y)。该对象包含另外两个向量,即所需的移动速度 dv(x,y),以及当前的移动速度 cv(x,y)。在模拟开始时,这两个速度矢量都是初始的,即设置为 (0,0).

当物体应该向目标位置移动时,我计算所需的速度矢量dv,对其进行归一化,并按移动速度值缩放:

dv.set(target).sub(pos).normalize()
dv.scale(speed)

我想让运动看起来更逼真,这就是我使用两个速度矢量的原因。 dv 告诉我要移动对象的全速,cv 保存对象当前移动的实际速度。

然后在每一帧(更新步骤),根据所需速度 dv 和加速度值 acc 设置当前速度 cv。这是通过简单地计算 cvdv 之间的差异并将此差异限制为 acc 来完成的。这样物体开始缓慢移动并逐渐加速最终达到全速。

到目前为止一切正常。现在我也想利用 acc 来减速。当postarget之间的距离为一定值时,需要设置速度dv(0,0),使物体逐渐减速直至到达在目标位置完全停止。

我的问题是:如何计算需要将 dv 设置为 (0,0) 的距离(即告诉系统停止运动),以便对象正确减速以停止 正好在目标位置?

使用运动方程:

vf2 = vi2 + 2 * a * d

  • vf 是你的最终速度,或者 0(你想要的速度)

  • vi 是给定的初始速度(物体当前移动的速度)。

  • a是加速度

  • d是距离。

求解 d:

  • 2*a*d = vf2 - vi2

  • 2*a*d = 0 - vi2

假设加速度为负,两边乘以-1

  • 2*|a|*d = vi2

|一个|是你的加速度的绝对值(在你的情况下是减速度)

  • d = vi2 / (2*|a|)

您正在对运动进行离散时间模拟。使事情简单化的一种方法是以加速和减速对称的方式执行计算。换句话说,加速时行驶的距离应与减速时行驶的距离相同。例如,假设

  • 加速度为5
  • 最高速度为13
  • 物体一达到最高速度就开始减速

这是离散时间模拟的进展方式

first tick
  old speed = 0
  new speed = 5
  distance  = 5

second tick
  old speed = 5
  new speed = 10
  distance  = 15

third tick
  old speed = 10
  new speed = 13
  distance  = 28  <-- total distance while accelerating

fourth tick
  old speed = 13
  distance  = 41
  new speed = 10  <-- not 8!!!

fifth tick
  old speed = 10
  distance  = 51
  new speed =  5

sixth tick
  old speed =  5
  distance  = 56  <-- Yay, twice the distance, we have symmetry
  new speed =  0

这里有两个重点

  • 加速时先更新速度再更新距离。减速时顺序相反,先更新距离,再更新速度。
  • 减速时,将调整后的速度保持为加速度的倍数很重要

在C语言中,可以用下面的代码来更新减速过程中的速度

if ( old_speed % acceleration != 0 )                   // if speed is not a multiple of acceleration
   new_speed = old_speed - old_speed % acceleration;   //   reduce speed to a multiple of acceleration
else                                                   // otherwise
   new_speed = old_speed - acceleration;               //   reduce speed by acceleration

如果加减速对称,那么计算减速距离和计算加速距离是一样的。

distance = acceleration * (1+2+3+ ... +N) + fudge_factor

其中

  • Ntop_speed / acceleration 截断为整数,例如13/5 ==> 2
  • fudge_factor0 如果最高速度是加速度的倍数,或者 top_speed否则

可以通过注意

来简化计算
1+2+3+ ... +N = N * (N+1) / 2

在C中,减速时行驶的总距离可以计算如下

int top_speed = 13;
int acceleration = 5;

int N = top_speed / acceleration;     // Note: in C, integer division truncates

int fudge = 0;
if ( top_speed % acceleration != 0 )
    fudge = top_speed;

int distance = acceleration * (N * (N+1)) / 2 + fudge;