2013-03-21 2 views
0

У меня есть 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

Ваша проблема довольно недостоверна. Я полагаю, что лучшим решением является замедление (т. Е. Ускорение в направлении, противоположном скорости), так что 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); 

Это работает очень хорошо. Там есть небольшой клочон, который немного меня беспокоит, но сейчас я не чувствую, что слежу за ним - возможно, он уничтожит клочок кода.

Смежные вопросы