Evitare l'orbita nell'inseguimento del comportamento di guida


9

Ho un missile che insegue il comportamento per rintracciare (e provare e incidere) il suo obiettivo (stazionario).

Funziona bene fintanto che non ti stai muovere quando lanci il missile. Se stai lottando, il missile tende a orbitare attorno al bersaglio.

inserisci qui la descrizione dell'immagine

Ho risolto questo problema accelerando prima tangenzialmente al bersaglio , uccidendo prima la componente tangenziale della velocità, quindi ricoprendo il bersaglio.

inserisci qui la descrizione dell'immagine

Quindi accelero in -vT fino a quando vT è quasi 0. Quindi accelero nella direzione di vN.

Mentre funziona, sto cercando una soluzione più elegante in cui il missile è in grado di colpire il bersaglio senza prima uccidere esplicitamente il componente tangenziale.


Non credo che tu possa ottenere una risposta soddisfacente senza spiegare qual è il tuo algoritmo di guida. Sono abbastanza sicuro che il problema risieda nella tua euristica lì.
Sam Hocevar,

1
In realtà, questa è stata la risposta che ho usato
bobobobo il

Risposte:


5

Sembra che il problema sia che il missile sta semplicemente puntando il bersaglio senza tener conto della sua velocità attuale. Assegna al tuo missile un angolo massimo in base al quale la spinta può deviare dalla linea di movimento.

Ad ogni iterazione di guida si calcola la sua velocità perpendicolare al bersaglio. Scopri quanto deve ribaltare il suo motore per azzerare questo componente della sua velocità e poi aggancialo al massimo che può inclinare il suo motore.

Durante la prima parte del suo volo si sposterà leggermente a destra della linea retta nella figura # 2 ma mentre vola il motore azzererà questo componente e finirà per dirigersi dritto verso l'obiettivo.

Si noti che in questo scenario ci sarà un solo frame in cui il motore ha una deflessione di qualsiasi cosa diversa da zero o max. Se stavi seguendo un bersaglio in movimento, potresti ottenere deviazioni minori su ogni ciclo mentre il bersaglio si muoveva.


4

Potrebbe non essere la soluzione elegante che stai cercando, ma ho scoperto che se rallento il missile, se sta per perdere, quando si avvicina al bersaglio, si traccia e gira efficacemente più velocemente e può colpire il bersaglio. Potresti aumentare la velocità di virata del missile man mano che si avvicina, piuttosto che ridurne la velocità, ma questo potrebbe dare ai giocatori una "brutta sorpresa".

Questo potrebbe non sembrare così grande, ma certamente impedisce ai missili di orbitare, e dal cerchio nemico che attacca il missile fino a quando il carburante si esaurisce.

Ecco una demo che ho messo insieme della mia implementazione (il terzo o il quarto missile lo dimostra, e ancora alle 1:05): http://www.youtube.com/watch?v=9uiGMC_nH2w

Puoi anche aumentare la precisione del missile mentre si avvicina al bersaglio (in quanto ha una firma più vicina a cui agganciarsi). Questo è mostrato anche nel video circa un minuto dopo. Il cerchio rosso mostra il bersaglio reale del missile. Questo gli dà una via di volo caotica quando è a lungo raggio, e poi si raddrizza più si avvicina.

Come ho detto, potrebbe non essere la risposta che stai cercando, ma spero che ti aiuti se solo un po '.


È abbastanza bello. Vado per la massima accelerazione, ma avere il missile al rallentamento è un trucco accurato (e può essere usato se li chiami "missili
ingannevoli

4

Intuizione

Ecco un modo: ruotiamo il diagramma.

una rotazione dell'illustrazione del problema originale

Ora il razzo è una palla di cannone !

Fisica

Ha un'accelerazione fissa "verso il basso", cioè perpendicolare al vettore dalla posizione di sparo al bersaglio. L'ho disegnato sopra come una linea verde tratteggiata. Chiamiamolo l' orizzonte di riferimento . (Nota che questo orizzonte di riferimento è costante! Il razzo è stato lanciato da una posizione fissa con una posizione fissa come bersaglio.)

Sappiamo (da Wikipedia ) per una palla di cannone senza resistenza all'aria, che d = v^2 * sin(2 * theta) / g, dove

  • d è la distanza orizzontale percorsa (distanza tra posizione di tiro e bersaglio)
  • v è la velocità con cui è stato sparato il proiettile
  • thetaè l'angolo da all'orizzonte il proiettile è stato sparato a ( angolo di direzione fuoco vettoriale dalla orizzonte di riferimento )

Riorganizzare l'equazione per gg = v^2 * sin(2 * theta) / d.

La costante dell'equazione della palla di cannone gè l' accelerazione dovuta alla gravità . Possiamo intenderlo come un'accelerazione dovuta alla propulsione a razzo . Anche questo va bene - è ancora un'accelerazione costante in una direzione costante .

E adesso?

Esegui quell'equazione per gquando spari il razzo. Ti dirà quanto accelerare perpendicolarmente il razzo verso l'orizzonte di riferimento, al fine di colpire il bersaglio. Poiché la direzione di tale accelerazione è costante, non si formerà un'orbita.

Boom.


Questo è un approccio pulito. Penso che questo farà sì che il razzo rintracci un cerchio , stai fornendo la forza centripeta necessaria per orbitare un cerchio che sembra colpire il bersaglio. Credo che questo potrebbe essere stato l'approccio usato per le conchiglie rosse in Mario Kart , perché ho sempre pensato che tendessero ad arco circolare
bobobobo,

La forza applicata qui non è centripeta. La direzione della forza è perpendicolare all'orizzonte di riferimento, che non cambia se il bersaglio è fermo. Ciò significa che il comportamento in orbita non può avvenire.
Anko,

Ho modificato la risposta per renderlo più chiaro.
Anko,

@Anko: Non sono sicuro che la tua matematica qui funzioni per un obiettivo mobile, come sembra essere il fattore scatenante per il caso dei PO.
Mooing Duck il

@Mooing Hai ragione, questo funzionerebbe solo per gli obiettivi in ​​movimento se si muovono in modo prevedibile e se miri alla previsione. La questione non menziona esplicitamente l'obiettivo è però fermo, nella prima frase.
Anko,
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.