Dove si fermerà il mio personaggio?


12

Molti anni fa ho codificato un po 'di intelligenza artificiale per un gioco pseudo-3d economico. C'era un calcolo che non avevo mai veramente immaginato il modo migliore di fare, e che stava calcolando dove sarebbe finito il nemico se si fosse fermato ora. Per esempio:

  • Il nemico è attualmente su X = 540.0.
  • Il nemico si sta muovendo a destra a 10 pixel per fotogramma.
  • Quando il nemico vuole fermarsi, la sua velocità diminuirà di 1 pixel per fotogramma fino a raggiungere lo zero.

Esiste una formula semplice che mi porterebbe la posizione in cui il nemico finisce quando è completamente fermo? Alla fine ho precalcolato e codificato l'offset che ha funzionato per le mie esigenze ma avrebbe dovuto essere calcolato separatamente per i nemici con velocità diverse.

Risposte:


7

Sono generalmente d'accordo con la risposta di John. Offrirò una formula leggermente modificata (che aggiunge un ulteriore V / 2 al suo valore):

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

Con V = 10e A = 1, diventa D = 55. Questo è esattamente il risultato di

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

che è il movimento fotogramma per fotogramma del nemico.

Ecco come si procede per arrivare a quel passo.

  1. V : Velocità corrente = 10 pixel / frame, A : Accelerazione corrente = 1 pixel / frame ^ 2
  2. T : Tempo di arresto = V / A = 10 fotogrammi.
  3. Distanza percorsa in 10 fotogrammi = frame1 + frame2 + frame3 + ... = V + (VA) + (V-2 * A) + ...
  4. Questo è uguale a T * V - A / 2 * T * (T-1), che semplifica l'equazione di cui sopra.

+1 Non riesco a vedere alcun difetto logico nella tua soluzione e non riesco davvero a ricordare come mi sono imbattuto nella mia soluzione. Quindi la mia espressione deve essere sbagliata e probabilmente non me ne sono accorto a causa della piccola differenza e della mancanza di test dettagliati? La mia espressione diventerebbe corretta se aggiungessi semplicemente metà della velocità?
John McDonald,

Ho risposto alla mia domanda usando power calc. Prendendo la mia espressione + (v / 2) sembra sempre uguale alla tua espressione per ogni dato v e a.
John McDonald,

Grazie sia a te che a John, questo mi avrebbe risparmiato un sacco di fatica in quei giorni! Accetto questa risposta, poiché è più semplice ed efficiente, ma anche la risposta di John è molto apprezzata. Saluti ragazzi!
Kaivosukeltaja,

6

Ho avuto lo stesso identico problema quando lavoravo sul mio gioco, e mi ci è voluta un'eternità per ottenere la matematica giusta (bleh). Quindi eccolo qui:

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

Riscritto in matematica normale:

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

Dove l'accelerazione nel tuo caso è 1 e linearVelocity è 10:

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

MODIFICARE

Il risultato e la spiegazione di Jimmy sono entrambi corretti. La mia formula richiede che tu aggiunga anche metà della velocità.

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

o

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

2
Per la cronaca, Math.Pow () è un'idea terribile, terribile qui. Può essere un caso speciale l'esponente "2.0" se è abbastanza intelligente, ma in ogni modo lo si divide, riscrivendo quell'espressione come "0,5 * linearVelocity * linearVelocity / Acceleration" dovrebbe essere una vittoria enorme.
Steven Stadnicki,

4

I calcoli sulla variazione delle velocità rappresentano l'intero punto di calcolo. Non lo faccio da un po ', quindi non ricordo la parte superiore della mia testa, ma penso che la tua situazione stia semplicemente prendendo l'integrale di -1 (cioè la decelerazione).


0

Questo movimento di accelerazione costante non è?

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

Dove:
X: Ultima posizione
Xi: Posizione iniziale
V: Velocità
t: Tempo
a: Accelerazione

L'unica parte difficile qui è come determinare "t", poiché rallentiamo con un'accelerazione di -1, quindi possiamo calcolare t = V / a, quindi t è 10.

quindi,
Xi: 540
V: 10
t: 10
a: -1

Metti tutto su:

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

La formula deriva dall'integrazione dell'accelerazione: controlla qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.