Come si potrebbe generare una griglia di navigazione per un mondo 3D?


11

Sto cercando di trovare una soluzione a questo problema. Sto cercando di costruire una mesh di navigazione nel formato di una griglia di vertici bloccata su coordinate x, y con pavimento a forma di quadrati per lo spazio 3D. Ma sto riscontrando problemi nel cercare di trovare un modo per farlo.

Ho provato a guardare nella libreria di rifusione. È un metodo abbastanza robusto, ma a quanto pare rallenta con mappe più grandi e spazio aperto. Inoltre non so come generano vertici e spigoli per lo spazio mondiale con la mappa di altezza.

Il mio prossimo pensiero fu quello di fare quello che faceva Unreal Engine 3.

https://udn.epicgames.com/Three/NavigationMeshReference.html

Che doveva usare i raycast per generare la mesh. Non riuscivo a capire come fermare i raycast.

Quindi ... la mia prossima opzione era box, probabilmente un cast box. Crea un volume suddiviso con una dimensione che sia una potenza di 2. Allinea la scatola alla griglia e spara i prismi rettangolari verso il basso come un raggio. Se atterra su un pezzo di geometria che fa parte del terreno e il rettangolo non viene intersecato, lascia lì un quadrato. E continuare verso il basso fino a raggiungere i limiti del volume. Per verificare se i bordi devono essere collegati, suppongo di poter verificare se la pendenza tra due coppie di vertici si trova all'interno della pendenza percorribile, unendoli se questo è vero.

I miei problemi principali sono ... questo non sembra essere molto ottimale. Senza pensarci, alla stima il processo è O (N ^ 3) per un livello multistrato. Che può diventare piuttosto brutto.

E l'ultimo bit è per la creazione automatica di gruppi rettangolari di questi quadrati. Non sono del tutto sicuro di come farlo. L'implementazione di Unreal li separa per pendenze. Tuttavia, sto cercando di mantenere il formato della griglia. Quindi non è del tutto necessario. Il problema persiste nella creazione di grandi tessere rettangolari per suddividere il processo di ricerca del percorso in una base per tessera. Le tessere non possono essere troppo grandi, né troppo piccole.

Quindi le domande sono ...

Quale sarebbe un modo efficiente per generare questa navmesh cinta? E quale sarebbe un buon modo per creare le piastrelle?


Quando prevedete di generare la mesh? Compile-time, Load-time o Real-time? Abbiamo lottato con lo stesso problema e alla fine abbiamo deciso che era eccessivo per il nostro scenario (generazione del tempo di caricamento in uno sparatutto top-down senza percorsi sovrapposti), abbiamo deciso di adottare un approccio basato su quad-tree. Questo ha funzionato abbastanza bene per noi. Quindi immagino che quello che sto chiedendo sia: ne hai davvero bisogno o qual è la soluzione più semplice che soddisfi i tuoi requisiti iniziali perché può essere un dispendio di tempo. Se riesci a gestire una buona soluzione, mi piacerebbe sapere come l'hai risolta.
Niels

@Niels Ho intenzione di pre-costruire, quindi caricarlo nel gioco.
chiaro di luna

Quindi il consumo di tempo non dovrebbe essere troppo di uno svantaggio iniziale, dal momento che il giocatore non lo aspetterà. Puoi sempre ottimizzare dopo che hai funzionato.
Niels

Quanto è grande il tuo livello? Abbiamo usato la rifusione su giochi di grandi dimensioni e non abbiamo avuto problemi - devi semplicemente regolare i valori tiie, ecc.
Steven

Penso che ti manchi il pezzo "grigliato". Che non è esattamente lo stesso delle tessere che usa la rifusione. Sto cercando di capire come riutilizzare la rifusione per fare una cosa del genere. Ma è stato principalmente un incubo.
moonshineTeleocat

Risposte:


1

Un mondo 3D di base potrebbe essere rappresentato da una mesh di navigazione che può essere comodamente costruita nella maggior parte dei motori di gioco. L'attore può viaggiare lungo i bordi dei poligoni.

Sarebbe una soluzione semplice. Esistono molti algoritmi per la ricerca di percorsi e la generazione di una navmesh.

Vorrei condividere qualcosa che ho letto qualche tempo fa.

Example01

Questo descrive una possibile soluzione in cui possiamo dividere il nostro mondo di gioco in tessere quadrate. ogni volta che una tessera quadrata viene aggiunta al gioco (quando il giocatore si avvicina ad un'area / terreno procedurale), viene aggiunta una tessera quadrata. Tuttavia, non dobbiamo più calcolare l'intera rete navale. lo calcoliamo solo per quel riquadro e lo aggiungiamo al grafico esistente. Significativo guadagno in termini di prestazioni lì.

Example02

Il prossimo problema affrontato è il movimento frastagliato dell'esempio precedente. Posso capire che considerando le svolte future e generalizzando la direzione ridurrebbe molto il movimento a zig-zag e rendere fluido il movimento. I giochi con animazioni dettagliate non lo regalano, ma puoi notarlo in alcuni giochi open world in cui suppongo che la navigazione sia principalmente cotta.

Per quanto riguarda la domanda, ti consiglio di dare un'occhiata alla risposta di Kromster su un elenco di algoritmi di generazione di navmesh.

Scopri anche I sistemi AI di Left 4 Dead di cui fanno parte gli esempi. Molti altri argomenti interessanti trattati

In bocca al lupo.


0

ci sono molti modi, perché non limitarsi a renderlo locale per il giocatore, fare una piccola griglia che segue il giocatore e controlla sotto ogni incrocio se è o meno trasportabile, come se ci fosse un piano lì e fare un cast di raggi per vedere se c'è un muro / edificio su qualsiasi lato imminente ..


Una buona idea, ma non praticabile per gli obiettivi finali. Ho bisogno di supportare un grande mondo e consentire all'intelligenza artificiale di navigare da un lato all'altro di un continente. Questo è fattibile, ma avrei bisogno di avere una griglia di navigazione fissa in atto per generare i nodi più alti.
chiaro di luna

0

Questo è un problema che ho visto ovunque. Il trucco è "separazione delle preoccupazioni". "Di che cosa?", Ti ho sentito pensare. Ciò che viene visualizzato sullo schermo NON è la "struttura dei dati". È importante mantenere gli oggetti visivi separati dai dati per costruirli. In questo modo il gioco sarà sempre "a prova di futuro" quando verranno rilasciate nuove versioni del software sottostante.

Costruisci una struttura di dati (aka: modello) che rappresenterà il tuo mondo di gioco. Quindi costruire una "vista" del modello di struttura dei dati. Se vuoi cambiare il mondo da una griglia a scacchiera a una griglia esagonale, la struttura dei dati (modello) rimane la stessa, ma il display "dipingerà" (renderizza) una vista diversa.


4
Sebbene la separazione delle preoccupazioni sia effettivamente una buona pratica in generale, questa risposta è attualmente chiara sui dettagli specifici per rispondere alla domanda (ad es. Come generare un modello di tracciamento dei percorsi basato sulla griglia adatto da un determinato insieme di geometria mondiale). Hai ragione nel dire che qualunque sia questo modello, dovrebbe probabilmente essere separato dai dati usati per disegnare il livello, ma per rispondere alla domanda abbiamo ancora bisogno di un metodo per generare questo modello di path-tracking.
DMGregory

-2

Crea un doppio array. E quindi se un oggetto / gli oggetti sono impraticabili, disporre di un metodo per dire all'array che la posizione non è percorribile. Quando un'intelligenza artificiale tenta di spostarsi, guarderà il doppio array e vedrà se è passabile.


4
Il metodo per popolare questo array è la parte difficile. ;)
DMGregory
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.