Mapa de normales.- Crea un asset para tiempo real.

Mapa de normales.- Crea un asset para tiempo real.

Mapas de normales.- transferencia de detalles para modelos de tiempo real.

 

Los mapas de normales son texturas que alteran la forma en que la luz interactúa con una superficie 3D, simulando detalles de relieve sin necesidad de geometría adicional.
Cada píxel del mapa de normales contiene un vector normal (dirección perpendicular a la superficie) codificado en los canales de color RGB:
Rojo (R) → dirección del eje X
Verde (G) → dirección del eje Y
Azul (B) → dirección del eje Z
Cuando la luz incide sobre la superficie, el motor gráfico usa esta información para calcular cómo debería reflejarse la luz, imitando bultos, hendiduras o arrugas que en realidad no existen en la geometría del modelo.
Hace ya un tiempo atrás (bastante diría yo) se hizo mención de ciertos «trucos» que se pueden hacer con mapas aplicados a distintos canales en el material.
A medida que la ejecución en tiempo real es cada vez más popular (realidad virtual, Realidad aumentada, realidad mixta, etc) las técnicas que nos permiten dotar de mucho detalle a geometrías de densidad poligonal restringida, están mas vigentes que nunca.
Un clásico, pero aún muy potente método para lograr este cometido es el de la proyección de normales.

Importancia del mapa de normales  y curiosidades.-

La idea detrás de los mapas de normales se originó en los años 90, dentro de la investigación académica sobre renderizado en tiempo real.

El concepto formal fue presentado en 1998 por James Blinn y otros investigadores de Pixar y SGI, aunque el término «normal mapping» se popularizó con un artículo de Tanner et al. (1998) titulado «The RenderMorphics Bump Mapping Technique».

En la práctica, los primeros videojuegos en usarlos de forma visible fueron:

«Doom 3» (2004) de id Software — uno de los pioneros en usar normal mapping de manera masiva para lograr un aspecto realista con pocos polígonos.

«Halo 2» (2004) también los usó, aunque con limitaciones de hardware.

Descripción del proceso.-

Malla Base.-

Partimos de una figura sencilla, de esta forma nuestro «low poly» puede derivar sin problemas de la construcción inicial.
Crearemos un spline cuadrado de 50*50 cm y una línea (spline también) de 100 cm. esto será el volumen de nuestra columna.
Luego generamos un solevado que nos deja con una caja (box) como se indica en la figura.

Mapa de normales

La caja mediante solevado nos permite utilizar las deformaciones de nuestro objeto compuesto, concretamente la escala.
Activamos esa función especial y perfilamos con cortes y guías cómo queremos la columna.

Mapa de normales

Con la forma ya creada, a veces se pueden observar unas sombras irregulares que provienen del cálculo de normales original del solevado que se ha «destrozado» por los cambios en la geometría.
Esto se soluciona con el modificador Smooth. El proceso es simple. Se aplica en la pila de modificadores y luego se colapsa en polígono editable nuevamente.

Como el perfil inicial fue hecho con la deformación de escala y nos queda crear curvatura en ciertas zonas de la columna, terminamos aplicando varios Chamfer a las esquinas que queremos que sean curvas. De nuevo, si se aprecian sombras extrañas, el modificador smooth es la solución.

Mapa de normales

De izquierda a derecha el objeto creado con Loft. el objeto modificado con las deformaciones y el modelo ocn los detalles de chamfer añadidos El panel de modificadores de la derecha muestra las diferentes instancias aplicadas junto con el modificador Smooth)El turbosmooth del final ayuda a pulir las curvaturas.

Una vez obtenida la «geometría base» procedemos a dejarla «colapsada» como polígono editable.

Así podremos segmentarla con TYFlow en la siguiente parte.

TyFlow.-

TyFlow es un plugin para 3DsMAx que ha revolucionado el apartado de gestión de partículas . Existe una versión de pago y una gratuita que, a pesar de tener algunas limitaciones ya ayuda muchísimo a cosas como la que vamos a hacer hoy. Lo importante de esta herramienta es la facilidad con la que se pueden crear animaciones muy potentes y de forma procedural y modular.

Su forma de trabajo es por nodos. Se integra visualmente con el Particle Flow de MAX.

Mapa de normales

Este es nuestro objetivo. En los siguientes pasos Pasaremos de nuestro objeto inicial a uno mucho más complejo

Luego de haber instalado TyFlow en MAX, se lo puede encontrar en las primitivas estandard de MAX. Tendremos que crea un ícono para luego poder acceder a su panel mediante el botón de la pila de modificadores.

Accedemos por el botón Open editor para desplegar el gestor de nodos.

Luego creamos un Evento «BirthObject» que hará posible llamar a nuestra malla base como un elemento del sistema de partícula. En este caso una partícula muy grande.

Sobre ese mismo evento, arrastramos un Operador (llamado así porque manipula la partícula del sistema) con el nombre de «Voronoi Fracture». Este operador es responsable de «cortas» la geometría en cortes irregulares según la ecuación Voronoi.

Los patrones de Voronoi generan celdas convexas por defecto. Sin embargo, al descartar varias paredes celulares, se pueden generar celdas cóncavas, lo que permite patrones de fractura más interesantes.

Lo primero que hay que ver en este operador es el número de puntos en los que se va a partir la geometría. Más puntos generan más cortes.

El siguiente operador que se añade se llama «Edge Fracture» Y tiene por objetivo crear grietas sobre las zonas previamente rotas por el Voronoi.

Mapa de normales

En el nuevo evento añadiremos un operador llamado «Delete». Con esto logramos que las grietas desaparezcan

Mapa de normales

A los diferentes comandos se puede acceder de dos formas. La que hemos usado hasta la captura anterior era arrastrando del la lista que hay en la zona inferior del panel. Pero también se puede acceder a un buscador (igual que la tecla X en MAX) y es mediante la Tecla tabuladora

 

EL modelo ya tiene las particiones que queremos, pero ya que estamos aquí  Añadiremos de forma opcional dos operadores más.

El primero es un operador «Push» que hace que las piezas rotas se «inflen un poco a fin de cruzarse unas con otras. Esto ayuda  al paso final para nuestro modelo de alta resolución.

Mapa de normales

Hay que fijarse bien porque la cantidad de «inflado» no debe ser excesiva.

El siguiente operador es un «Rotation Random 3D» que gira las piezas ligeramente a fin de añadir caos a las piezas rotas. Hace ver más complejo al modelo. Tampoco hay que excederse.

Mapa de normales

El modelo ya está finalizado. Hemos usado una milésima parte de Tylfow, pero por esta vez no es necesario más.

Sólo falta resolver una ultima cuestión.

El modelo nuevo que tenemos. Para efectos del programa, se encuentra en el ecosistema de TyFlow. Eso quiere decir que, de momento, no cuentan como modelo poligonal.

Para poder convertir esta partícula a modelo es necesario añadir un operador más que re interprete lo creado por Tyflow

EL operador se llama «MESH»

Cuando pongas este operador asegúrate que desactivas la casilla «render Only» si quieres que se pueda convertir en geometría.

Modelo «High Poly» y proyección del mapa de normales.-

Ya podemos cerra el panel de Tyflow y centrarnos en generar nuestro modelo High poly para la proyección. Esto se hace en dos pasos.

Primero colapsamos nuestro sistema TyFLow y lo convertimos en un editable poly (click derecho y «convert to …»)

Con esto nuestro objeto ya es un modelo poligonal con muchos elementos (las piezas rotas).

Luego de la conversión es preferible solucionar la mala posición del pivot. Que siempre estará donde estaba el ícono de TYFlow y debería estar en el centro y en la base de nuestro objeto final.

Podemos solucionar esto fácilmente con la transform toolbox que se encuentra en el menú Edit de MAX

La cantidad de polígonos no es muy grande ahora pero lo que debemos hacer es fundir todas las piezas para lograr tener una malla que sólo tiene la pared externa. Actualmente el Voronoi ha generado piezas internas y esas son innecesarias.

Para fundir la malla y quedarnos con una sola masa de polígonos recurriremos al VDB (Volume Data base)

Qué es un VDB?

A pesar de que no es  tema principal de nuestro artículo, describiremos brevemente lo que son los VDB y para lo que sirven en el mundo del 3D.

Los VDB (Volumetric Database) en 3D son un formato de datos diseñado para almacenar y manejar volúmenes tridimensionales de manera eficiente.

Su estructura es jerárquica y comprimida, lo que permite manejar volúmenes grandes con poco consumo de memoria.

Su potencia radica en que puede manejar cosas como líquidos o partículas de gas y tratarlas como mallas poligonales ocupando relativamente poca memoria.

Para nuestra columna

En nuestro caso, lo que haremos es que opere como una operación booleana que «lea» y se quede sólo con lo que es el volumen principal de la columna Y respete en forma de polígonos todas sus irregularidades.

Esto nos dejarán una malla muy densa, pero que nos sirva para la proyección de normales sobre una malla más reducida.

Antes de la versión 2023 de MAX tendríamos que haber recurrido a Tyflow o a algún otro conversor externo. Pero afortunadamente MAx tiene (a partir de la 2023) una operación booleana en los modificadores y con soporte para VDB.

Los pasos para poder usar el VDB son los siguientes.

Creamos un objeto externo «extra» con el que podamos interactuar para crear una booleana «falsa» el objeto no debe estar cerca de la columna.

Luego, seleccionando la columna añadiremos el modificador «boolean»

 

De esta forma la operación booleana no ha afectado a nuestro modelo «físicamente» pero ha dejado la puerta abierta a que podamos usar las funciones del boolean.

Es ahora que usaremos la función VDB de las booleanas de MAX:

Cambiamos la salida (método) del modelo de mesh a Open VDB

Cuando se elige el VDB el objeto se «solidifica» en una malla densa que captura todos los detalles de la geometría rota.

El voxel Size el el reponsable de la cantidad de polígonos resultantes. Mientra menos tamaño de voxel Size más fiel será el modelo final al volumen inicial. Pero será más denso.

Hay que ir con cuidado con este número

Dependiendo de la máquina, el resultado puede demorar unos segundos en crearse

Hemos creado ya nuestro high poly con todo detalle. El modelo resultante tiene  un millón trescientos mil polígonos.

La mancha roja de polígonos seleccionados. Nos confirma la densidad del objeto.

El objeto Low poly .-

Nuestro objeto pensado como lago que tendrá que ejecutarse en tiempo real tendrá que tener muchos menos polígonos que nuestro objeto «esculpido» de un millón y más de polígonos.

Afortunadamente en este caso la obtención de nuestro asset es muy fácil porque podemos obtenerlo de nuestra construcción incial.

Convirtiendo la malla base a edit poly y quitando algunas aristas obtenemos un objeto con poco mas de 3000 polígonos.

Es cierto que podemos reducirlo aún más, pero para el ejemplo lo dejaremos así. siempre se puede recurrir al optimizer de MAx para generar un LOD 

El modelo de alta resolución a la izquierda y el de baja a la derecha con las mismas dimensiones con las que hemos comenzado.

El modelo receptor del mapa de normales (mapa responsable del detalle) debe tener desplegado e mapa de coordenadas. Porque si no no puede recibir correctamente la información del mapa de normales.

El modificador unwrapUVW en MAX hace el trabajo de desplegado. En esta ocasión no podemos presumir de eficiencia en el desplegado. Pero para el ejemplo ya basta.

Gracias a herramientas como Substance Painter, ZBrush, Blender o Marmoset Toolbag, el uso de mapa de normales está completamente integrado en el flujo de trabajo moderno.

Pero diremos que también MAx es capaz de extraer o proyectar el mapa de normales desde el modelo de alta resolución al de baja resolución.

Procedimiento de extracción del mapa de normales.-

Necesitaremos el comando «bake to texture» que podemos llamar desde el menú de render.

Con el objeto low poly seleccionado activamos el menú de Baking. Recordemos que los objetos tienen que estar solapados uno sobre otro.

El cuadro de diálogo del comando tiene una columna a la izquierda de todos los atributos que se pueden extraer mediante el proceso de «Baking».

Cuando se elige una característica luego hay que desplazarla al menú principal de la derecha. Desde ahí configuraremos aspectos como  la calidad y resolución del mapa extraído.

En esta ocasión nos centraremos en el mapa de normales a pesar de que la captura señala más aspectos en la lista de Baking.

Lo siguiente será prestar atención a la columna «projected» que nos permite  decirle al comando desde qué modelo recibiremos la información de geometría.

Se puede elegir «desde escena» haciendo click sobre el modelo high poly o «desde lista» donde elegiremos el modelo de un listado que aparece parecido al «scene explorer»

Cuando se hace la elección  del objeto high poly, aparece un modificador de proyección sobre el modelo low poly. Su gizmo es una malla de color azul que es la que le indica la zona de proyección para generar el mapa.

Esa malla suele ser siempre caótica

Para resolver esto  en el modificador hay un apartado llamado «Cage». Lo desplegamos y presionamos el botón «reset»

Y el resultado es una malla más acorde con el modelo

Aún así la malla ahora está muy pegada al modelo receptor, hay que ampliarla para que abarque las irregularidades del high poly. Esto se logra con el comando «Push»

Los valores del push no tiene que ser muy altos.

Ahora volvemos al panel de bake y esperamos al resultado

Y ya tenemos el mapa de normales listo para aplicar al modelo

Siempre recordar que en MAX el mapa de normales va en el canal de Bump, previa inserción del filtro necesario.

Y el resultado es evidentemente satisfactorio

A la izquierda el asset para tiempo real con el mapa de normales aplicado y a la derecha el modelo de alta resolución.

Espero que con esto sea más fácil apreciar el poder de la transferencia de detalles por medio del mapa de normales. En el curso que impartimos en la escuela ESPAI se hace hincapié en esto. Pero nunca está de más tener un refuerzo.

 

 

 

Escribe un comentario