Come calcolare l'angolo di tiro e la velocità per colpire un bersaglio in movimento?


11

Sto sviluppando un gioco Android 2D e sto realizzando un algoritmo di puntamento per proiettili di intelligenza artificiale per colpire i nemici seguendo un percorso o muovendosi liberamente. Al momento calcola solo dove sarà il bersaglio dopo una distanza e spara un proiettile per raggiungerlo a quella distanza. Naturalmente questo significa variare la velocità del proiettile per raggiungere l'obiettivo.

Qualcuno ha qualche suggerimento per un algoritmo semplice (ottimo-ish) per calcolare quando il proiettile deve sparare e dove deve mirare se può viaggiare solo a una velocità costante? Supponiamo che il proiettile vada al doppio della velocità del bersaglio?

L'unico modo in cui riesco a pensare è la ricerca e sembra abbastanza grande.



@JohnMcDonald: non molto correlato dato che si tratta di proiettili parabolici, non lineari. Questo è molto più vicino: gamedev.stackexchange.com/questions/4995/…
e100

Risposte:


13

In un gioco di difesa della torre che ho realizzato, ho usato un'equazione quadratica per prevedere l'intersezione e quindi il punto di mira. Il seguente frammento di codice di mira presuppone che il nemico stia viaggiando a velocità e direzione costanti. Presuppone inoltre che il proiettile viaggerà a una velocità costante nota (potrebbe essere qualsiasi velocità ma deve essere noto all'algoritmo).

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Dal momento che determina anche il tempo di impatto, ho semplicemente aspettato il tempo passato per chiamare la grafica dell'impatto nella posizione del bersaglio in quel momento ... non è necessario alcun rilevamento di collisioni per determinare i colpi.


"non è necessario alcun rilevamento delle collisioni per determinare i colpi". - Se gli obiettivi sono limitati a mantenere la loro velocità e direzione. --- Se, tuttavia, hanno un'intelligenza artificiale attiva, o peggio, sono il giocatore e sono in grado di muoversi dopo che il tiratore ha sparato, basare i tuoi colpi in tempo piuttosto che il rilevamento delle collisioni porterà a ciò che il tuo giocatore-base percepirà alcuni brutti bug / anomalie.
XenoRo,

@TheLima yup, proprio come si dice nella seconda frase della risposta. ;-)
Steve H

Questo è quasi perfetto per il mio scenario, ma come valuteresti queste 2 variabili aggiuntive: l'accelerazione per il proiettile, il movimento della torre stessa?
Jack,

Che cosa aè 0? Ciò produrrà una divisione per zero eccezioni, ma cosa significa questo in termini di variabile t? dovrebbe essere considerato "un numero molto grande" o quale sarebbe il caso migliore?
firelynx,

C'è un buon libro che entra nell'intuizione dietro questo? Sono curioso di sapere come hai saputo cercare questa matematica ...
davidkomer,

4

inserisci qui la descrizione dell'immagine

L'intelligenza artificiale, la posizione del bersaglio durante il tempo in cui il proiettile viene sparato e la posizione finale del bersaglio in punto di morte formano un triangolo. Ecco cosa dovresti già sapere:

  1. Lunghezza laterale a, che è la velocità del proiettile
  2. Lunghezza laterale b, ovvero la velocità target
  3. L'angolo di movimento del bersaglio del movimento del bersaglio.

Hai tre parti del triangolo, un caso SSA, quindi risolvilo in questo modo

  1. Trova l'angolo B in base all'angolo di movimento e alla posizione dell'IA
  2. Usa la legge dei seni per trovare l'angolo A

L'angolo A dovrebbe consentire di determinare l'angolazione con cui il proiettile dovrebbe essere lanciato.

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.