2009-07-29 10 views
13

Ho un gioco a cui sto lavorando che contiene missili homing. Al momento si girano verso il loro bersaglio, il che produce un risultato piuttosto stupido, con tutti i missili che seguono l'obiettivo intorno.Come creare un "missile intercettazione" per un gioco?

Voglio creare un sapore più micidiale di missile che mirerà al punto in cui il bersaglio sarà "nel momento in cui arriva e sto diventando un po 'bloccato e confuso su come farlo.

Immagino che dovrò capire dove il mio obiettivo sarà ad un certo punto nel futuro (suppongo comunque), ma non riesco a capire quale sarà il futuro. Deve basarsi su quanto lontano il missile si trova lontano dal bersaglio, ma anche sul bersaglio che si muove.

I miei missili hanno una spinta costante, unita ad una debole capacità di virare. La speranza è che saranno veloci ed entusiasmanti, ma sterzate come una mucca (vale a dire, male, per i fan non HitchHiker là fuori).

Ad ogni modo, sembrava un tipo di problema divertente per Stack Overflow che mi aiutasse a risolvere, quindi tutte le idee o suggerimenti su missili migliori o "più divertenti" sarebbero stati tutti ricevuti con gratitudine.

Il prossimo sarà AI per loro schivare ...

+1

BTW: non hai menzionato se i tuoi missili sono atmosferici o meno. Usano le loro superfici di controllo o la loro spinta per cambiare il loro vettore? La semplificazione costante dei cuscinetti continua a funzionare in entrambi i modi, ma si ottengono comportamenti diversi/interessanti con i missili atmosferici a diverse velocità. Ad es., Il Sidewinder subito dopo il lancio è una vera e propria scia di fumo, non tanto immediatamente prima dell'impatto. –

+3

Il nickname "sidewinder" deriva dal suo volo di andata e ritorno ... Quando viene lanciato per la prima volta, è lento e porta molto vantaggio per raggiungere il corso di collisione. Mentre accelera, ha bisogno di meno piombo e torna indietro verso il bersaglio. Dopo che il motore si è consumato e inizia a decantare, tira ancora una volta il piombo. Il risultato netto è una scia di fumo che sembra molto simile a un movimento laterale dei serpenti a sonagli attraverso la sabbia. –

+1

Questo effetto Sidewinder era uno dei fattori motivanti alla base dell'aggiunta della funzione di proporzionalità variabile ai missili radar-guidati. È inutile tirare in anticipo un vantaggio extra quando la chiusura è bassa, se hai intenzione di accelerare e di avere comunque bisogno di meno piombo. Quindi, per i missili radar che "conoscono" la chiusura, basano il tasso di rotazione del missile alla chiusura e questo causa li tirano meno in anticipo quando non ne avranno bisogno in seguito. –

risposta

21

Quello che stai suggerendo si chiama "Guida ai comandi", ma c'è un modo più semplice e migliore.

Il modo in cui i missili reali generalmente lo fanno (non tutti sono uguali) sta utilizzando un sistema chiamato Proportional Navigation. Ciò significa che il missile "gira" nella stessa direzione della linea di mira (LOS) tra il missile e il bersaglio sta girando, ad una velocità di virata "proporzionale" al tasso di LOS ... Questo farà ciò che sei chiedendo come quando il tasso di LOS è zero, si è in rotta di collisione.

È possibile calcolare la velocità LOS confrontando semplicemente le pendenze della linea tra il misile e il bersaglio da un secondo al successivo. Se quella pendenza non cambia, sei in rotta di collisione. se sta cambiando, calcola il cambiamento e gira il missile di una proporzione angolare proporzionale ... puoi usare qualsiasi metrica che rappresenti il ​​missile e la posizione bersaglio.

Ad esempio, se si utilizza una costante di proporzionalità di 2 e la LOS si sposta verso destra a 2 gradi/sec, ruotare il missile a destra a 4 gradi/sec. LOS a sinistra a 6 deg/sec, missile a sinistra a 12 deg/sec ...

Nel problema 3-d è identico tranne il "Cambiamento in LOS Rate" (e la risultante velocità di rotazione del missile) è stesso un vettore, cioè non ha solo una magnitudine, ma una direzione (ruoterò il missile a sinistra, a destra o su o giù o a 30 gradi sopra l'orizzontale a destra, ecc. ... Immagina, come pilota di missili , dove dovresti "impostare le ali" per applicare l'ascensore ...

Missili guidati dal radar, che "conoscono" il tasso di chiusura. regolare la costante di proporzionalità in base alla chiusura (maggiore è la chiusura, più veloce il missile tenta di girare), in modo che il missile diventi più aggressivo in scenari di chiusura alta (quando il tempo di volo è inferiore) e meno aggressivo in bassa chiusura (inseguimenti di coda) quando ha bisogno di risparmiare energia. Altri missili (come i Sidewinder), che non conoscono la chiusura, usano un valore di proporzionalità costante predeterminato). FWIW, Vietnam AIM-9 sidewinders ha utilizzato una costante di proporzionalità di 4.

+4

+1 per dare la risposta che stavo per digitare. Riepilogo per il lettore occasionale: se il rilevamento del bersaglio sta cambiando a sinistra, sterzare a sinistra. Se sta andando alla deriva, sterza a destra. Se è ad un rilevamento costante (diverso da quello direttamente dietro di te), sei su un percorso di intercettazione. Sidenote: questo funziona anche su una rampa d'ingresso sull'autostrada quando stai cercando di unire. Se vedi una macchina con una portata costante che sta diventando sempre più grande nella tua vista, è necessario apportare un cambiamento .... –

+0

@Bob, in realtà funziona anche quando l'obiettivo è dietro di te! l'unico problema è ciò che la chiusura è ... Se il tasso di LOS è zero (costante di LOS e stabile), potresti avvicinarti al bersaglio o allontanarti, ma sei in rotta di collisione. Questo è esattamente il modo in cui funzionano i missili aria-aria. –

+0

@elliot, Questo non produrrà un corso di collisione. Potrebbe anche non produrre un corso di intercettazione. Quando dici "viaggiando più veloce del bersaglio", sospetto che tu non stia davvero parlando della tua velocità, costruisci la tua chiusura sul bersaglio. Chiaramente, se smetti di "girare verso il tgt" una volta che sei "... più veloce del tgt", allora a quel punto potresti essere puntato in una direzione completamente sbagliata. Ma anche se intendevi la chiusura, questo non è affatto il miglior corso di collisione. E in alcuni casi (quando in piombo con meno della velocità del tgt), girando verso il tgt si riduce la chiusura anche furthur. –

16

Ho usato questo articolo CodeProject prima - ha alcune animazioni veramente bello per spiegare la matematica.

"The Mathematics of Targeting e Simulazione di un missile: Dal calcolo alla Formula Quartic": http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(anche, nascosto nei commenti in fondo di questo articolo è un riferimento alla some C++ code that accomplishes the same task dal wiki Unreal)

+0

+1, articolo eccellente, anche se richiede un impegno abbastanza da leggere quando POTREBBE solo fornire l'algoritmo (s). –

+0

Mi sarebbe piaciuto accettare anche questa risposta, dato che l'articolo è molto buono. Ho votato e consigliato che gli altri facciano lo stesso. –

0

Dovrai interpolare la traiettoria sia del bersaglio che del missile in funzione del tempo. Quindi cercare i tempi in cui le coordinate degli oggetti sono all'interno di un errore accettabile.

1

Avete considerato un feedback negativo sul recente cambiamento di rilevamento rispetto al cambio di tempo?

Dettagli lasciati come esercizio.

I suggerimenti sono completamente seri: se il bersaglio non manovra questo dovrebbe ottenere un'intercetta quasi ottimale. E dovrebbe convergere anche se l'obiettivo sta attivamente schivando.

Hai bisogno di maggiori dettagli?

Risoluzione in uno spazio bidimensionale per facilitare la notazione. Prendi \vec{m} come posizione del missile e vector \vec{t} Per essere la posizione del bersaglio. La direzione corrente nella direzione del movimento sull'ultima unità di tempo: \vec{h} = \bar{\vec{m}_i - \vec{m}_i-1}}. Sia r il vettore normalizzato tra il missile e il bersaglio: \vec{r} = \bar{\vec{t} - \vec{m}}. Il rilevamento è b = \vec{r} \dot \vec{h} Calcola il rilevamento in ogni momento, quindi cambia la direzione e modifica l'intestazione per ridurre al minimo tale quantità.

La matematica è più dura in 3d a causa della necessità di trovare il piano di azione ad ogni passaggio, ma il processo è lo stesso.

+1

@dmckee: Penso che tu sia stato downvoted perché la maggior parte delle persone che leggono questa risposta non hanno idea di cosa sei dicendo, e la versione originale della tua domanda non diceva praticamente nulla. –

+0

La realtà del problema di intercettazione dei missili naif è più semplice di questa. Stai calcolando un vettore di intercettazione che potresti voler fornire a un combattente intelligente. Un missile è perfettamente soddisfatto di "Mi sto avvicinando", quindi la costante semplificazione del cuscinetto discussa in altre risposte è perfettamente accettabile per questa applicazione. –

+0

@Bob: Questo * è * l'approccio costante del cuscinetto. Il feed negativo su porta a un input costante. Ritardi modulo e tassi di variazione, che potrebbero richiedere un controller PID piuttosto che un semplice circuito proporzionale. – dmckee

5

Dai uno sguardo allo OpenSteer. Ha il codice per risolvere problemi come questo. Guarda "steerForSeek" o "steerForPursuit".