Domanda

Ho un gioco sul quale sto lavorando che contiene missili di riferimento. Al momento si rivolgono solo verso il loro obiettivo, che produce un risultato piuttosto stupido, con tutti i missili che seguono l'obiettivo intorno.

Voglio creare un sapore più micidiale di missili che mirerà al punto in cui l'obiettivo "sarà". quando arriva lì e mi sento un po 'bloccato e confuso su come farlo.

Immagino che dovrò capire dove sarà il mio obiettivo ad un certo punto in futuro (una supposizione comunque), ma non riesco a capire quanto lontano guardare. Deve essere basato su quanto lontano il missile è lontano dal bersaglio, ma anche il bersaglio si sta muovendo.

I miei missili hanno una spinta costante, combinata con una debole capacità di girare. La speranza è che siano veloci ed eccitanti, ma sterzare come una mucca (cioè, male, per i fan non HitchHiker là fuori).

Comunque, mi è sembrato una specie di problema divertente per Stack Overflow che mi ha aiutato a risolvere, quindi qualsiasi idea o suggerimento su meglio o "più divertente" i missili sarebbero stati tutti ricevuti con gratitudine.

Il prossimo sarà AI per schivarli ...

È stato utile?

Soluzione

Quello che stai suggerendo si chiama " Guida ai comandi " ma esiste un modo più semplice e migliore.

Il modo in cui i veri missili lo fanno generalmente (non tutti sono uguali) sta usando un sistema chiamato Navigazione proporzionale. Ciò significa che il missile "gira". nella stessa direzione della linea di mira (LOS) tra il missile e il bersaglio sta ruotando, con una velocità di virata "proporzionale". alla velocità di LOS ... Questo farà quello che stai chiedendo come quando la velocità di LOS è zero, sei in rotta di collisione.

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

Ad esempio, se si utilizza una costante di proporzionalità pari a 2 e il LOS si sposta a destra a 2 ° / sec, girare il missile a destra a 4 ° / sec. LOS a sinistra a 6 ° / sec, missile a sinistra a 12 ° / sec ...

Nel 3-d il problema è identico, tranne per il fatto che "Cambio in LOS Rate" (e la risultante velocità di virata del missile) è esso stesso un vettore, cioè non ha solo una grandezza, ma una direzione (Devo girare il missile sinistra, destra o su o giù o 30 gradi sopra l'orizzontale a destra, ecc ... Immagina, come pilota missilistico, dove "posizioneresti le ali" per applicare l'ascensore ...

Missili guidati radar, che "conoscono" il tasso di chiusura. regolare la costante di proporzionalità in base alla chiusura (maggiore è la chiusura, più velocemente il missile tenta di girare), in modo che il missile ruoti in modo più aggressivo in scenari di chiusura elevata (quando il tempo di volo è inferiore) e meno aggressivo in chiusura bassa (inseguimenti della coda) quando deve conservare energia. Altri missili (come Sidewinder), che non conoscono la chiusura, usano un valore di proporzionalità predeterminato costante). FWIW, SideWinder dell'era vietnamita AIM-9 utilizzava una costante di proporzionalità di 4.

Altri suggerimenti

Ho già usato questo articolo di CodeProject - ha alcune animazioni davvero belle per spiegare la matematica.

" The Mathematics of Targeting and Simulation a Missile: From Calculus to the Quartic Formula " ;: http://www.codeproject.com/KB/recipes/Missile_Guidance_System.aspx

(inoltre, nascosto nei commenti in fondo a quell'articolo c'è un riferimento a del codice C ++ che compie lo stesso compito dalla wiki di Unreal)

Dai un'occhiata a OpenSteer . Ha un codice per risolvere problemi come questo. Guarda "steerForSeek" o "steerForPursuit".

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

Dettagli lasciati come esercizio.

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

Hai bisogno di maggiori dettagli?

Risoluzione in uno spazio bidimensionale per facilità di notazione. Prendi \ vec {m} come posizione del missile e vector \ vec {t} come posizione del bersaglio. L'intestazione 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 ad ogni segno di spunta e il relativo cambio e cambia direzione per ridurre al minimo tale quantità.

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

Ti consigliamo di interpolare la traiettoria sia del bersaglio che del missile in funzione del tempo. Quindi cerca i tempi in cui le coordinate degli oggetti si trovano all'interno di un errore accettabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top