2013-03-21 69 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); 

這工作得很好。在那裏有一點點困擾,讓我有點困擾,但我現在不想跟蹤 - 它可能會取消代碼中的混亂。