Де зупиниться мій персонаж?


12

Багато років тому я зашифрував деякий інтелект для бюджетної псевдо-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 Я не бачу логічних недоліків у вашому рішенні, і я не можу пригадати, як я натрапив на своє рішення. Отже, мій вираз повинен бути неправильним, і я, мабуть, не помітив через невелику різницю та відсутність детального тестування? Чи став би мій вираз правильним, якби я просто додав половину швидкості?
Джон Макдональд

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

Завдяки і @John, і ви, це би заощадило мені багато зусиль за ті дні! Я приймаю цю відповідь, оскільки це простіше та ефективніше, але й відповідь Джона дуже цінується. Ура, хлопці!
Kaivosukeltaja

6

У мене була точно така ж проблема, коли я працював над своєю грою, і мені знадобилося назавжди, щоб правильно зрозуміти математику (bleh). Отже ось це:

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

EDIT

Результат і пояснення Джиммі є правильними. Моя формула вимагає, щоб ви також додали половину швидкості.

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.

так,
Xi: 540
V: 10
t: 10
a: -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.