Controllo AI per una nave con modello fisico


19

Sto cercando idee su come implementare il seguito nello spazio 2D. Sfortunatamente non so ancora molto su AI / ricerca di percorsi / controllo autonomo.

Diciamo che questa nave può muoversi liberamente ma ha massa e slancio. Inoltre, forze esterne potrebbero influenzarlo (esplosioni ecc.). Il giocatore può stabilire un bersaglio per la nave in qualsiasi momento e dovrebbe raggiungere quel punto e fermarsi.

Senza la fisica questo sarebbe semplice, basta indicare la direzione e andare. Ma come affrontare lo slancio esistente e poi fermarsi sul posto? Non voglio modificare direttamente il posizionamento della nave.

modifica: Giusto per chiarire, la matematica relativa alla fisica della nave stessa non è il problema.


Mi aspetto di incontrare presto un problema simile a questo; Non vedo l'ora di vedere le risposte a questo.
Bill

Risposte:


15

Dai un'occhiata ai comportamenti di guida . Soprattutto la ricerca e l' arrivo potrebbero essere interessanti per le tue esigenze. Questi comportamenti funzioneranno anche quando alcune altre influenze come un'esplosione cambiano temporaneamente la posizione delle navi.


+1. Per un gioco spaziale 2D consiglierei di usare i comportamenti di guida come framework e di utilizzare una delle mie risposte come componente all'interno di quel framework.
dieci

Stavo per suggerire lo stesso pensiero quando ho letto la domanda. Ho usato molto il comportamento dello sterzo, è facile e consente un bel AI / motion.
dotminic

5

Non è un problema facile ottenere esattamente nel modo giusto. Hai due scelte, anche se le specifiche di ciascuna soluzione variano:

Una soluzione matematica. Se il tuo sistema fisico è abbastanza semplice, puoi creare la forma chiusa per il tuo movimento e calcolare quando è necessario iniziare ad applicare una forza frenante per fermarsi in un punto. Se la forza frenante è costante e non si ha resistenza all'aria, questo dovrebbe decomporsi in quadratico.

Una soluzione imperiale. Puoi utilizzare un controller PID sintonizzato a mano o effettivamente registrare le distanze di frenata per la tua nave nel tuo sistema fisico: in un banco di prova, frena la nave dalla massima velocità fino a un arresto, registrando la distanza percorsa e la velocità ogni piccolo tempo. Memorizza il grafico distanza / velocità risultante in una directory di dati.

In fase di esecuzione, ricostruisci il grafico e collega la tua velocità attuale e la velocità target per ottenere una distanza. A questa distanza dal punto target è necessario essere a pieno freno.

Il vantaggio di questo approccio è che puoi usarlo per frenare esattamente a qualsiasi velocità. Lo svantaggio è che se i freni devono essere attivati ​​o disattivati, non sarai mai esattamente sulla curva.


1

Come detto prima, questa situazione è perfetta per i comportamenti di guida, ma vorrei solo estenderla leggermente. Il comportamento Arriva sarebbe perfetto per questo scenario. Potresti anche prendere in considerazione anche gli ostacoli. Qui puoi anche utilizzare il comportamento di Evitamento degli ostacoli.

Purtroppo, http://www.red3d.com/cwr/steer/ non fornisce il codice sorgente per i comportamenti. Tuttavia, la programmazione dell'IA di gioco per esempio fa e spiega i comportamenti in blocchi di facile comprensione. Se non riesci a ottenere il libro, puoi sempre ottenere il codice sorgente qui: http://www.wordware.com/files/ai/

Inoltre, se vuoi estendere il tuo movimento per includere il pathfinding, puoi avere una classe pathfinder che calcola il percorso (forse come una raccolta di vettori 2D) e usare il comportamento di guida Path Follow per aggiungere anche questo nel mix.

Il codice sorgente a cui ho collegato fornisce anche tre diversi metodi per combinare insieme questi comportamenti di guida.

Spero possa aiutare.


Il link red3d.com non fornisce direttamente le fonti , ma c'è un link proprio su quella pagina a OpenSteer ( opensteer.sourceforge.net ) che è un'implementazione open source dei comportamenti di guida.
Bummzack,

Ahh non lo sapeva, grazie. Tuttavia, ho cercato la fonte di OpenSteer e ho trovato più facile esaminare il più ovvio nel tuo codice di riferimento trovato nel libro di Buckland. Soprattutto all'inizio.
Ray Dey,

1

Sterzare verso una posizione non è troppo difficile, ma personalmente ho faticato per un po 'con il problema di guidare verso una posizione e raggiungerla a una velocità specifica, oppure seguire un percorso con vincoli di velocità.

Ho risolto il problema usando una curva di Hermite . Imposta p0 e m0 sulla posizione e le velocità della tua nave, p1 e m1 sulla posizione e velocità target. Ciò presuppone che si desideri che la nave segua un secondo dopo il bersaglio. Calcola la seconda derivata di p (0), che ti darà l'accelerazione da applicare alla tua nave.

Ecco il codice per la seconda derivata (in F #, spero che tu possa adattarlo alla tua lingua preferita; sq () calcola il quadrato, virgolette singole non interpretate come virgolette ma come caratteri, fanno parte dell'identificatore):

    let h'' t =
        let h00'' t = 12.0 * t - 6.0
        let h10'' t = 6.0 * t - 4.0
        let h01'' t = -12.0 * t + 6.0
        let h11'' t = 6.0 * t - 2.0

        let t = (t - t0) / diff_t

        (sq (1.0 / diff_t)) *
        ((h00'' t * p0) +
         (h10'' t * diff_t * v0) +
         (h01'' t * p1) +
         (h11'' t * diff_t * v1))

Nota che se la tua nave è soggetta a forze esterne (es. Gravità dei pianeti), dovrai tenerne conto nel calcolo della spinta dall'accelerazione.



-3

Penso che la tua nave dovrebbe avere parametri come: posizione e velocità.

La velocità è in ogni somma dei frame di tutte le forze (come gravità, esplosioni, input dell'utente ecc.) E può anche avere un qualche tipo di umidità.

La posizione viene calcolata dall'ultima posizione più la velocità * time_step.

Tuttavia, con questo può essere difficile implementare l'arresto sull'obiettivo.


3
-1 Sembra che Petteri Hietavirta sappia come usare un sistema fisico di base. Quindi la tua risposta a questa domanda è che fermarsi su un obiettivo è troppo difficile?
Attaccando
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.