Come generare grotte simili a quelle di Minecraft?


34

Ho lavorato su un mondo procedurale 3D per un po 'di tempo e voglio iniziare ad aggiungere sistemi di caverne. Attualmente sto usando il Perlin Noise 2D / 3D per la generazione del terreno in combinazione con Marching Cubes per un terreno più liscio. Mi sto solo sconcertando quando si tratta di lunghe caverne di interconnessione.

Spero di ottenere qualcosa di più simile ai sistemi di grotte di Minecraft. Sembrano essere molto connessi, si diramano casualmente in quasi tutte le direzioni e quasi ogni punto della caverna avrebbe un aspetto abbastanza circolare con un raggio abbastanza uguale dappertutto (non la migliore formulazione, ma non è del tutto sicuro di come dirlo) .

La più grande sfida per generare grotte come sto volendo è che voglio generare il mondo al volo. Il mondo è generato pezzo per pezzo attualmente, a partire da dove si trova il giocatore e si genera verso l'esterno da lì. NON vorrei generare alcun mondo e quindi scavare le caverne usando un modello errante, automi cellulari, ecc.

Ci sono algoritmi ben noti che possono essere utilizzati per questo? In tal caso, qualcuno vuole condividere come fanno qualcosa di simile? Gradirei molto qualsiasi aiuto.

Un buon esempio: inserisci qui la descrizione dell'immagine


5
Dai un'occhiata qui e scorri verso il basso.
William Mariager,

Negli ultimi 24 mesi è stato pubblicato un numero di una rivista per sviluppatori di giochi che ha approfondito la discussione su come fare ciò che stai cercando di fare. Vorrei colpire il loro sito.
Joey Green,

@JoeyGreen Qual è il nome della rivista? O hai un link al loro sito?
Jumpnett,

1
Si chiama rivista per sviluppatori di giochi. gdmag.com . È possibile ottenere un abbonamento e ottenere le versioni pdf della rivista negli ultimi 10+ anni. Se ti registri, c'è un modo per cercare tra i problemi precedenti e trovare il problema che desideri.
Joey Green,

Risposte:


30

Le grotte di Minecraft sono generate dal metodo "perlin worms". Il generatore si snoda attraverso il terreno e scava un tunnel. Minecraft non utilizza il rumore del perlin 3d per la generazione di caverne, perché tende a lasciare tasche non collegate nel terreno. Le caverne di Minecraft non sono state generate dal rumore Perlin 3d sin dalle primissime versioni Alpha.

Qui ci sono grotte in Gnomescroll generate dal metodo "perlin worm".

Gnomescroll Cave System Visuale in prima persona 1

Gnomescroll Cave System Visuale in prima persona 2

Gnomescroll Cave System Vista in terza persona 2

Questi sono i libormi "Perlin Worms" del tutorial di libnoise. La tecnica riproduce da vicino le grotte generate in Minecraft.

Tutorial Linoise Perlin Worms

I parametri di serpeggiamento influiscono sulla qualità del sistema di grotte e determinano quanto sono verticali le grotte e quanto velocemente cambiano direzione. Grotte nel ramo di Minecraft e il raggio del tunnel della caverna è variato lungo la lunghezza delle grotte.

Minecraft genera le grotte su un blocco per base di pezzi. L'approccio richiesto è complicato e nessuno ha ancora perfettamente progettato il generatore di caverne di Minecraft, nonostante l'interesse dei modder del server.

L'approccio più probabile genera le grotte serpeggianti pezzo per pezzo mentre la mappa infinita viene generata e si espande verso l'esterno. Le grotte sul blocco corrente sono funzioni dei semi delle caverne sui blocchi N più vicini per alcuni N. Utilizzando un generatore di numeri casuali che è una funzione delle coordinate del blocco per seminare le grotte, è possibile calcolare le grotte sul blocco corrente per un mappa infinita mentre si valutano solo i blocchi entro un raggio di blocco finito.


3
Puoi aggiungere alcune informazioni o risorse per conoscere questa cosa "perlin worms"?
David Gouveia,

1
Questo è un tutorial su "perlin worms" libnoise.sourceforge.net/examples/worms/index.html
HaltingState

Non necessario, ma se potessi approfondire l'ultimo paragrafo, lo apprezzerei molto. Per generare un worm, suppongo che avresti bisogno di un punto di partenza per worm, che dovrebbe trovarsi all'interno di N blocchi di qualsiasi giocatore in cui N è la lunghezza massima di un worm.
Mitici

3
Esattamente. Ogni worm ha un punto di partenza e termina se vaga al di fuori di un certo raggio di blocco. Esiste un generatore di numeri casuali che genera in modo deterministico una sequenza numerica pseudo casuale che è una funzione delle coordinate del blocco. Questi numeri casuali determinano dove e quanti worm hanno origine in quel nodo. I vermi possono anche ramificarsi. L'onere computazionale è ridotto se i worm sono più "locali" e non possono avventurarsi più di un piccolo raggio di blocco.
HaltingState,

Forse non esattamente quello che volevo sentire, ma quello che mi aspettavo. Grazie ancora HaltingState. :)
Mitici

7

Genererei una nuvola di punti all'interno di aree in cui il terreno è solido - puoi sperimentare con densità diverse. Quindi userei un algoritmo come un albero di spanning minimo per collegare tutti i punti - questo assicurerà che ogni area sia raggiungibile. Quindi disegna semplicemente grandi aree vuote (composte da aria) da nodo a nodo (cioè una linea spessa di voxel).


Potrei non capire esattamente cosa intendi con questo, ma come potrei farlo al volo pezzo per pezzo mentre il mondo genera?
Mitici

Un modo possibile è generare l'albero di spanning minimo all'interno di ciascun blocco separatamente, quindi collegare ciascun blocco trovando i due nodi più vicini tra i due blocchi. Dopo aver completato un blocco con l'algoritmo del terreno predefinito, è possibile scavarlo attorno all'albero di spanning minimo.
Gavan Woolery,

1
un'altra soluzione (più semplice), sebbene meno efficiente e probabilmente "più rumorosa", è quella di usare il moto browniano per ritagliare un percorso (un po 'come una formica che scava casualmente).
Gavan Woolery,


1

Utilizzare una funzione noise per assegnare valori a ciascun blocco per determinare se ha tunnel o meno e quindi utilizzarli per decidere dove posizionare le grotte. Se vuoi tunnel, usa semplicemente più funzioni di rumore (con diversi semi) e usa i loro valori per determinare se ci sono tunnel. Successivamente, utilizzare le normali funzioni di "disegno" per creare i tunnel. Per rendere tutto più realistico, usa più rumore per fare uno spostamento casuale per i punti di origine di dette grotte / tunnel.

Se non si desidera utilizzare più funzioni di rumore, è possibile sondare a distanze maggiori, ad esempio anziché fare noise3d (2,2,2) per chunk a (2,2,2) do noise3d (2,2, 16) e utilizzare (2,2,16) per un valore, (2,2,17) per il secondo valore, ecc .... quindi sintonizzare la frequenza di conseguenza per rendere tutti i valori indipendenti o correlati su scala ridotta.

Per variare la densità della caverna nel mondo, utilizzare un'altra funzione a frequenza più bassa che influenzerà tali valori.

Nel caso in cui ciò comporti caverne disordinate, è sufficiente aumentare la distanza di detti punti interconnessi o altrimenti regolare l'algoritmo.

Non sono sicuro che Minecraft faccia caverne come questa (anche se penso che lo faccia), ma questa soluzione dovrebbe produrre risultati soddisfacenti.


-5

qui è

Anche se la maggior parte delle grotte come quelle sopra usano il worm Perlin , alcune persone preferiscono farlo manualmente. In questo modo possono farlo come vogliono esattamente blocco per blocco. Una grotta creata usando il verme Perlin può essere inaccurata e può solo rendere la grotta alta 5 piedi e larga 6 piedi, questo può essere inaccurato in quanto potresti volerlo alto 10 piedi e largo 15 piedi.

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.