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

时间:2015-01-06 01:58:47

标签: algorithm kinematics

我正在编写一个模拟,其中一个物体在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保持对象当前移动的实际速度。

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

到目前为止,这工作正常。现在我想利用acc进行减速。当postarget之间的距离达到某个值时,所需的速度dv应设置为(0,0),以便对象逐渐减速直至达到完全停在目标位置。

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

2 个答案:

答案 0 :(得分:1)

使用运动方程:

v f 2 = v i 2 + 2 * a * d

  • v f 是你的最终速度,或0(你想要的速度)

  • v i 是您的初始速度,给定(物体当前移动的速度)。

  • a is acceleration

  • d是距离。

解决d:

  • 2 * a * d = v f 2 - v i 2

  • 2 * a * d = 0 - v i 2

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

  • 2 * | a | * d = v i 2

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

  • d = v i 2 /(2 * | a |)

答案 1 :(得分:1)

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

  • 加速度为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;