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:
- código y algoritmos. preferiblemente basado en C #
- explicaciones Soy un principiante con algoritmos pero estoy muy familiarizado con la programación orientada a objetos.
- demostraciones paso a paso. No solo concepto sino dirección.
- 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).
procedural-generation
terrain-rendering
voxels
csg
Daniel Pendergast
fuente
fuente
Respuestas:
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.
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:
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.
fuente
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:
Desde aquí puede probar islas flotantes o agregar sistemas de cuevas con ruido fractal:
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í .
fuente
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.
fuente