¿Cómo se hacen los motores de terreno voxel?

53

Hace unos días encontré algo llamado voxel terrains y creo que son bastante geniales. Pero no sé nada que los genere. ¿Lo modelas en tu software de modelado o usas algo como un mapa de altura? Leí en Wikipedia que los vóxeles son como píxeles 3d o píxeles volumétricos.

Después de hacer el terreno vóxel, ¿cómo puedo tomar estos vóxeles y hacerlos destruibles / excavables ?


Elegiré la mejor respuesta basada en:

  1. código y algoritmos. preferiblemente basado en C #
  2. explicaciones Soy un principiante con algoritmos pero estoy muy familiarizado con la programación orientada a objetos.
  3. demostraciones paso a paso. No solo concepto sino dirección.
  4. diagramas / ilustraciones. No, no capturas de pantalla de otros motores.


Sé que este es un tema complicado. Pero, gracias por cualquier ayuda!

No, no estoy tratando de hacer un clon de Minecraft.


Editar

¡Gracias a todos por su gran ayuda (especialmente Nick Wiggill)! Esto es lo que logré hacer (Trabajo en progreso).

Daniel Pendergast
fuente
[unidad] y C ? Eso ... tiene poco sentido.
Martin Sojka
Entiendo C.
Daniel Pendergast
8
Tienes mucha fe en la comunidad con una solicitud tan audaz. Quiero decir, un documento completo sobre un terreno de vóxel totalmente dinámico para el hardware de hoy con un buen FPS, debería ser fácil, ¿verdad? Bueno, el tema es tan amplio y difícil, dudo que vea una solución genérica e incluso entonces, puede ser completamente inútil para su caso. Pero quién sabe, puede ser factible dependiendo de su modelo a seguir. ¿Quieres un terreno voxel Crysis 2 o uno Delta Force ? ¿Tal vez estás haciendo un clon de Minecraft o solo necesitas una simulación de arena para un juego de excavación? Defina un alcance, por favor.
EnoughTea
2
Echa un vistazo a este middleware: forum.unity3d.com/threads/… . Particularmente la demostración
Tetrad
1
GPU Gems 3 tiene un capítulo sobre el terreno de vóxel: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Respuestas:

58

Para generar un terreno voxel

(a) Un método común es generar un mapa de altura utilizando el ruido Perlin. Un mapa de altura es básicamente una imagen monocroma que representa diferentes alturas por la oscuridad o la claridad de sus píxeles.

ingrese la descripción de la imagen aquí

Observará píxeles individuales en este mapa de altura para crear "pilas" de vóxeles hasta diferentes alturas (eje z) en diferentes ubicaciones (x, y), de acuerdo con el brillo de ese píxel en la imagen del mapa de altura. Debido a que una imagen de ruido Perlin es suave (sin bordes afilados de luz contra oscuridad), como resultado tendrá un terreno suavemente ondulado.

(b) Puede construirlo de forma incremental creando el paisaje a partir de diferentes poliedros. Cree una forma vectorial poliédrica que se aproxime a la forma de vóxel que desee. Usando cualquier método 3D de punto en poliedro (con mayor frecuencia, punto en casco convexo), verifique qué puntos de su cuadrícula mundial caen dentro de ese volumen poliédrico. Por ejemplo, defina una pirámide en el espacio. Después de verificar cada punto en la región local de su espacio mundial contra ese volumen piramidal, sabrá qué puntos se encuentran dentro de él, y puede establecer esas celdas como "presentes", lo que significa que se convierten en vóxeles en lugar de espacio vacío. Ahora tienes una pirámide de vóxel en tu espacio. Puede continuar agregando formas de cualquier tipo, de esta manera, hasta que haya formado un terreno.

(c) (Realmente lo mismo que b ) Escribe una herramienta de modelado. Voxatron muestra cómo se vería esto. Esto es solo crear los formularios de vóxel en un mundo sustituto (el editor) y luego importarlos a su mundo de juegos en tiempo real. Creo que Voxlap tuvo el primer editor de código abierto para voxels. Puede colocar vóxeles individuales, o puede usar un "pincel" de vóxeles con diferentes formas / volúmenes para dibujar vóxeles en su mundo.


Lo que necesitarás para construir tu propio juego basado en voxel

Incluyo esta sección porque el camino de vóxel no es fácil, al menos no en la actualidad. Últimamente, los grandes jugadores vuelven a poner mucha investigación en motores de vóxel, para aplicaciones de renderización y física.

La simplicidad puede ser un problema, porque construir dinámicamente un mundo a partir de vóxeles sin procesar es un enfoque de procedimiento para la construcción del mundo y esto no es inherentemente simple . Lo siento, habrá algunos términos técnicos aquí. Escribir un motor de vóxel es una tarea bastante seria y requiere conocimiento en múltiples áreas del desarrollo del motor de juego, particularmente en términos de conceptos espaciales, y esto significa comprender las matemáticas de vectores 3D, las matrices y el cálculo básico a un nivel razonable.

Dicho esto, su "generación de un terreno de vóxel" requiere un contexto en el cual trabajar, ya que los motores de vóxel no están exactamente extendidos. Pasemos a una descripción básica de cómo funciona un motor voxel.

Voxels son los bloques de construcción básicos de su mundo. Sus posiciones se definen mediante una cuadrícula (matriz) 3D indexada con enteros en lugar de un espacio continuo de coma flotante (como se usa en los juegos 3D basados ​​en vectores). Estos serán los "átomos" de su mundo. Podrían tener 3 pies de altura como en juegos como Minecraft, o podrían ser más pequeños de lo que realmente podría ver el ojo de tu personaje virtual, a menos que estén agrupados en grandes cantidades, un poco más como moléculas. Hay dos tipos:

  • Voxels basados ​​en malla cúbica ( ejemplo ): estos son un tipo más nuevo, utilizados por simplicidad y fáciles de usar junto con la tecnología gráfica moderna. Utilizado en juegos como MineCrat y Dungeon Keeper.
  • Voxels de punto ( ejemplo , ejemplo ): el vóxel original. Cada uno es un punto individual en el espacio que puede colisionarse, aunque puede estar rodeado por un volumen esférico delimitador. Son más simples, por lo que puede tener muchos más en su mundo y, por lo tanto, puede hacerlos más pequeños, lo que generalmente es favorable. Dos juegos que los usaron fueron Comanche y el remake de Lords of Midnight en la década de 1990.

De cualquier manera, su enfoque para manipular vóxeles en su mundo es muy similar, de la siguiente manera.

Para construir y mover objetos en su mundo, necesitará las herramientas matemáticas mencionadas anteriormente. Por ejemplo, para crear un muro: construya un cuadro de las dimensiones apropiadas en el espacio 3D, usando vectores. Utilice las matemáticas de matriz para transformar su caja en la rotación y posición que desee en su mundo 3D (en espacio vectorial continuo). Para un motor de vóxel, el paso adicional es ahora utilizar un algoritmo 3D de punto en poliedro para determinar cuáles de sus vóxeles caen dentro de ese espacio girado.

Esencialmente, esta es la forma en que construirías la mayoría de los objetos en tu mundo. Más allá de eso, podría escribir sus propias herramientas para "modelar" un personaje de la manera que podría decir, Maya o 3DS Max. Pero como está modelando su personaje con vóxeles en lugar de puntos, aristas y caras, sus métodos serán sustancialmente diferentes. Si luego decidió rotar estos objetos en su mundo, necesitaría usar transformaciones matriciales de manera similar para hacerlo.

El terreno destructible es tan simple como eliminar un vóxel a la vez de acuerdo con algún método de su elección, o usar operaciones CSG (Geometría sólida constructiva) en grandes volúmenes de vóxeles para eliminarlos de acuerdo con un volumen predefinido; por ejemplo, si dispara un rayo láser a través de una roca, puede usar un volumen cilíndrico para restar los vóxeles aquí, el rayo dispara a través de la roca. CSG es un proceso relativamente simple que utiliza las cuadrículas espaciales en 3D que forman su mundo de vóxeles y verifica cada celda en una sección de una cuadrícula base (en este caso, la roca) contra otra cuadrícula (en este caso, el rayo láser)

Para tener "flujos" de material (como lo insinuó Vigil en su comentario sobre la arena), deberá analizar la dinámica de fluidos y los autómatas celulares. Estos fueron utilizados por el autor de Dwarf Fortress, Tarn Adams, en lo que esencialmente es también un mundo vóxel (aunque los vóxeles son mucho más grandes en este caso, comparables con Dungeon Keeper, el principio sigue siendo el mismo). Estos son temas de vanguardia y no son una necesidad para los motores de voxel como se define, por lo que lo dejaré como un "trozo" para su propia investigación.

CSG y la dinámica de fluidos me llevan, por último, a la optimización. Los motores Voxel actualmente en desarrollo hacen uso casi exclusivamente de octrees voxel dispersos (SVO), que es un método para subdividir el espacio voxel a diferentes resoluciones, como se evidencia en este video que muestra el próximo motor Atomontage. El uso de octrees / SVOs es más una necesidad que una opción de optimización, debido a los gastos generales de procesamiento involucrados en el procesamiento de una cuadrícula masiva y uniforme. Un octree es esencialmente un árbol (gráfico acíclico dirigido) donde cada nodo tiene 8 o cero nodos secundarios, dependiendo de si el espacio que representa contiene algún volumen físico. Los diagramas que muestran cómo los octreos subdividen el espacio para formar vóxeles están aquí .

La mejor implementación de voxel de código abierto que conozco es el Voxlap Engine de Ken Silverman , que se utilizó para Voxelstein3D. Está escrito en C ++ e implementa operaciones CSG para la deformación del terreno.

Ingeniero
fuente
El cambio de wiki de la comunidad es permanente, no hay forma de revertirlo. Debería eliminar y volver a crear su respuesta (por supuesto, sacrificando sus votos existentes)
Jesse Dorsey
meta.stackexchange.com/questions/2974/… los moderadores de reclamos pueden eliminarlo. Sin embargo, no sé si las cosas han cambiado. Gracias por investigarlo de cualquier manera.
Ingeniero
1
Vaya, tenga cuidado la próxima vez.
Jesse Dorsey
2
El primero es un espacio discretizado donde las entidades solo pueden estar directamente en una celda. Al igual que las piezas perfectamente colocadas en un tablero de ajedrez, no pueden estar "entre" celdas o superpuestas en los bordes. Mientras que un espacio continuo es el que se encuentra en la mayoría de los motores de física, es decir, se basa en números de coma flotante y, por lo tanto, es continuo en lugar de cuantizado. Su entidad puede sentarse en cualquier posición arbitraria en el espacio que elija, al igual que en la vida real.
Ingeniero
1
La textura es implícita. Voxels reales, ya sean de malla o no, cada uno tiene un color puro. Los enfoques antes mencionados solo crean detalles más realistas y permiten un enfoque de malla combinada (google Unity VoxelForm). Cuanto más finos sean sus vóxeles, más finos serán los detalles de textura resultantes. Ejemplo: modelar un lecho de río como roca (gris). Convierta cada píxel dentro de la distancia x de la superficie, en arena, configurando estos vóxeles para que tengan material = "arena"; luego se pueden representar como de color arena. Además, esto también puede afectar su interactividad física, por lo que el agua puede mover la arena o extraerla.
Ingeniero
33

La mejor manera de generar un terreno voxel interesante es con un mapa de densidad de ruido Perlin. En lugar de usar un mapa de ruido Perlin 2D que defina la altura de un mundo 3D, use un mapa de ruido Perlin 3D. Pondere el mapa para que los valores más cercanos a la parte inferior sean más sólidos, y los valores más cercanos a la parte superior definitivamente serán aéreos. Esto le da altura a su mundo, pero también permite voladizos y cuevas, similares al terreno de Minecraft , como muestra esta vista lateral de una porción de terreno:

Mundo con voladizos

Desde aquí puede probar islas flotantes o agregar sistemas de cuevas con ruido fractal:

Mundo con sistema de cuevas

Las imágenes de arriba y las ideas del sistema de cuevas son de esta excelente publicación de blog . Puede aprender todo sobre el ruido de Perlin aquí , y hay algunos códigos de muestra para comenzar aquí .

dlras2
fuente
4

Las otras respuestas aquí son excelentes, pero tomé un enfoque ligeramente diferente.

Genero un entorno en una herramienta de modelado (3DSMAX) y construyo un escaso octárbol a partir de él. Cada nodo hoja cúbico no vacío es un vóxel. En el momento del renderizado, uso la emisión de rayos (implementada en HLSL) para encontrar qué vóxel ocupa qué píxel y establecer el píxel en el color almacenado en el nodo, que calculé al generar el árbol promediando los valores de textura del modelo fuente.

Esto le brinda muchos beneficios: detección de colisiones para LOD variable y gratuita, selección de espacios de visualización, etc., y, aparte de la emisora ​​de rayos, es fácil de implementar.

Desafortunadamente, es casi imposible publicar un código de muestra desde un teléfono.

3Dave
fuente
+1 para una alternativa. Si bien no es imposible de implementar con un rendimiento razonable, los pros superan con creces a los profesionales. El trazado de rayos Voxel impone un gran drenaje en la GPU. La aritmética y las condiciones necesarias para esto son muy costosas, cuando esos mismos ciclos de GPU podrían estar aplicando una serie de impresionantes efectos de espacio de pantalla, por ejemplo. SSAO. El mayor problema es que la emisión de rayos se ve mejor con múltiples rebotes que se encuentran en la radiosidad, lo que tampoco es viable para la escena que consta de millones o miles de millones de vóxeles y donde cada segmento de rayos requiere un esfuerzo considerable para rebotar y componer.
Ingeniero
... Esta es la razón por la que mencioné la emisión de rayos de escala solo como un aparte en mi respuesta (VoxLap), incluso si es difícil de implementar bien. Si puede hacer que funcione un enfoque de línea de exploración vertical, el costo es un orden de magnitud menor que el trazado de rayos por píxel, ya que ha reducido la dimensionalidad del proceso de renderizado de 3D a 2D. Este enfoque aún lo mantengo, aunque excluye posibles soluciones de iluminación complejas con su RTRT tradicional.
Ingeniero