如何根据现有的加速度/速度规则计算所需的加速度

时间:2013-03-21 19:59:56

标签: c++ math physics acceleration

我有3个值来确定对象的移动:velocityaccelerationmaxVelocity。我还有一个distance值来确定它们与目标的接近程度(基本上是X)。此代码运行每个帧以根据3个值确定实际移动:

var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
velocity += velocityDelta;
var delta = velocity*0.016;
velocity += velocityDelta;
distance -= delta;

如果velocityDelta有点令人困惑,基本上就是这样:

velocityDelta = velocity + (acceleration * 0.016);
if (velocityDelta > maxVelocity) velocityDelta = maxVelocity;
else if (velocityDelta < -maxVelocity) velocityDelta = -maxVelocity;
velocityDelta = (velocityDelta - velocity) / 2;

现在,假设您只能更改acceleration的值,是否有办法计算您需要的加速度,以确保distance最终为0?在运行上述代码的其中一个帧期间的含义distance - delta == 0。因此,假设代码如下所示:

var distance = 300.5;
var velocity = 125.86;
var maxVelocity = 300;
while (distance != 0) {
    acceleration = ?
    var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
    velocity += velocityDelta;
    var delta = velocity*0.016;
    velocity += velocityDelta;
    distance -= delta;
}

您将acceleration放入什么值以确保循环不会永远运行?假设距离/速度/最大值可以是任何你无法改变的数字。

1 个答案:

答案 0 :(得分:0)

你的问题很严重。我认为最好的解决方案是减速(即在与速度相反的方向上加速),这样maxVelocity就不会成为问题。

首先,找出在物体到达目标之前会有多少时间间隔(假设没有加速度):

var dt = 0.016;
var jumps = distance/(dt * velocity);   <-- round DOWN

然后在一段时间内运用一些基本物理来旅行distance

x = vt + at^2/2
a = 2(x-vt)/t^2
acceleration = 2*(distance - velocity*jumps*dt)/(jumps*dt*jumps*dt); 

这非常有效。那里有一点点困扰,让我感到困扰,但我现在不想跟踪它 - 它可能会取消代码中的污垢。