Вычислите начальную скорость для перемещения расстояния набора с инерцией

Я хочу переместить что-то расстояние набора. Однако в моей системе существует ускорение инерции/перетаскивания/отрицательной. Я использую простое вычисление как это для него:

v = oldV + ((targetV - oldV) * inertia)

Применение этого по многим кадрам заставляет перемещение 'расти' или затухнуть, например:

v = 10 + ((0 - 10) * 0.25) = 7.5 // velocity changes from 10 to 7.5 this frame

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

Я смотрел на Уравнения движения (http://en.wikipedia.org/wiki/Equations_of_motion), но не могу разработать, каков корректный для моей проблемы...

Какие-либо идеи? Спасибо - я - от дизайна не научный фон.

Обновление: Fiirhok имеет решение с фиксированным ускоряющим значением; демонстрация HTML+jQuery:
http://pastebin.com/ekDwCYvj
Там какой-либо путь состоит в том, чтобы сделать это с дробным значением или функцией упрощения? Преимущество того, по моему опыту - то, что фиксированное ускорение и покадровая анимация иногда промахиваются по конечному пункту и должны быть вызваны, создав небольшой незначительный сбой привязки.

5
задан Linus Juhlin 20 November 2019 в 03:57
поделиться

3 ответа

Это простая задача кинематики.

В некоторый момент времени t скорость (v) объекта при постоянном ускорении описывается следующим образом:

v = v0 + at

Где v0 - начальная скорость, a - ускорение. В вашем случае конечная скорость равна нулю (объект остановлен), поэтому мы можем решить для t:

t = -v0/a

Чтобы найти общую пройденную разницу, возьмем интеграл скорости (первое уравнение) по времени. Я не занимался интегралом уже много лет, но я уверен, что он получается следующим образом:

d = v0t + 1/2 * at^2

Мы можем подставить в уравнение для t, которое мы разработали ранее:

d = v0^2/a + 1/2 * v0^2 / a

И решить для v0:

v0 = sqrt(-2ad)

Или, в более программном формате:

initialVelocity = sqrt( -2 * acceleration * distance );

Ускорение в этом случае отрицательное (объект замедляется), и я предполагаю, что оно постоянное, иначе все усложняется.

Если вы хотите использовать это внутри цикла с конечным числом шагов, вам нужно быть немного осторожным. Каждая итерация цикла представляет собой период времени. Объект будет перемещаться на величину, равную средней скорости, умноженной на продолжительность времени. Пример цикла с длительностью итерации равной 1 будет выглядеть следующим образом:

position = 0;
currentVelocity = initialVelocity;
while( currentVelocity > 0 )
{
    averageVelocity = currentVelocity + (acceleration / 2);
    position = position + averageVelocity;
    currentVelocity += acceleration;
}
7
ответ дан 13 December 2019 в 19:24
поделиться

Пройденное расстояние - это просто интеграл скорости по времени. Вам нужно интегрировать ваше выражение относительно времени с пределами [v, 0], и это даст вам выражение для расстояния в терминах v (начальная скорость).

1
ответ дан 13 December 2019 в 19:24
поделиться

Если вы хотите переместиться на заданное расстояние, используйте следующее:

alt text

3
ответ дан 13 December 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: