Come posso generare una mesh di navigazione 2D in un ambiente dinamico in fase di esecuzione?


9

Quindi ho capito come usare A * per la ricerca del percorso e sono in grado di usarlo su una griglia. Tuttavia, il mio mondo di gioco è enorme e ho molti nemici che si muovono verso il giocatore, che è un bersaglio mobile, quindi un sistema a griglia è troppo lento per la ricerca del percorso. Devo semplificare il mio grafico dei nodi usando una mesh di navigazione.

Comprendo il concetto di "come" funziona una mesh (trovare un percorso attraverso i nodi sui vertici e / o sui centri dei bordi dei poligoni).

Il mio gioco utilizza ostacoli dinamici generati proceduralmente in fase di esecuzione.

Non riesco a capire come prendere un aereo con più ostacoli e dividere programmaticamente l'area percorribile in poligoni per la mesh di navigazione, come nella figura seguente.

maglia di navigazione

Da dove comincio? Come faccio a sapere quando un segmento di area percorribile a piedi è già definito, o peggio, quando mi rendo conto di dover suddividere un'area percorribile in precedenza definita quando l'algoritmo "cammina" attraverso la mappa?

Sto usando JavaScript in nodejs, se è importante.


1
Il partizionamento dinamico che stai tentando di implementare dipenderà dalle specifiche degli elementi della tua mappa. I tuoi ostacoli sono interamente composti da rettangoli allineati a griglia come mostrato nel tuo esempio? Rettangoli ruotati? Poligoni irregolari? O forme non poligonali con molte curve? Hai dati point / poly per la forma degli ostacoli? In caso affermativo, i dati di forma in termini di triangoli, rettangoli, poligoni esclusivamente convessi o un mix di poligoni convessi e concavi?
Matthew R,

@Matthew Il mio mondo è composto da ostacoli poligonali convessi, senza curve e senza poligoni concavi. Ogni ostacolo è memorizzato come un oggetto poligono con vertici rappresentati da oggetti vettoriali.
Stephen,

1
Per quello che vale, sto lavorando a una soluzione basata su questo documento: gradworks.umi.com/3493710.pdf Se avrò successo pubblicherò la mia soluzione.
Stephen,

1
la mesh di navigazione non è al 100% per dirti se puoi andare da qualche parte o no, è solo un contorno di base di aree percorribili, devi ancora fare controlli di collisione contro oggetti dinamici, modifica: praticamente quello che ha detto Ray
dreta

@Stephen - Vedi la risposta al commento lungo .
Matthew R

Risposte:


3

@Stephen - Commento lungo - Quel documento sembra che potrebbe valere la pena leggerlo quando avrò del tempo. Fondamentalmente quello che avrei suggerito è qualcosa sulla falsariga dell'algoritmo Hertel-Mehlhorn che è menzionato nel documento (un riferimento per questo algoritmo specifico può essere trovato qui http://www.bringyou.to/compgeom/ ) con l'aggiunta di suddividere i lati della mappa (al di fuori dei confini dell'area di gioco) un certo numero di volte per ridurre le occorrenze di più piccoli triangoli formati negli angoli. Quei piccoli triangoli possono essere problematici in quanto possono finire per essere più piccoli di ciò per cui stai preformando il percorso. L'Hertel-Mehlhorn è per la riduzione dei poligoni prodotti da un partizionamento triangolare se sei interessato qui è più sulla triangolazione:http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm .

Inoltre, se preferisci non reinventare la ruota, penso che questa libreria farà davvero tutto il necessario: http://code.google.com/p/polypartition/ . Preforma le triangolazioni e le riduzioni con una delle numerose opzioni tra cui Hertel-Mehlhorn. È una licenza MIT che significa che può essere utilizzata per progetti chiusi e commerciali se questo è un problema.

Se decidi di continuare a lavorare sulla tua implementazione, mi piacerebbe vedere cosa ti viene in mente.


1
Ottima risposta, @Mathew. E dovresti assolutamente leggere quel giornale! È facile da seguire e spiega una grande tecnica (in particolare l'Appendice A che parla della scoperta / generazione della mesh basata su agenti). Sto codificando una versione di questo algoritmo per JavaScript, e sta andando bene. Lo posterò come risposta al termine.
Stephen,

@Stephen piacerebbe vedere questo lavoro
kevzettler,

@Stephen Sto cercando anche una versione javascript
Apolo

6

Piuttosto che una mesh, potresti semplicemente considerare un approccio gerarchico A *. Il più grande vantaggio di una mesh è nel gestire mondi di gioco che non sono allineati alla griglia, piuttosto che nel ridurre la complessità da una griglia.

Con un approccio gerarchico, si suddivide ripetutamente il proprio mondo (proprio come un albero quad) e si generano informazioni di connettività tra i nodi. È quindi possibile generare rapidamente un percorso tra grossi blocchi del mondo e utilizzare solo la griglia ad alta risoluzione per trovare il percorso all'interno di un blocco più grande.

L'approccio gerarchico darà prestazioni di ordini di grandezza migliori, mentre una mesh nella migliore delle ipotesi ti darà solo un piccolo miglioramento lineare.

L'approccio ingenuo è quello di dividere il tuo mondo in blocchi X allineati alla griglia X per X più grandi, generare le informazioni di connettività tra di loro (ad esempio, c'è un percorso tra il blocco 2x1 da 3x1 a 2x2 e qual è la distanza del percorso medio) .

Tieni presente che potresti non ottenere sempre percorsi ideali con questo approccio in alcune circostanze particolari. La generazione di strati di blocchi di dimensioni variabili allevia il problema, ma onestamente di solito è semplicemente più semplice evitare la creazione di percorsi problematici e fare affidamento sul fatto che è altamente improbabile che il giocatore noti nemici che intraprendono percorsi non ottimali, tranne nel il più degenerato dei casi.


1
Dovrei spiegare ulteriormente: il mio gioco non è allineato alla griglia. Stavo costruendo una griglia in un'area di 800 x 600 pixel, ogni pixel era uno spazio sulla griglia (stavo ancora scoprendo A *, quindi non pensavo ancora alle prestazioni di questo). Ho ostacoli che non sono così semplici come quelli nell'immagine di esempio sopra, stavo solo cercando di illustrare il problema. Ovviamente un tale campo di gioco doveva essere rivisto, e dopo alcune ricerche penso che una maglia nav sarebbe la strada giusta da percorrere.
Stephen,

3

Penso che potresti complicarti troppo. Probabilmente non è necessario generare al volo mesh di navigazione. Invece, disponi di una mesh di navigazione statica per il tuo mondo di base.

Il percorso attorno agli ostacoli può essere risolto usando comportamenti di guida (usare la funzione di prevenzione degli ostacoli). Se per caso il tuo ostacolo è così grande da riempire o bloccare completamente il viaggio da un poli di navigazione a quello successivo, allora hai un modo per controllare questo caso limite e ricalcolare il percorso tra il poli in cui ti trovi attualmente e il uno da cui sei bloccato.

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.