¿Cómo generar cuevas que se parecen a las de Minecraft?

34

Llevo un tiempo trabajando en un mundo de procedimientos 3D y quiero comenzar a agregar sistemas de cuevas. Actualmente estoy usando 2D / 3D Perlin Noise para la generación del terreno en combinación con Marching Cubes para un terreno más liso. Me estoy quedando perplejo cuando se trata de largas cuevas interconectadas.

Espero obtener algo más como los sistemas de cuevas de Minecraft. Parecen estar muy conectados, ramificarse aleatoriamente en casi cualquier dirección, y casi cualquier punto de la cueva tendría un aspecto bastante circular con un radio bastante igual en todas partes (no es la mejor redacción, pero no está muy seguro de cómo decirlo) .

El mayor desafío para generar cuevas como quiero es que quiero generar el mundo sobre la marcha. El mundo se genera trozo a trozo actualmente, comenzando donde está el jugador y se genera hacia afuera desde allí. NO quisiera generar nada del mundo y luego excavar las cuevas usando un patrón errante, autómatas celulares, etc.

¿Hay algún algoritmo bien conocido que pueda usarse para esto? Si es así, ¿alguien quiere compartir cómo hacen algo similar? Agradecería mucho cualquier ayuda.

Un buen ejemplo: ingrese la descripción de la imagen aquí

Mitos
fuente
55
Echa un vistazo aquí y desplázate hacia abajo.
William Mariager
En los últimos 24 meses, hay un tema de la revista para desarrolladores de juegos que tiene una discusión en profundidad sobre cómo hacer lo que estás tratando de hacer. Me gustaría llegar a su sitio.
Joey Green
@JoeyGreen ¿Cómo se llama la revista? ¿O tienes un enlace a su sitio?
jumpnett
1
Se llama revista para desarrolladores de juegos. gdmag.com . Puede obtener una suscripción y obtener versiones en pdf de la revista durante los últimos 10 años. Si se registra, hay una manera de buscar entre los problemas anteriores y encontrar el problema que desea.
Joey Green

Respuestas:

30

Las cuevas de Minecraft son generadas por el método de "gusanos perlin". El generador serpentea por el terreno y excava un túnel. Minecraft no utiliza el ruido 3d perlin para la generación de cuevas, ya que tiende a dejar bolsas no conectadas en el terreno. Las cuevas de Minecraft no se han generado a través del ruido 3d Perlin desde las primeras versiones de Alpha.

Aquí hay cuevas en Gnomescroll generadas por el método "gusano perlin".

Sistema de cuevas Gnomescroll Vista en primera persona 1

Sistema de cuevas Gnomescroll en primera persona Vista 2

Sistema de cuevas Gnomescroll en tercera persona Vista 2

Estos son los "gusanos Perlin" de libnoise del tutorial de libnoise. La técnica reproduce de cerca las cuevas generadas en Minecraft.

Tutorial de Linoise Perlin Worms

Los parámetros serpenteantes afectan la calidad del sistema de cuevas y determinan qué tan verticales son las cuevas y qué tan rápido cambian de dirección. Las cuevas en Minecraft se ramifican y el radio del túnel de la cueva varía a lo largo de las cuevas.

Minecraft genera las cuevas trozo a trozo. El enfoque requerido es complicado y todavía nadie ha realizado ingeniería inversa del generador de cuevas de Minecraft, a pesar del interés de los modders del servidor.

El enfoque más probable genera las cuevas serpenteantes trozo a trozo a medida que se genera el mapa infinito y se expande hacia afuera. Las cuevas en el trozo actual son funciones de las semillas de la cueva en los trozos de N más cercanos para algunos N. Usando un generador de números aleatorios que es una función de las coordenadas del trozo para sembrar las cuevas, es posible calcular las cuevas en el trozo actual para un mapa infinito mientras solo se evalúan los fragmentos dentro de un radio de fragmentos finito.

Estado de detención
fuente
3
¿Puedes agregar alguna información o recursos para aprender sobre esta cosa de "gusanos perlin"?
David Gouveia
1
Este es un tutorial sobre "gusanos perlin
HaltingState
No es necesario, pero si pudiera dar más detalles sobre ese último párrafo, lo agradecería mucho. Para generar un gusano, supongo que necesitarías un punto de partida por gusano, que debería estar dentro de N trozos de cualquier jugador donde N es la longitud máxima de un gusano.
Míticos
3
Exactamente. Cada gusano tiene un punto de partida y se termina si vaga fuera de cierto radio de trozos. Hay un generador de números aleatorios que genera determinísticamente una secuencia de números pseudoaleatorios que es una función de las coordenadas del fragmento. Estos números aleatorios determinan dónde y cuántos gusanos se originan en ese nodo. Los gusanos también pueden ramificarse. La carga computacional disminuye si los gusanos son más "locales" y no pueden aventurarse más allá de un pequeño radio.
HaltingState
Tal vez no exactamente lo que quería escuchar, sino lo que esperaba. Gracias de nuevo HaltingState. :)
Mythics
7

Generaría una nube de puntos dentro de las áreas donde el terreno es sólido; puede experimentar con diferentes densidades. Luego usaría un algoritmo como un árbol de expansión mínimo para conectar todos los puntos, esto asegurará que cada área sea accesible. Luego, simplemente dibuje grandes áreas huecas (compuestas de aire) de nodo a nodo (es decir, una línea gruesa de vóxeles).

Gavan Woolery
fuente
Puede que no entienda exactamente lo que quieres decir con esto, pero ¿cómo haría esto sobre la marcha trozo a trozo a medida que el mundo se genera?
Míticos
Una forma posible es generar el árbol de expansión mínimo dentro de cada fragmento por separado, luego conectar cada fragmento encontrando los dos nodos más cercanos entre los dos fragmentos. Después de completar un fragmento con su algoritmo de terreno predeterminado, puede vaciarlo alrededor del árbol de expansión mínima.
Gavan Woolery
1
Otra solución (más fácil), aunque menos eficiente y probablemente "más ruidosa", es usar el movimiento browniano para forjar un camino (algo así como una hormiga cavando al azar).
Gavan Woolery
2

El número de abril de 2011 de Game Developer Magazine entra en detalles sobre esto con las funciones iterativas de ruido de Perlin; consulte el artículo del Creador de mundos que comienza en la página 21.

cuantumpotato
fuente
Muestran capturas de pantalla para cada paso (función) y muestran variaciones
quantumpotato
1

Use una función de ruido para asignar valores para cada fragmento para determinar si tiene túneles o no y luego úselos para decidir dónde colocar cuevas. Si desea túneles, simplemente use más funciones de ruido (con diferentes semillas) y use sus valores para determinar si hay túneles. Después de eso, use funciones de "dibujo" ordinarias para crear los túneles. Para hacer todo más realista, use más ruido para hacer un desplazamiento aleatorio para los puntos de origen de dichas cuevas / túneles.

Si no desea utilizar múltiples funciones de ruido, puede sondear a distancias más grandes, por ejemplo, en lugar de hacer noise3d (2,2,2) para trozos en (2,2,2) do noise3d (2,2, 16) y use (2,2,16) para un valor, (2,2,17) para el segundo valor, etc. luego simplemente ajuste su frecuencia en consecuencia para hacer que todos los valores sean independientes o correlacionados en escalas cortas.

Para variar la densidad de la cueva en todo el mundo, use otra función de frecuencia más baja que influirá en dichos valores.

En caso de que esto resulte en cuevas desordenadas, simplemente aumente la distancia de dichos puntos interconectados o ajuste el algoritmo.

No estoy seguro de si Minecraft hace cuevas como esta (aunque creo que sí), pero esta solución debería arrojar resultados satisfactorios.

Llamageddon
fuente
-5

aquí está

Aunque la mayoría de las cuevas como las anteriores usan el gusano Perlin , algunas personas prefieren hacerlo manualmente. De esta manera, pueden hacerlo de la manera que quieran exactamente bloque por bloque. Una cueva hecha con el uso del gusano Perlin puede ser inexacta y solo puede hacer que la cueva mida 5 pies de alto y 6 pies de ancho, esto puede ser inexacto ya que es posible que desee 10 pies de alto y 15 pies de ancho.

Locklan Smith
fuente