Где остановится мой персонаж?


12

Много лет назад я написал несколько AI для бюджетной псевдо-3d игры. Был один расчет, который я так и не смог выяснить, как лучше всего поступить, и он рассчитывал, где враг остановится, если он остановится сейчас. Например:

  • Враг в настоящее время находится на X = 540,0.
  • Враг движется вправо со скоростью 10 пикселей на кадр.
  • Когда враг хочет остановиться, его скорость падает на 1 пиксель за кадр, пока не достигнет нуля.

Есть ли простая формула, которая позволила бы мне получить позицию, в которой противник оказывается, когда он полностью остановлен? В итоге я рассчитал и жестко закодировал смещение, которое сработало для моих нужд, но должно было рассчитываться отдельно для врагов с разной скоростью.

Ответы:


7

Я в целом согласен с ответом Джона. Я собираюсь предложить немного измененную формулу (которая добавляет дополнительный V / 2 к его значению):

D = V / A * (V + A) / 2 

С V = 10и A = 1, что получает D = 55. Это как раз результат

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

которое является покадровым движением противника.

Вот как вы добираетесь до этого шага.

  1. V : текущая скорость = 10 пикселей / кадр, A : текущее ускорение = 1 пикселей / кадр ^ 2
  2. T : время до остановки = V / A = 10 кадров.
  3. Расстояние, пройденное в 10 кадрах = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. Это равно T * V - A / 2 * T * (T-1), что упрощает вышеприведенное уравнение.

+1 Я не вижу никаких логических недостатков в вашем решении, и я действительно не могу вспомнить, как я нашел свое решение. Так что мое выражение должно быть неправильным, и я, вероятно, не заметил из-за небольшой разницы и отсутствия подробного тестирования? Мое выражение стало бы правильным, если бы я просто добавил половину скорости?
Джон Макдональд

Я ответил на свой вопрос, используя power calc. Взятие моего выражения + (v / 2) всегда равно вашему выражению для любых заданных v и a.
Джон Макдональд

Благодаря вам и Джону, это сэкономило бы мне много сил в те дни! Я принимаю этот ответ, так как он проще и эффективнее, но ответ Джона также высоко ценится. Ура ребята!
Кайвосукелтая

6

У меня была точно такая же проблема, когда я работал над своей игрой, и мне понадобилось целое время, чтобы понять математику правильно (блеф). Итак, вот оно:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Переписано в обычную математику:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Где ускорение в вашем случае равно 1, а линейная скорость равна 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

РЕДАКТИРОВАТЬ

Результат и объяснение Джимми верны. Моя формула требует, чтобы вы также добавили половину скорости.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

или

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
Для справки, Math.Pow () - ужасная, ужасная идея. В особом случае это может быть показатель «2.0», если он достаточно умен, но в любом случае, если вы нарежете его, переписать это выражение как «0.5 * linearVelocity * linearVelocity / Acceleration» должно быть огромным выигрышем.
Стивен Стадницкий,

4

Расчеты об изменении скоростей составляют всю точку исчисления. Я не делал этого некоторое время, поэтому я не помню из головы, но я думаю, что ваша ситуация просто принимает интеграл от -1 (т.е. замедление).


0

Разве это не движение с постоянным ускорением?

X = Xi + V*t + (1/2) * a * (t^2)

Где:
X: Последняя позиция
Xi: Начальная позиция
V: Скорость
t: Время
a: Ускорение

Единственная сложная часть здесь - как определить «t», так как мы замедляемся с ускорением -1, тогда мы можем вычислить t = V / a, тогда t равно 10.

итак,
Си: 540
В: 10
т: 10
а: -1

Положите все на:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

Формула исходит из интеграции ускорения: проверьте здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.