我有3个值来确定对象的移动:velocity
,acceleration
和maxVelocity
。我还有一个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
放入什么值以确保循环不会永远运行?假设距离/速度/最大值可以是任何你无法改变的数字。
答案 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);
这非常有效。那里有一点点困扰,让我感到困扰,但我现在不想跟踪它 - 它可能会取消代码中的污垢。