Come posso generare una mesh di navigazione per una griglia a tessere?


18

In realtà non ho ancora iniziato a programmare per questo, ma volevo vedere come avrei fatto a farlo comunque.

Supponiamo che io abbia una griglia di tessere, tutte della stessa dimensione, alcune percorribili e altre no. Come farei per creare una mesh di navigazione di poligoni da questa griglia?

La mia idea era quella di togliere le tessere non attraversabili ed estendere le linee da lì ai bordi per creare poligoni ... questo è tutto ciò che ho ottenuto finora. Qualche consiglio?


2
Tecnicamente la griglia è praticamente equivalente a una mesh di navigazione. Sospetto che tu stia effettivamente chiedendo un modo per ottimizzare la griglia e unire i quadrati adiacenti.
Kylotan,

@Kylotan Sì, è esattamente quello che volevo dire, solo un modo per combinare poligoni adiacenti.
Ross Hays,

Risposte:


28

Ecco uno dei metodi che mi sono venuti in mente quando facevo navmesh per un gioco RTS. Si noti che è homebrew, non sono stati utilizzati strumenti di terze parti, ci sono volute circa 3 settimane per implementare e correggere bug:

  1. Utilizza l' algoritmo Marching Squares per convertire le tessere ostacolo in contorni . Nota che anche i bordi della mappa sono un contorno e devono essere inclusi anche.
  2. Riduci il numero di punti nei contorni usando l' algoritmo Douglas-Peucker (linee viola nell'immagine in basso)
  3. Inserisci tutti i punti nella triangolazione di Delaunay (per ottenere triangoli più uniformi)
  4. Aggiungi punti aggiuntivi nelle aree vuote e lungo i bordi della mappa (per ottenere una mesh più uniforme)
  5. Controlla lungo i contorni degli ostacoli e capovolgi i poligoni prodotti da Delaunay per abbinare i contorni. - Spesso Delaunay potrebbe posizionare triangoli (grigi) che non corrispondono ai contorni (rosso), quindi è necessario rilevarli e capovolgerli. Raggruppandoli di nuovo in un poligono, dividerlo lungo i contorni e triangolarlo manualmente inserisci qui la descrizione dell'immagine
  6. Taglia ostacoli interni - rimuovi i poligoni che si trovano all'interno degli ostacoli (rosa nella foto sopra)
  7. Inserisci i dati di connettività tra i triangoli e i vertici rimanenti di cui hai bisogno : questa è la tua navmesh.

Risultato:

tilemap navmesh


1

Le mesh sono in genere implementate come grafici. Se si desidera implementare il percorso in una mappa basata su una griglia, procedere come segue:

Crea un grafico in cui ogni quadrato attraversabile è rappresentato come un vertice. Ogni coppia di quadrati attraversabili adiacenti rappresentati come vertici, avrà un bordo tra loro. E hai finito.


1
Questo non è il modo in cui le reti navali sono generalmente implementate. Lo scopo di una navmesh (e, immagino, il motivo per cui il richiedente ha anche posto la sua domanda qui) è di ottimizzare il grafico fino a un numero minimo richiesto di poligoni (solitamente triangoli) che abbracciano gli spazi più utili per ridurre sia il numero di i passaggi necessari per trovare un buon percorso e il footprint di memoria richiesto per definire la mesh. Un'implementazione grezza consumerebbe molta più memoria e sprecherebbe tempo prezioso nell'elaborazione dell'IA.
Gurgadurgen,

Hai ragione. Naturalmente la decimazione (riduzione del poligono) è un'ottimizzazione ragionevole e desiderata. È solo che quando leggi la domanda dell'op, hai la sensazione che voglia solo trasformare una griglia in un grafico.
Wolfdawn,
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.