Рассчитать начальную скорость для перемещения на заданное расстояние с инерцией - PullRequest
5 голосов
/ 21 марта 2010

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

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 demo:
http://pastebin.com/ekDwCYvj
Есть ли способ сделать это с помощью дробного значения или функции замедления? Преимущество этого в моем опыте состоит в том, что фиксированное ускорение и основанная на кадре анимация иногда выходят за пределы конечной точки и должны быть вынуждены, создавая небольшой щелчок.

Ответы [ 3 ]

7 голосов
/ 21 марта 2010

Это простая проблема кинематики.

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

v = v0 + at

Где v0 - начальное значениескорость и ускорение.В вашем случае конечная скорость равна нулю (объект остановлен), поэтому мы можем решить для 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;
}
3 голосов
/ 21 марта 2010

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

alt text

1 голос
/ 21 марта 2010

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

...