Quizás el nombre de #MarchingCubes les diga nada, tal vez no lo hayan escuchado nunca, este algoritmo hace parte de los algoritmos de generación procedural, más concretamente para la creación de terrenos en videojuegos donde el terreno juega un papel importante como en #Minecraft o #NoMansSky o en juegos de #MundoPersistente, que permite a los mismos usuarios modelar el entorno.
Yo no soy un adalid en la materia, de hecho tengo algunos errores gráficos que me gustaría que alguien me dé pistas de como corregirlo. Esta vez les traigo las bases para que aprendan a construir su propio algoritmo, mi construcción será bastante sencilla y ello implica modelar un poco en #Blender, quizás este tutorial se alargue 2 blogs de más.
Hago una advertencia, esto es una implementación sencilla, no quiere decir que sea la más óptima, hay implementaciones muy complejas, con optimizaciones a nivel de bytes, ya que este algoritmo es de los más costosos computacionalmente, porque se hace un uso intensivo de arrays tridimensionales.
Creando los bloques en Blender.
En mi construcción cada bloque va a ser redondeado para que tenga un aspecto más orgánico, si alguien prefiere hacer un clon de Minecraft, puede dejarlo con el aspecto de un cubo.
Procedamos a abrir #Blender y a eliminar el cubo y la cámara por defecto de la escena y creemos un cubo centrado en la escena de un metro.
Vamos a duplicar tantos de estos cubos hasta obtener un máximo de 64 cubos, cada cubo le eliminaremos una cara o varias, la idea es generar todas las variaciones posibles de este cubo y aunque pueda parecer repetitivo y hasta poco intuitivo, todo tiene una razón, en este caso es una razón de economizarnos código en el futuro (por eso dije que era la opción más fácil, no la más óptima).
Para lo que quieran un diseño sencillo pueden obviar el paso que sigue que es redondear las esquinas, para ello seleccionamos todas las caras que hacen parte de los marcos exteriores del cubo grande y presionamos CTRL+1 o agregamos el modificador #subdivisionSurface, basta con un solo nivel de división.
Ahora hemos logrado suavizar los bordes, pero si acoplamos uno con otro tendremos agujeros que se verán terribles cuando acoplemos las partes, para eso entramos en modo edición con tabulador y vamos a seleccionar los bordes de las esquinas de cada cubo y vamos a aplicar un plegado medio al valor de 1,00, que se encuentra en el panel de opciones/elemento presionando la tecla N sobre la vista 3D, para que no se vea afectado por el modificador de subdivisión de superficie.
Ahora hemos logrado que acople las partes, hasta este punto está bien para un juego de estética de móviles, pero para mi gusto aún se ve duro el sombreado, así que voy a suavizarlo, para eso vamos a modo objeto, seleccionamos objeto y sombrear suave.
Siga aplicando los pasos a cada una de los trozos de cubos para que se vea suavizado y con bordes bien definidos.
Nombramiento de los cubos.
La parte estética no es relevante en este tutorial, lo realmente importante es la manera que nombraremos cada malla de cubo para que sea fácilmente localizado a través de código y se pueda poner la malla correcta en el espacio correcto, para lograr esto, tenemos que entender como funciona el algoritmo.
Haz de cuenta que tienes un cubo invisible que no sabe como que forma tomar, para esto el cubo lanza rayos en cada una de las 6 caras del cubo, para saber si tiene vecinos y tomar la forma que mejor se adapte.
De acuerdo a lo anterior tenemos que nombrar cada cubo con 6 caracteres, cada caracter lo define cada cara, esto es muy parecido a bytes de 6 dígitos y puede optar por este camino para aplicar la primera optimización, en mi caso voy a optar por usar letras, ya que es más descriptivo y la acomodación de los datos voy a orientarlo a cada uno de los ejes comenzando por X, Y, Z del plano cartesiano de #Unity.
Los valores L = left, R = Right, donde L puede ser -1 y R ser 1.
Los valores D = down = -1 y U = up = 1.
Los valores B = back = -1 y F = forward = 1.
Si el valor es falso lo relleno con 0, si el valor es verdadero, lo relleno con la letra correspondiente.
Este es el criterio que apliqué para los nombres, en el caso de los cubos, en la dirección donde falte una cara, ese valor es verdadero y en donde aun conserve esa cara, ese valor es falso.
Complete el nombramiento de todos los objeto como sus respectivas mallas y exporte el archivo en formato *.FBX, activando la opción experimental para que se conserven los ejes y las rotaciones tal como en unity y desactivando las luces y las cámaras.
Eso ha sido todo por ahora, en el próximo Blog, comenzaremos con la implementación del algoritmo Marching Cubes. No siendo más nos vemos la siguiente semana.
Commentaires