我的角色会在哪里停下来?


12

许多年前,我为预算伪3D游戏编写了一些AI。我从来没有真正计算出最好的方法,这是计算一次,如果敌人现在停下来了,那敌人会去哪里。例如:

  • 敌人目前位于X = 540.0。
  • 敌人以每帧10像素向右移动。
  • 当敌人想要停止时,它的速度将每帧降低1像素,直到达到零。

有没有一个简单的公式可以让我知道敌人完全停止时其最终位置?我最终对可以满足我的需求的偏移量进行了预先计算和硬编码,但对于速度不同的敌人,则必须分别计算。

Answers:


7

我通常同意约翰的回答。我将提供一个经过稍微修改的公式(这将在他的值上增加一个额外的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),简化为上述公式。

+1我看不到您的解决方案中的任何逻辑缺陷,而且我真的不记得我是如何遇到我的解决方案的。所以我的表达肯定是错误的,由于细微的差别和缺乏详细的测试,我可能没有注意到吗?如果只加一半速度,我的表情会变得正确吗?
约翰·麦当劳

我使用功率计算器回答了自己的问题。对于任何给定的v和a,采用我的表达式+(v / 2)似乎总是等于您的表达式。
约翰·麦当劳

感谢@John和您,这在过去可以省去我很多精力!我接受此答案,因为它更简单,更有效,但是John的答案也受到高度赞赏。大家好!
2011年

6

在进行游戏时,我遇到了完全相同的问题,这花了我一辈子才能使数学正确(出错)。所以这里是:

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

重新编写为常规数学:

(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

2
仅作记录,Math.Pow()在这里是一个可怕的想法。如果它足够聪明,它可能会特殊地代表“ 2.0”指数,但无论如何,只要将其切成薄片,将表达式重写为“ 0.5 * linearVelocity * linearVelocity / Acceleration”应该是一个巨大的胜利。
史蒂文·斯塔德尼基

4

关于速度变化的计算是微积分的重点。我已经有一段时间没有这样做了,所以我不记得我的想法了,但是我认为您的情况只是采用-1的积分(即减速度)。


0

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

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

该公式来自对加速度的积分:在这里检查

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.