0

我有 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来确保循环不会永远运行?假设距离/速度/最大值可以是您无法更改的任何数字。

4

1 回答 1

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); 

这工作得很好。那里有一个轻微的杂物让我有点困扰,但我现在不想追查——它可能会抵消代码中的杂物。

于 2013-03-22T05:08:42.840 回答