2013-03-21 91 views
0

我有3个值用于确定物体的移动:velocity,accelerationmaxVelocity。我也有一个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,以确保循环不会永远运行?假设distance/velocity/max可以是任何你不能改变的数字。

回答

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

这工作得很好。在那里有一点点困扰,让我有点困扰,但我现在不想跟踪 - 它可能会取消代码中的混乱。