我的角色会停在哪里?

很多年前,我把一些AI编码为一个伪3D游戏。 有一个计算,我从来没有真正想出最好的办法,那就是计算如果现在停下来,敌人将最终结束。 例如:

  • 敌人目前在X = 540.0。
  • 敌人正在以每帧10个像素向右移动。
  • 当敌人想停下来的时候,速度会下降1个像素,直到达到零。

有一个简单的公式可以让我知道当他完全停下来的时候,敌人最终结束了吗? 我最终预先计算和硬编码了我需要的偏移量,但是对于不同速度的敌人将不得不分别计算。

我普遍同意约翰的回答。 我会提供一个稍微修改的公式(在他的值上加上一个额外的V / 2):

D = V / A * (V + A) / 2 

V = 10A = 1时,得到D = 55 。 这正是结果

 10 + 9 + 8 + 7 + .... + 3 + 2 + 1 

这是敌人的逐帧动作。

这是你如何去实现这一步。

  1. V :当前速度= 10像素/帧, A :当前加速度= 1像素/帧^ 2
  2. T :停止的时间= V / A = 10帧。
  3. 在10帧中行进的距离=帧1 +帧2 +帧3 + … = V +(VA)+(V-2 * A)+ …
  4. 这等于T * V-A / 2 * T *(T-1),这简化为上述等式。

当我的游戏工作时,我的确遇到了同样的问题,而且我永远花了我的时间才算正确(bleh)。 所以这里是:

 minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0); 

重新写入常规math:

 (Acceleration / 2) * (linearVelocity / Acceleration)^2 

在你的情况下,加速度是1,linearVelocity是10:

 (1 / 2) * (10 / 1)^2 = 50 units to stop 

编辑

吉米的结果和解释都是正确的。 我的公式要求你也加一半的速度。

 minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2); 

要么

 ((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2) ((1 / 2) * (10 / 1)^2) + (10 / 2) = 55 

关于速度变化的计算是微积分的整个点。 我有一段时间没有做,所以我不记得我的头顶,但我认为你的情况只是取-1(即减速)的积分。

这不是恒定的加速度运动吗?

 X = Xi + V*t + (1/2) * a * (t^2) 

哪里:
X:最后的位置
Xi:初始位置
V:速度
t:时间
a:加速

这里唯一棘手的部分是如何确定“t”,因为我们以-1的加速度减速,那么我们可以计算t = V / a,那么t是10。

所以,
Xi:540
V:10
t:10
a:-1

把一切都放在:

 X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) X = 540 + 100 + (-50) X = 540 + 50 X = 590 

该公式来自加速的整合: 请点击这里