У меня есть 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
чтобы цикл не работал вечно? Предполагая, что расстояние / скорость / макс может быть любым числом, которое вы не можете изменить.
Ваша проблема довольно недооценена. Я предполагаю, что лучшим решением является замедление (т.е. ускорение в направлении, противоположном скорости), чтобы 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);
Это работает довольно хорошо. Там есть небольшой клочок, который меня немного беспокоит, но сейчас я не чувствую необходимости выслеживать его — он, вероятно, отменяет клудж в коде.
Других решений пока нет …