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:
fuente
Respuestas:
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".
Estos son los "gusanos Perlin" de libnoise del tutorial de libnoise. La técnica reproduce de cerca las cuevas generadas en Minecraft.
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.
fuente
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).
fuente
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.
fuente
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.
fuente
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.
fuente