Gdzie zatrzyma się moja postać?


12

Wiele lat temu kodowałem sztuczną inteligencję do budżetowej gry pseudo-3d. Było jedno obliczenie, którego tak naprawdę nigdy nie wymyśliłem najlepszego sposobu, a było to obliczenie, gdzie skończyłby wróg, gdyby teraz się zatrzymał. Na przykład:

  • Wróg ma obecnie X = 540,0.
  • Wróg porusza się w prawo z prędkością 10 pikseli na klatkę.
  • Kiedy wróg chce się zatrzymać, jego prędkość spadnie o 1 piksel na klatkę, aż osiągnie zero.

Czy istnieje prosta formuła, która zapewniłaby mi pozycję, w której wróg kończy się, gdy zostanie całkowicie zatrzymany? Skończyłem wstępnie obliczać i ustalać na stałe przesunięcie, które działało na moje potrzeby, ale musiałoby być obliczane osobno dla wrogów o różnych prędkościach.

Odpowiedzi:


7

Generalnie zgadzam się z odpowiedzią Johna. Mam zamiar zaoferować nieco zmodyfikowaną formułę (która dodaje dodatkowe V / 2 do jego wartości):

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

Z V = 10i A = 1dostaje to D = 55. To jest dokładnie wynik

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

czyli ruch wroga klatka po klatce.

Oto jak przejść do tego kroku.

  1. V : Aktualna prędkość = 10 pikseli / ramkę, A : Akceleracja prądu = 1 piksel / ramkę ^ 2
  2. T : Czas do zatrzymania = V / A = 10 klatek.
  3. Przejechany dystans w 10 klatkach = ramka 1 + ramka 2 + ramka 3 + ... = V + (VA) + (V-2 * A) + ...
  4. Jest to równe T * V - A / 2 * T * (T-1), co upraszcza powyższe równanie.

+1 Nie widzę żadnych błędów logicznych w twoim rozwiązaniu i naprawdę nie pamiętam, jak trafiłem na moje rozwiązanie. Więc moje wyrażenie musi być błędne i prawdopodobnie nie zauważyłem z powodu małej różnicy i braku szczegółowych testów? Czy moje wyrażenie stałoby się prawidłowe, gdybym po prostu dodał połowę prędkości?
John McDonald,

Odpowiedziałem na moje pytanie za pomocą obliczeń mocy. Biorąc moje wyrażenie + (v / 2) wydaje się zawsze równe twojemu wyrażeniu dla każdego v i a.
John McDonald,

Dzięki zarówno @Johnowi, jak i tobie, zaoszczędziłoby mi to wiele wysiłku w tamtych czasach! Przyjmuję tę odpowiedź, ponieważ jest ona prostsza i bardziej wydajna, ale odpowiedź Johna jest również bardzo doceniana. Na zdrowie!
Kaivosukeltaja

6

Miałem dokładnie ten sam problem podczas pracy nad grą i zajęło mi wieczność, aby poprawnie wyliczyć matematykę. Oto on:

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

Przepisane na zwykłą matematykę:

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

Gdzie w twoim przypadku przyspieszenie wynosi 1, a prędkość liniowa wynosi 10:

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

EDYTOWAĆ

Wynik i wyjaśnienie Jimmy'ego są poprawne. Moja formuła wymaga dodania połowy prędkości.

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

lub

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

2
Dla przypomnienia Math.Pow () jest tutaj okropnym, okropnym pomysłem. To może specjalnego przypadku „2,0” wykładnik jeśli jest wystarczająco inteligentny, ale żaden sposób na to nie patrzeć, przepisywanie tego wyrażenia jako „0,5 * linearVelocity * linearVelocity / Acceleration” powinna być wielka wygrana.
Steven Stadnicki

4

Obliczenia dotyczące zmieniających się prędkości to cały punkt rachunku różniczkowego. Nie robiłem tego od dłuższego czasu, więc nie pamiętam z głowy, ale myślę, że twoja sytuacja po prostu przyjmuje całkę -1 (tj. Spowolnienie).


0

Czy to nie jest stały ruch przyspieszający?

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

Gdzie:
X: ostatnia pozycja
Xi: pozycja początkowa
V: prędkość
t: czas
a: przyspieszenie

Jedyną trudną częścią jest tutaj określenie „t”, ponieważ zwalniamy z przyspieszeniem -1, wtedy możemy obliczyć t = V / a, wtedy t wynosi 10.

więc
Xi: 540
V: 10
t: 10
a: -1

Włóż wszystko:

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

Formuła pochodzi z integracji integracji przyspieszenia: sprawdź tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.