Prevedere la posizione del nemico per fare in modo che un oggetto conduca il suo bersaglio


13

Nel mio gioco 2D ho torrette AI che dovrebbero aiutare il giocatore sparando automaticamente contro i nemici. Vorrei farli sparare in modo intelligente e guidare il bersaglio invece di prendere di mira la posizione attuale di un nemico. Quindi, dato il vettore (sempre costante) di velocità e posizione sia del nemico che del proiettile della torretta, come posso trovare un vettore che rappresenti la posizione effettiva che la torretta deve prendere di mira affinché il proiettile si intersechi (e colpisca) il nemico?

Qualsiasi link ad articoli che descrivono la matematica, gli algoritmi, ecc. Sarebbe apprezzato!



Grazie per i collegamenti! Tuttavia, ritengo che le soluzioni siano un po 'difficili da leggere, forse posso trovare una risposta visiva chiara a questa domanda usando i link che hai fornito, per aiutare tutti gli altri che sono bloccati con lo stesso problema.
Larolaro,

@Larolaro Ho aggiunto una dimostrazione grafica alla mia risposta in modo che tu possa capirla un po 'meglio.
jmacedo,

Descrivo l'approccio che seguo in questa risposta gamedev.stackexchange.com/a/28582/6588
jhocking

Risposte:



3

Non ti darò una risposta, sono sicuro che sia utile o addirittura corretto, ma ecco qui:
Dopo aver giocato un po 'di più con i file matematici (controlla la fine della risposta per notebook / notebook pubblicato), questa soluzione sembra essere corretta, anche se potrebbe non essere la migliore in termini di efficienza.

L'ho scritto in matematica che corrisponde al tuo problema. Fondamentalmente risolve le equazioni / disuguaglianze al fine della variabile OA che è quello che dobbiamo scoprire. L'output ci fornirà le possibili soluzioni che OA può avere e le condizioni che devono essere verificate affinché ciascuna soluzione sia valida:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} è la posizione attuale del blu

  • {BVx, BVy} è il vettore di velocità del blu

  • {OPx, OPy} è la posizione del proiettile di orange

  • OV è la norma del vettore di velocità del proiettile di orange (velocità totale)

  • OA è l'angolo del proiettile arancione (angolo del vettore di velocità)

  • t è il tempo necessario affinché il proiettile colpisca in blu

Ho provato a mettere t> 0 && OV> 0 nelle condizioni ma la matematica impiegherebbe un'eternità quindi ho usato t! = 0 && OV! = 0. Quindi le soluzioni che darò qui funzionano solo quando il blu non è esatto stessa posizione dell'arancia e quando il proiettile dell'arancia si muove davvero (invece di rimanere fermo)

L'output è gigantesco: http://freetexthost.com/xzhhpr5e2w

Tuttavia, se estraiamo le parti OA == _, otteniamo questo:

http://freetexthost.com/iyrhqoymfo

Questi sono i valori che OA può avere (ognuno richiede condizioni diverse per essere valido).

Con alcune ulteriori analisi che eliminano le soluzioni che richiedono che OV sia negativo e che non vogliamo, ho ottenuto questo:

http://freetexthost.com/iy4wxepeb6

Quindi queste sono le possibili soluzioni al problema, ognuna delle quali richiede condizioni diverse per essere valida. Affinché un determinato angolo OA sia una soluzione valida, devono soddisfare le seguenti condizioni:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Produzione:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Quindi considera solo le soluzioni in cui ciò si verifica (non è necessario verificare le parti t == _. Sono quelle che ti danno il tempo necessario affinché il proiettile colpisca il veicolo se le altre condizioni sono valide. Nota che se t risulta in un valore negativo, non puoi considerare un determinato OA come una soluzione valida, anche se verifica le altre condizioni (questo perché abbiamo usato t! = 0 invece di t> 0 per ridurre)).

Potrebbe anche essere una buona idea chiedere in /math// di questo.

modificare

Sono cresciuto l'interesse per questa domanda, quindi ho creato un taccuino commentato con una dimostrazione grafica di tutto ciò che ho spiegato. Scaricalo qui:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
O qui: http://www.2shared.com/file/W01g4sST/towerBullets.html

(questa è la versione pubblicata, e hai solo bisogno del lettore di matematica - che è gratuito - per vederla. Se non hai la matematica questa è la strada da percorrere)

Immagine dello schermo:


Sono in grado di fornire le condizioni e le soluzioni con il segno di moltiplicazione (*) in modo che sia più facile per te portarli nel tuo linguaggio di programmazione (Quindi dovrai solo sostituire ArcTan [...], Sin [...], Cos [...], Sqrt [...] e infine il segno di potere (^).
jmacedo

Ah, dimentica questa soluzione. Ora che questa domanda è stata unita, i collegamenti della prima risposta sembrano contenere risposte migliori.
jmacedo,
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.