Generación de cuevas con gusanos Perlin

12

Actualmente estoy tratando de generar un Minecraft como el terreno voxel con 3D Simplex Noise y también quiero implementar cuevas.

Encontré el método de Perlin Worms en este hilo, que genera resultados realmente agradables. Sin embargo, no tengo idea de cómo generarlo por partes. ¿Es esto posible o hay alguna alternativa que produzca un gusano similar como la cueva trozo a trozo?

Editar: Este es el problema que no sé cómo resolver.

Edit2: este es el resultado de combinar el ruido multidractal ondulado 2D con un mapa de altura de ruido simplex. Todavía necesita algunos ajustes, pero este es más o menos el resultado que quería. Gracias a Byte56.

user000user
fuente
Debe usar fórmulas directas para la generación de terreno si es posible. Si puede calcular un vóxel solo en función de sus coordenadas y sin información sobre las adyacentes, los fragmentos ya no son un problema. Si desea utilizar gusanos perlin, que supongo que no se pueden calcular para cada vóxel individualmente, eche un vistazo al último párrafo en la respuesta aceptada de la pregunta que ha vinculado.
danijar
1
Básicamente, esa es mi pregunta. El terreno básico es fácil de calcular con solo las coordenadas dadas, pero no sé cómo calcular si hay una cueva o no.
user000user

Respuestas:

5

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.gettoma una posición global y devuelve su densidad. ¿Dónde isSolidsería una simple prueba para ver si el vóxel es "lo suficientemente denso" para calificar para sólido?

perlinNoise.getpuede 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.

MichaelHouse
fuente
2
Gracias por la respuesta. Sin embargo, no sé cómo usar el ruido "regular" Perlin o Simplex para crear cuevas parecidas a gusanos. Son esféricos, escalados en una dirección o no muy largos. Y para el algoritmo Perlin Worms, no sé cómo determinar si la posición actual está dentro de un gusano, sin conocer la posición de la cabeza.
user000user
1
El algoritmo de gusanos no se basa en conocer la "posición de la cabeza". Por lo que dices, parece que tu problema no es generar ruido por partes. Hay tutoriales sobre la pregunta que vinculó para implementar gusanos perlin. Cómo generar un terreno "regular" se puede encontrar aquí .
MichaelHouse
La generación básica del terreno con 3D Simplex Noise funciona bien, pero no sé cómo determinar la posición / segmento de un gusano dentro de un trozo. Por lo que entendí, le das al gusano una posición de cabeza yn segmentos y calculas el ángulo entre los segmentos con la función de ruido. Aquí hay una imagen que puede explicar mejor cuál es mi problema: enlace .
user000user
2
Hay diferentes tipos de ruido. Usar una posición de la cabeza y seguir desde allí es un método. Si miras cerca de la parte inferior de esta página , encontrarás algo de ruido que crea el tipo de ruido que deseas sin necesidad de una posición de cabeza primero.
MichaelHouse
Gracias por la pista sobre eso. Sin embargo, implementé el Ruido Multifractal Ridged 3D, el resultado fue bastante insatisfactorio. Intentaré combinarlo en 2D con un mapa de altura 2D y luego volver a informar. Esto puede crear más cuevas parecidas a gusanos.
user000user
3

Creo que así es como funciona en Minecraft. Cada gusano tiene una longitud máxima (llamémoslo M). Las cabezas de cada gusano se calculan en función de la posición del fragmento. Cuando renderiza cada fragmento, debe verificar todos los fragmentos dentro de un Mradio y seguir a todos sus gusanos. No es ideal en términos de rendimiento, pero funciona.

Tom Dalling
fuente