La mayoría de los algoritmos de ruido perlin le permitirán recuperar el valor de ruido en cualquier ubicación dada, con algo así noise(x,y,z)
. Esto hace que sea bastante trivial generar ruido parte por parte. Todo lo que necesita hacer es pasar la posición global, en lugar de la posición fragmentaria.
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 puede ver, estamos generando terreno para el fragmento, iterando sobre los límites del fragmento y verificando si esa posición global es sólida o no. Esta es probablemente la misma metodología que está utilizando para generar el terreno en general.
perlinNoise.get
toma una posición global y devuelve su densidad. ¿Dónde isSolid
sería una simple prueba para ver si el vóxel es "lo suficientemente denso" para calificar para sólido?
perlinNoise.get
puede ser más complejo que un simple algoritmo de ruido. Puede tener controles basados en la profundidad del vóxel en su mundo. Por ejemplo, si el vóxel está por debajo de lo que ha decidido que es "nivel de suelo base absoluto", entonces puede usar el algoritmo de gusanos perlin para devolver una densidad, si está por encima de la base absoluta, puede usar una función de densidad normal para proporcionarle Terreno más variado. Sin embargo, recomendaría algunas mezclas entre los dos.
Combinar diferentes funciones de ruido Perlin es algo con lo que tienes que jugar y ver qué funciona. Es mejor configurar su entorno para que pueda cambiar algunos valores e intercambiar en caliente el terreno sin necesidad de volver a cargar su juego. Feliz experimentando.