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:
- 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.