Как рассчитать необходимое ускорение на основе существующих правил ускорения / скорости

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

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

0

Другие решения

Других решений пока нет …