Generazione di caverne con worm Perlin


12

Attualmente sto provando a generare un terreno Minecraft come voxel con 3D Simplex Noise e voglio anche implementare grotte.

Ho trovato il metodo di Perlin Worms in questo thread, che genera risultati davvero piacevoli. Tuttavia, non ho idea di come generarlo su una base per blocco. È possibile o ci sono alternative che producono un verme simile come una caverna su un pezzo per pezzo?

Modifica: questo è il problema che non so come risolvere.

Modifica2: questo è il risultato della combinazione del rumore 2D multifrattale in rilievo con una mappa di altezza del rumore simplex. Ha ancora bisogno di qualche modifica, ma questo è praticamente il risultato che volevo. Grazie a Byte56.


Se possibile, utilizzare formule dirette per la generazione del terreno. Se riesci a calcolare un voxel solo in base alle sue coordinate e senza informazioni su quelle adiacenti, i blocchi non sono più un problema. Se vuoi usare i worm perlin, che immagino non possano essere calcolati individualmente per ogni voxel, dai un'occhiata all'ultimo paragrafo nella risposta accettata della domanda che hai collegato.
danijar,

1
Fondamentalmente, questa è la mia domanda. Il terreno di base è facile da calcolare con solo le coordinate fornite, ma non so come calcolare, che ci sia o meno una grotta.
user000user

Risposte:


5

La maggior parte degli algoritmi di rumore perlin ti consentirà di recuperare il valore del rumore in qualsiasi posizione, con qualcosa del genere noise(x,y,z). Ciò rende abbastanza banale generare rumore su un pezzo per pezzo. Tutto quello che devi fare è passare la posizione globale, anziché la posizione del blocco.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Quindi puoi vedere, stiamo generando terreno per il pezzo, ripetendo i limiti del pezzo e controllando se quella posizione globale è solida o no. Questa è probabilmente la stessa metodologia che stai usando per generare il terreno in generale.

perlinNoise.getprende una posizione globale e restituisce la sua densità. Dove isSolidsarebbe solo un semplice test per vedere se il voxel è "abbastanza denso" per qualificarsi per solido.

perlinNoise.getpuò essere più complesso di un semplice algoritmo di rumore. Puoi avere controlli basati sulla profondità del voxel nel tuo mondo. Ad esempio, se il voxel è al di sotto di quello che hai deciso è "livello base del suolo assoluto", allora può usare l'algoritmo perlin worms per restituire una densità, se è al di sopra della base assoluta, può usare una normale funzione di densità per darti terreno più vario. Consiglierei comunque una fusione tra i due.

La combinazione di diverse funzioni del rumore Perlin è solo qualcosa con cui devi giocare e vedere cosa funziona. È meglio impostare il tuo ambiente in modo da poter semplicemente modificare alcuni valori e scambiare a caldo il terreno senza dover ricaricare il gioco. Buona sperimentazione.


2
Grazie per la risposta. Tuttavia, non so come utilizzare Perlin "normale" o Simplex Noise per creare le caverne a forma di verme. Sono sferici, scalati in una direzione o non molto lunghi. E per l'algoritmo Perlin Worms, non so come determinare se la posizione corrente è all'interno di un worm, senza conoscere la posizione della testa.
user000user

1
L'algoritmo worm non si basa sulla conoscenza della "posizione della testa". Da quello che stai dicendo, sembra che il tuo problema non sia quello di generare rumore su un pezzo per pezzo. Esistono tutorial sulla domanda che hai collegato per l'implementazione di worm Perlin. Come generare un terreno "normale" può essere trovato qui .
MichaelHouse

La generazione di base del terreno con 3D Simplex Noise funziona bene, ma non so come determinare la posizione / segmento dei vermi all'interno di un blocco. Da quello che ho capito, dai al worm una posizione della testa e n segmenti e calcola l'angolo tra i segmenti con la funzione noise. Ecco un'immagine che potrebbe spiegare meglio, qual è il mio problema: link .
user000user

2
Esistono diversi tipi di rumore. Usare una posizione della testa e seguire da lì c'è un metodo. Se guardi nella parte inferiore di questa pagina , troverai del rumore che crea il tipo di rumore che desideri senza prima aver bisogno di una posizione della testa.
MichaelHouse

Grazie per il suggerimento. Ho implementato il rumore 3D multifrattale ridotto, tuttavia, il risultato è stato piuttosto insoddisfacente. Proverò a combinarlo in 2D con una 2D Heightmap e quindi riporterò di nuovo. Questo potrebbe creare più grotte simili a vermi.
user000user

3

Penso che sia così che funziona in Minecraft. Ogni worm ha una lunghezza massima (chiamiamolo M). Le teste di ciascun worm sono calcolate in base alla posizione del blocco. Quando si esegue il rendering di ogni blocco, è necessario controllare tutti i blocchi in un Mraggio e seguire tutti i loro worm. Non è l'ideale in termini di prestazioni, ma funziona.

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.