¿Cómo eliminar el terreno flotante cuando se genera con 3D Perlin Noise?

10

Actualmente estoy usando 3D Perlin Noise para generar un terreno aleatorio en combinación con Marching Cubes.

Mi problema parece estar en escalar la función de ruido para obtener alturas razonables en mi terreno. Si solo se usa una octava, todos los puntos en relación con el ruido obviamente se interpolan, lo que da como resultado datos bastante uniformes. Sin embargo, para obtener voladizos / cuevas / terreno irregular, tengo que usar varias octavas con amplitudes variables y / o escalar los valores resultantes a la altura 'máxima' que quiero del mapa.

Puede que me falte algo, pero al usar cubos de marcha con ruido de perlin 3D, regularmente obtengo trozos de terreno flotantes.

¿Alguna idea sobre cómo podría corregir esto o si hay otras funciones de ruido que podría usar para obtener resultados como los que estoy describiendo? Estoy deseando colinas / valles / montañas / lagos / etc. No hay necesidad de bits flotantes segregados del resto del mapa. Creo que este es un problema similar al que tiene Minecraft cuando tiene un terreno que flota de vez en cuando en el cielo de vez en cuando.

Gracias por cualquier ayuda, Mythics

Mitos
fuente

Respuestas:

9

Probablemente, la única forma de deshacerse por completo del terreno flotante es probar la conectividad. Dependiendo del tamaño de su mapa, esa podría ser una opción. Puedes hacerlo eligiendo el punto base, como el fondo de tu mundo. Luego asegúrese de que todos sus vóxeles sean:

  1. Conectado a la base.
  2. Conectado a un vóxel que está conectado a la base.

Probablemente comience en un punto conectado conocido (como el fondo de su mundo) y luego hacer un recorrido transversal amplio de vóxeles conectados funcionaría bastante bien. Asegúrese de marcar los vóxeles como conectados mientras viaja. Puedes hacer esto por trozo.

Además, hay formas menos costosas de minimizar, pero no eliminar completamente el terreno flotante.

  • Sesgo de degradado: puede sesgar la colocación de vóxeles sólidos con un degradado. La función de gradiente se caería bruscamente después de que esté por encima del "nivel del suelo". Este artículo habla sobre el uso de un gradiente y tiene algunos otros consejos interesantes.

  • Ruido del mapa de altura : en su lugar, puede generar ruido como un mapa de altura. Esto eliminaría los voladizos y las cuevas, pero puede simularlos con una capa de ruido sustractivo adicional.

  • Menos ruido ruidoso : use menos octavas en el ruido del terreno y genere ruido sustractivo para obtener salientes y cuevas.

MichaelHouse
fuente
El terreno solo puede conectarse a través del fragmento adyacente si se trata de un saliente desde allí.
Loren Pechtel
@Loren: Sin embargo, eso está perfectamente bien. Siempre que el motor le permita abordar fragmentos por índice completo, funcionaría sin problemas.
Phil
@LorenPechtel Yo digo que puedes hacerlo por trozo, pero necesitarías verificar trozos adyacentes cuando estás al borde de un trozo. Esto puede convertirse en un problema al generar un nuevo terreno y no ha generado el fragmento adyacente. Cuando llegue a esta situación en la que tiene un terreno flotante potencial, puede generar el fragmento adyacente o utilizar el algoritmo de ruido para analizar los vóxeles hasta que encuentre "roca madre" o una conexión conocida con el fragmento actual.
MichaelHouse
0

Puede que sea demasiado tarde para responder, pero estaba empezando ahora con esta generación de terreno vóxel, con Perlin Noise y encontré una manera de crear el terreno sin esas piezas flotantes. Creo que esto puede ayudarte. Entonces, para crear el terreno, primero genero un mapa de altura que leo los píxeles de ese mapa de altura. Ahora viene la parte interesante, leí el valor de "brillo" (en realidad es la escala de grises) de cada píxel en ese mapa de altura y eso me da la altura para esa parte particular del mapa, luego para crear el terreno, supongo que este mapa de altura es mi terreno se ve desde arriba, por lo que si el valor de escala de grises de un píxel (después de emparejarse con mi terreno "maxHeight") en ese mapa de altura es, digamos 30, eso significa que en ese punto específico de mi terreno solo generaré 30 vóxeles en el eje y y esto me da un terreno sin partes flotantes. Si desea cuevas, etc., puede aplicar otro ruido en el original (debajo de la superficie) para crear esas cuevas. Espero que esto funcione para usted.

Sammael
fuente
1
¿Creo que esto es similar al segundo punto en mi respuesta anterior?
MichaelHouse