2

我正在编写一个模拟,其中一个对象在 2D 世界中向目标位置移动,存储为 vector 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。这是通过简单地计算 和 之间的差异cv并将dv该差异限制为 来完成的acc。这样,物体开始缓慢移动并逐渐加速,最终达到全速。

到目前为止,这工作正常。现在我也想利用acc减速。当 和 之间的距离pos达到target一定值时,dv应将所需速度设置为(0,0),使物体逐渐减速,直到在目标位置完全停止。

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

4

2 回答 2

1

使用运动学方程:

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

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

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

  • a是加速度

  • d 是距离。

求解 d:

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

  • 2*a*d = 0 - v2

假设加速度是负的,所以两边都乘以-1

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

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

  • d = v i 2 / (2*|a|)
于 2015-01-06T02:21:34.237 回答
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;
于 2015-01-06T03:34:25.187 回答