¿Cómo se utiliza una función de ruido 3d perlin para generar terreno?

20

Puedo entenderlo usando una función de ruido perlin 2D para generar el valor de altura, pero no entiendo por qué se usaría una función de ruido perlin 3d. En el blog de Notch, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , mencionó el uso de una función de ruido 3d perlin para la generación del terreno en Minecraft. ¿Alguien sabe cómo se haría eso y por qué sería útil? Si está pasando valores x, y y z, ¿eso no implica que ya tiene la altura?

Javier
fuente

Respuestas:

19

El ruido 2D Perlin es bueno para mapas de altura, pero en este caso parece que no está usando un mapa de altura. En cambio, tiene una cuadrícula 3D, donde cualquier celda puede estar vacía. Esto permite cuevas y tales formaciones, donde la altura del suelo no es un valor único para una ubicación 2D dada.

msell
fuente
14

En lugar de muestrear la "altura del suelo", traté el valor del ruido como la "densidad", donde cualquier cosa menor que 0 sería aire, y cualquier cosa mayor o igual a 0 sería tierra.

En pocas palabras, para cada lugar donde puede estar un bloque, se evalúa una función de ruido, y si es> 0, se coloca un bloque. La función de ruido de Notch se sesga al agregar la altura desde el nivel del agua a su valor, es por eso que las áreas más bajas son en su mayoría sólidas (la altura es muy negativa, por lo que la altura + el ruido también es negativo) y las áreas más altas están en su mayoría vacías (la altura es muy positiva, así que la altura + el ruido también es positivo).

Probablemente haya alguna alquimia adicional para decidir qué tipo de bloque se genera y para tallar cuevas. Pero supongo que no está directamente relacionado con esta función de ruido.

También tenga en cuenta que este método funciona para Notch porque Minecraft tiene un terreno basado en voxel. Si trataste de lograrlo en un mundo basado en polígonos, simplemente la función de ruido de muestreo no sería suficiente. Debe usar algún algoritmo para convertir las muestras en una superficie y crear polígonos que se aproximen a esta superficie. Uno de estos algoritmos es marchar cubos .

No importa
fuente
8

El ruido 3D se vuelve obligatorio si el terreno necesita redes de cuevas y voladizos.

Para extraer una isosuperficie de la información de densidad, las 2 técnicas más populares son Marching Cubes (MC) y el nuevo Dual Contouring (DC). La estructura de datos necesaria es bastante diferente según el método elegido.

Como se mencionó anteriormente, el artículo Geiss 3 de GPU de Geiss es un punto de partida muy instructivo para comprender e implementar terrenos MC en la GPU (tenga en cuenta que su enfoque MC se ejecuta completamente en la GPU y requiere al menos SM4 - GS-compatible).

Debido a que los datos de densidad en voxels MC solo pueden permanecer en los bordes de voxel, el MC clásico puede contornear el volumen sin preservar las características de bordes afilados. DC no sufre este inconveniente ya que la información de densidad se expresa como un punto 3D (minimizador QEF) en cualquier lugar dentro del vóxel más el signo en cada esquina.

Por otro lado, MC no sufre de caras de auto-intersección porque todos los triángulos generados están encerrados en sus correspondientes vóxeles, mientras que DC necesita cálculos adicionales para evitar las intersecciones entre las caras generadas. Los autores de DC abordaron este problema en una versión mejorada de su algoritmo.

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Este compañero también propone un enfoque probablemente más limpio basado en análisis convexo / cóncavo para evitar las auto intersecciones. Utiliza también mejores reglas de división cuádruple para ayudar a preservar la orientación del borde:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Classic MC tampoco está listo para usar "sin grietas" y puede requerir parches de grietas si se ejecuta en octrees sin restricciones. DC no sufre de este último problema.

Aquí hay una encuesta bastante agradable y completa de la mayoría de las técnicas de extracción de malla: http://www.cs.berkeley.edu/~jrs/mesh/

Un enfoque octree / voxel es intrínsecamente "CSG-friendly", lo que hace que sea más fácil planificar una estrategia de nivel de juego completamente "destructible", pero si uno necesita implementar todo esto en un juego, la profundidad del octree también tendrá que ser frustum -dependiente.

Si todo el contenido cabe en la memoria o se transmite correctamente, los datos también se pueden usar para representar AO y calcular la física / colisiones.

Okr
fuente
"El ruido 3D se vuelve obligatorio si el terreno necesita redes de cuevas y voladizos". ¿Obligatorio? Como en, esta es la única forma de generar cuevas y voladizos? No Estoy generando un mapa de altura a partir del ruido perlin 2D y luego tallando cuevas y voladizos en él como un paso separado, para una apariencia más natural. Es engañoso para los jóvenes desarrolladores de juegos decir que esta es la ÚNICA forma de generar cuevas y voladizos en un mundo generado por procedimientos.
Domarius
5

Supongo que, en ese ejemplo en particular, es que usó el valor z para determinar qué tipo de material: roca madre, piedra, tierra o aire.

Tétrada
fuente
-3

Minecraft utiliza el algoritmo de cubos de marcha para generar terreno en 3D. No tengo una referencia para esto, lo siento. No estoy seguro exactamente de qué estaba hablando Notch cuando mencionó la función de ruido Perlin, tal vez una semilla para el algoritmo de cubos de marcha. Más información aquí:

Y un excelente artículo de GPU Gems si está interesado en marchar cubos:

Aaron Snoswell
fuente
2
Marching cubes es un algoritmo para generar una malla desde un campo escalar. Eso significa que primero necesita tener datos, luego genera una malla para ajustarse a los datos. No es para generar datos o terreno.
MichaelHouse
-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 
Maxim DC
fuente
2
-1; Incluso con la aclaración que ha agregado, esta es una respuesta bastante mala, no explica claramente el propósito del fragmento de código ni su impacto semántico en los datos resultantes, y no aborda la mayoría de las preguntas que el usuario realmente tenía.
He editado el código, ¿qué tal ahora?
Maxim DC
Explica cómo se usa el ruido 3D para crear terreno, esto es correcto en mi opinión
Maxim DC
Luego explique esto en su respuesta y responda las preguntas que el usuario tenía. De lo contrario, es una respuesta de código muerto.
Tom 'Blue' Piddock