Я хочу переместить что-то расстояние набора. Однако в моей системе существует ускорение инерции/перетаскивания/отрицательной. Я использую простое вычисление как это для него:
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
Там какой-либо путь состоит в том, чтобы сделать это с дробным значением или функцией упрощения? Преимущество того, по моему опыту - то, что фиксированное ускорение и покадровая анимация иногда промахиваются по конечному пункту и должны быть вызваны, создав небольшой незначительный сбой привязки.
Это простая задача кинематики.
В некоторый момент времени 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;
}
Пройденное расстояние - это просто интеграл скорости по времени. Вам нужно интегрировать ваше выражение относительно времени с пределами [v, 0], и это даст вам выражение для расстояния в терминах v (начальная скорость).
Если вы хотите переместиться на заданное расстояние, используйте следующее: