A maioria dos algoritmos de ruído perlin permitirá recuperar o valor do ruído em qualquer local, com algo parecido noise(x,y,z)
. Isso faz com que seja bastante trivial gerar ruído em partes por partes. Tudo que você precisa fazer é passar a posição global, em vez da posição do bloco.
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);
Como você pode ver, estamos gerando terreno para o bloco, iterando sobre os limites do bloco e verificando se essa posição global é sólida ou não. Essa é provavelmente a mesma metodologia usada para gerar o terreno em geral.
perlinNoise.get
assume uma posição global e retorna sua densidade. Onde isSolid
seria apenas um teste simples para ver se o voxel é "denso o suficiente" para se qualificar para sólido.
perlinNoise.get
pode ser mais complexo do que apenas um simples algoritmo de ruído. Você pode ter verificações com base na profundidade do voxel em seu mundo. Por exemplo, se o voxel estiver abaixo do que você decidiu como "nível absoluto da base", ele poderá usar o algoritmo perlin worms para retornar uma densidade; se estiver acima da base absoluta, poderá usar uma função de densidade normal para fornecer terreno mais variado. Eu recomendaria algumas misturas entre os dois.
Combinar diferentes funções de ruído Perlin é apenas algo com o qual você precisa brincar e ver o que funciona. É melhor configurar seu ambiente para que você possa alterar alguns valores e trocar de terreno a quente sem precisar recarregar o jogo. Feliz experimentando.