Los Mapas Normales (Normal maps) se han vuelto muy populares en estos días, apreciados como una gran mejora en la industria de los videojuegos, pero también en la tradicional Industria CG e inclusive en la industria cinematográfica, aunque menos evidentemente. Actualmente existen soluciones para esculpir modelos a un nivel de detalle increíble (Zbrush, Mudbox y también nuestro amado Blender con su ya famoso modo Sculpt) pero crear mapas Normales para mejorar las superficies de nuestros modelos es aún un tanto limitado. Blender tiene la capacidad de bakear directamente mapas Normales en el Espacio de la Cámara (Camera Space Normal Maps) desde un alto nivel de resolución y aplicarlas en un nivel más bajo de resolución, gracias al UVmapping y de las mallas multi resolusión. Pero el paso final, ese que llevara a Blender al estándar falta aún y ése es Mapas Normales en el Espacio Tangencial (Tangent Space Normal Maps).

Si Blender soporta éste tipo de mapas, aún no sabe cómo bakearlos.

Mapas Normales contra Mapas de Relieve. Éstas son diferentes herramientas para diferentes trabajos. Ninguna debe ser considerada mejor que la otra, y algunas veces, deben ser combinadas/mezcladas tal de obtener los mejores resultados posibles. Ambas se basan en las normales de un objeto, por lo que ésto es lo primero que abordaremos en este artículo.

¿Qué es una normal?. Una normal es un vector perpendicular a la superficie, en un punto en particular. En modelado de polígonos, con superficies complejas hechas de pequeñas caras planas, se puede asumir que sólo habrá una normal por cara pero también tantas normales como caras. Esto se puede ver fácilmente en Blender. Por ejemplo, seleccione su modelo, luego vaya a modo de Edit [Tab]. En los botones Editing [F9], busque el panel Mesh Tools 1.

Este contiene varios botones de interés, especialmente Draw Normals (despliega las normales como líneas azules) y NSizes (cambia la longitud desplegada de las líneas azules para verlas mejor). Un vector normal tiene una longitud equivalente a una unidad.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-1.jpg


Mapas de Relieve. Un Mapa de Relieve (Bump map) es básicamente una imagen en escala de grises que indicara, para cada pixel de la superficie renderizada, si la longitud local de la normal debe ser escalada. Si "no", el pixel será interpretado al nivel del "suelo" de la cara (pixeles gris medio en el Bump map); si "si" el pixel será interpretado sobre el nivel del suelo (pixeles oscuros del mapa) o sobre el suelo (pixeles claros del Bump map); un 50% de gris significara que no habrá escalamiento de la normal. Un Mapa de Relieve básicamente simula el relieve de la superficie, que afecta el sombreado al desplazar virtualmente los pixeles renderizados según las normales.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-2.jpg

A la derecha se puede ver la imagen en escala de grises usada para el relieve y a la izquierda el resultado del renderizado.

Para lograr el efecto de Relieve (Bump), tiene que asociar una textura en escala de grises (puede ser una imagen o un textura procedural) a un canal de texturas, y activar la opción Nor en el palnel Map To de los botones de materiales. Utilice el control de deslizamiento Nor, en el mismo panel, para modular la intensidad del efecto Relieve.

El botón Nor tiene tres estados:

Apagado: el canal de textura no afecta el resultado renderizado.
Encendido (blanco): el canal de la textura afecta el resultado renderizado.
Encendido (amarillo): el canal de la textura afecta el resultado renderizado pero las normales están invertidas (los saltos se vuelven hendiduras).

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-3.jpg

La pestaña Map To, mostrando la opción Nor y su control de desplazamiento.

¿Y que hay de los Mapas de Desplazamiento (Displacement Maps)?. De manera similar a los Mapas de Relieve, el Mapa de Desplazamiento utiliza también una imagen en escala de grises para desplazar el polígono a lo largo de su normal acorde al valor almacenado en la textura. Es realmente eficiente con una malla finamente subdivided o subsurfed . Puede estudiar el modificador Displace para aprender más al respecto, ya que este tema escapa al porpósito de este artículo: los Mapas de Relieve y los Mapas Normales "simulan" (fake) superficies complejas en geometrías sencillas mientras que los Mapas de Desplazamiento necesitan geometrías muy densas para ser efectivos.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-4.jpg


Mapas Normales. El el caso de los Mapas Normales, todos los vectores normales están normalizados, es decir, todos ellos tiene una longitud igual a una unidad, y el color de la imagen es utilizado para indicar, para cada pixel de la imagen renderizada, cual es la orientación "simulada" de la normal local para cada pixel. El Mapa Normal básicamente "simula" la orientación local de la superficie al rotar virtualmente el pixel según la normal. El Efecto Normal será muy visible aún con materiales no (o muy ligeramente) especulares. Para lograr un efecto Normal, requiere asociar una textura a colores (un imagen de tipo uno, debido a que los Mapas Normales requieren de herramientas especiales para ser producidos) a un canal de texturas, activar la opción Nor en el panel Map To, como como hicimos previamente, pero ésta vez también active la opción Normal Map en el panel Map Image de los Texture buttons [F6].

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-5.jpg


Bakear Mapas Normales en el Espacio de Cámara en Blender. Desde la versión 2.43, Blender puede bakear normales en el Espacio de la Cámara (Camera Space) en la textura de un objeto. Este es sólo un paso hacia la producción apropiada de Mapas.

Normales con Blender, debido a que en el Espacio de Cámara se sufre de algunas limitaciones: las normales bakeadas son sólo usadas con el objeto en la misma localización/rotación/tamaño versus la misma localización/rotación/apertura de la cámara. Si la cámara o el objeto mapeado con las normales son movidos, deformados o animados en cualquier forma, entonces las normales se verán mal.

Leí sobre otros tipos de Mapas Normales, ¿qué hay de ellos?. Desde luego si que existieran más tipos de Mapas Normal en Blender que fueran útiles: por ejemplo con un Mapa Normal en el Espacio del Objeto las animaciones para objetos no deformables podría ser llevada a cabo, con los Mapas Normales en el Espacio Tangencial se podría animar objetos deformables (usando armatures, shape keys, softbodies, lattices, entre otros) mientras se mantiene una visualización decente. Desafortunadamente Blender no puede bakear estos tipos de normales por el momento, así que tiene que depender de herramientas externas para construir Mapas Normales en el Espacio Tangencial.

Bakear un Mapa Normal en el Espacio de la Cámara en una textura de un objeto es muy fácil. Seleccione el objeto que quiere bakear, luego desenvuelvalo (unwrap) sobre una supreficie UV en el editor UV/Image, añada una nueva imagen (menú Imagen >> Add...) y luego vaya al menú Scene [F10]. En la pestaña Bake seleccione la opción Normals y luego presione el botón BAKE. No olvide guardar Mapa Normal generado en cualquier formato de su elección (Targa es el default, PNG suele ser muy conveniente).

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-6.jpg


Desde luego que bakear las normales en una malla para usarlos con esa misma malla es casi inútil. El interés es usar esta opción de bakear con mallas multi resolución. Por ejemplo, puede empezar con una malla de baja resolución que desenvolvió (unwrap), como se especificó anteriormente. En el menú [F9], encuentre el panel Multires y haga clik en el botón Add Multires. Agregue un nivel (Level) y empiece a esculpir su malla, añadiendo detalles a través de los distintos niveles. Cuando estes satisfecho con su malla, puede revisar que el máximo nivel de Render esta seleccionado y proceder a bakear, tal como explique con anterioridad.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-7.jpg

Ejemplo de un Mapa Normal bakeado con Blender desde una malla multi-res de varios niveles de un cubo esculpido.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-8.jpg

Ejemplo del resultado de tintintas renderizaciones, de izquierda derecha a: cubo low-poly normal, cubo highpoly multi-res esculpido y cubo normal low-poly con Mapa Normal obtenido del cubo high-poly esculpido.

En la imagen previa, el Mapa Normal fue computado en el Espacio de Cámara para el cubo central, pero aplicado a una instancia low-poly del mismo cubo, ligeramente desplazado a la derecha. Desde luego, a primera vista, el hecho de que las normales están equivocadas (no están exactamente en el mismo Espacio de Cámara) no es fácil verlo en esta imagen fija, pero en una animación, sombras erroneas rápidamente traicionarían el Mapa Normal erróneo.

Probar este tipo de Mapa Normal en una animación sería una buena forma de ilustrar que tan inútil el Espacio de Cámara puede ser cuando es usado para objetos que se mueven o son relocalizados en un lugar diferente que aquella en la que el Mapa Normal ha sido construido. Desafortunadamente, tal como lo dijimos anteriormente, el Mapa Normal en el Espacio de Cámara es el único con el que Blender puede trabajar. El Mapa Normal en el Espacio del Objeto sería más adecuado para objetos rígidos animados. Finalmente, sólo un verdadero Mapa Normal en el Espacio Tangencial sería útil para todo, con cualquier objeto deformado animado. La última parte de este tutorial trata sobre como producir un Mapas Normales en el Espacio Tangencial, con herramientas externas y como usarlas dentro de Blender.

Usar DNormGen para construir Mapas Normales en el Espacio Tangencial con Blender. Hay muchas herramientas gratuitas disponibles en la red para construir Mapas Normales en el Espacio Tangencial, pero sólo algunas de ellas están disponibles para varios sistemas operativos al mismo tiempo. Una de estas, de hecho se destaca por tener un buen soporte para Blender, es el Drag[en]gine Normal Map Generator y esta disponible para Windows, Linus y Os X. Estos códigos están disponibles bajo GPL v2.0. Vaya aquí.

Vaya a la sección de Descargas y seleccione el paquete que desee utilizar. Hay dependencias que resolver para Unices y Os X, pero nada muy complicado (libfox1.4, libfox1.4-dev, libpng3, libtiff4, libxmu-dev son algunos ejemplos) y quizás hacer un link de libtiff.so.3 a lidtiff.so.4 (sudo ln -s libtiff.so.4 libtiff.so.3).

Una vez que DNormGen ha sido extraido, ponga atención a el ejecutable dnormgen y el archivo dragengine_dim_export.py en el directorio scripts/. Hay también muchabuena información sobre el uso de las herramientas en el archivo README.

El script para Blender que se porporciona con la herramienta tomara dos modelos: uno low-poly que debe ser nombrado *.low (en el campo OB y el archivo high-poly debe ser nombrado *.hi (* es el nombre original del objeto). Esto es obsolutamente necesario para que el script pueda trabajar, y pueda ser realizado usando los botones del panel Link and Materials del menú Editing [F9]. Luego exportara los dos modelos en el formato .dim, que es específico para la herramienta generadora de normales. Luego esta herremienta podrá construir un Mapa Normal de este archivo .dim.

Primer paso desde Blender. Antes de poder usar este script hay unos pequeños pasos que debe hacer dentro de Blender, como renombrar los objetos, configurar Subsurf para el objeto high-poly y seleccionar los dos objetos a exportar. El procedimiento exacto es el siguiente:

  1. Seleccione su objeto low-poly y añada a su nombre, en el campo OB:, la extensión .low. Desenvuelvalo (unwrap), añadale un material (si no tiene ninguno actualmente) y una textura (Image > New... en el editor UV/Image) que quiere salvar (Image>Save o Image>Save As...)
  2. Ahora seleccione su objeto high-poly y añada a su nombre, en el campo OB: la extensión .hi.
  3. Añada un modificador Subsurf al modelo high-poly (uno de Level 0, como se especifica en la documentación, no es posible en Blender cuyo mínimo es 1; si no desea alterar la forma, use la opción Simple Subdiv en lugar de Catmull-Clark).
  4. Seleccione los dos objetos: el objeto lowpoly y el objeto high-poly.
  5. Cambie una de las vistas a editor de texto (Text Editor). Use File>Open... para cargar el script dragengine_dim_export.py. Presione [Alt+P] con el cursor del ratón apuntando al editor de texto para correr el script, nombre el archivo .dim exportado (o acepte el dado por defecto).



Esta es la parte que hay que hacer con Blender. Debería tener ahora un archivo .dim con el cual trabajar en la herramienta DNormGen.

Segundo paso desde DNormGen. Cuando corra la herramienta DNormGen, vera dos ventanas diferentes:

DE Normal Map Generator, esta ventana muestra los modelos 3D (low-poly y high poly) y le permitira configurar el tipo de mapa que necesite (Displacement map, Normal map, Tangent Space o Object Space, etc.).

Texture Preview, esta ventana le muestra el mapa resultante.

Al principio, necesita cargar el archivo .dim creado en DE Normal Map Generator (File>Open...). El modelo low-poly aparecerá en la pantalla. Con el botón izquierdo del ratón puede hacer clik y arrastrar el objeto para hacerlo rotar alrededor de su centro. También puede acercarte y alejarte presionando [Shift] y presionando, de la misma forma, el botón izquierdo del ratón. Ahora puede revisar y explorar el menú View. Puede decidir mostrar el modelo low-poly o el modelo high-poly. Si los mapasya han sido calculados, también puede mostrarlos en esta ventana.

El próximo paso, para la generación de un Mapa Normal en Espacio Tangencial se encuentra en el menú Texture-Maps: primero debe definir el tamaño de los Mapas de Textura (Texture Maps Size) ajustando la altura y la anchura. Estos parámetros son por defecto 256.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-9.jpg


Ahora, puede proceder con la generación del Mapa Normal. En el menú Texture- Maps, selecione Generate Normal/Displacem ent Maps y ponga algunos segundos de atención a la ventanade opciones emergente.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-10.jpg


Al principio necesitara especificar si el modelo High-poly debe ser suavizado (smoothed) antes de proceder (marcando el cuadro de opción Smooth Hi-Res Mesh Normals) luego, puede seleccionar el tipo de Espacio del Mapa Normal que requiere (Espacio Tangecial o Espacio del Objeto).

Después de aceptar las opciones el mapa de texture es generado y la ventana Texture Preview es actualizada automáticamente. Notara que muestra las coordenadas UV en el objeto low-poly y que el nuevo Mapa Normal se ajusta al espacio adecuado. En el menú Texture-Maps seleccione Save Normal Map en el directorio que desee. Por defecto es nombrado como normal.tga.

Taller 3D - Mapas Normales en el Espacio Tangencial-taller-3d-mapas-normales-en-el-espacio-tangencial-imagen-11.png


Tengo problemas, ayuda por favor. ¿Los bordes del Mapa Normal están ligeramente descompuestos? En View>Set Hi-Res Mesh Options, incremente ligeramente la opción Vertex Offset. Alternativamente, usar un mapa más grande podría ayudar. ¿El relieve dado por el Mapa Normal no es lo sufivientemente fuerte? En el menú Texture-Maps, seleccione Apply Detail Normal Map y experimente con el valor Strength. Aplicando el valor por defecto de 50 puede provocar resultados dramaticos, así que úselo con cuidado. Leí en algún lugar que la capa Verde de un Mapa Normal debe ser invertida ¿Es esto cierto? Antes si lo era, pero el mapeador Normal de Blender es ahora totalmente compatible desde la v2.43 (previemente la escala del vector Z era diferente).Si usa la última versión de Blender ya no tiene que invertir el canal verde en algún programa como The Gimp para poder usar DNormGen normal maps.

Tercer paso, regreso a Blender. Ahora tiene el Mapa Normal en el Espacio Tangencial correcto para ser usado en Blender. Seleccione el modelo low-poly que desenvolvió hace algunos minutos. En el modo UV Face Select, en el editor UV/Image, elimine cualquier mapa temporal que pudiera tener y cargue el archivo normal.tga creado en DNormGen usando el menú Image>Open... En los botones Material, menú Shading [F5], seleccione la pestaña Shaders y active el botón NMap TS.

En la pestaña Map Input, la textura debe usar las coordenadas UV, y en la pestaña Map To, debería marcar Nor channel (inviértalos si cree que el sombreado es incorrecto). Finalmente, en los botones Texture, en la pestaña Image Map, revise que el botón Normal Map esta activado y que el mapa seleccionado en el panel Image es el archivo normal.tga generado en el DNormGen. Guarde [F2] su proyecto, listo ¡Has terminado tu modelo lowpoly con un Mapa Normal en el Espacio Tangencial!.

Publicado en Blender Art Magazine por Oliver Saraja.