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.get
prende una posizione globale e restituisce la sua densità. Dove isSolid
sarebbe solo un semplice test per vedere se il voxel è "abbastanza denso" per qualificarsi per solido.
perlinNoise.get
può 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.