¿Por qué los mapas de normales son azulados o morados?

Responder esta pregunta no es nada trivial. Hace falta saber de vectores, de normalización, de compresión, de formateado de datos.

Si no sabes suficiente sobre álgebra de vectores tengo un curso gratuito que puede serte de utilidad. Visita la sección de cursos de esta misma web.

Aquí tenéis una típica textura o mapa de normales. Esta se utiliza para darle un poco más de detalle "falso" a un modelo 3D que no es tan detallado. 

Textura 

Textura aplicada y sin aplicar 

¿Que son los mapas de normales?

Los modelos 3D tienen datos de vértices y de normales por cada vértice. Estas indican hacia dónde apuntan los polígonos respecto a efectos como la iluminación. El lado contrario de esas caras son las caras traseras o backfaces. Según la configuración en algunos motores pueden no verse esos polígonos si se miran desde el lado contrario a donde apuntan las normales para ahorrar pintarlos.

Un mapa de normales codifica en colores datos de las modificaciones a las normales originales que tiene el modelo 3d original.

Es decir son vectores qué hay usar en lugar de la normal original. 

Los vectores de un mapa de normales suelen estar expresados en espacio de tangente o en espacio de objeto. Lo más común es que estén en espacio de tangente que son esas texturas de color morado o azulado. 

Textura en espacio de tangente y en espacio de objeto. 

Enlace al artículo donde explico lo que es un espacio. 

El espacio de tangente está definido por cada vértice. El centro es el vértice y el eje está formado por la tangente la bitangente y la normal.

Ojo: En algunos lados erróneamente se utiliza la palabra binormal para llamar a la bitangente.

Imagen del espacio tangente 

Es decir que si un modelo está sin modificar sus normales generalmente apuntan hacia fuera. Y tienen tamaño uno es decir están normalizadas. Sus valores van de -1 a 1.

El aspecto de un mapa de normales que no aplica ningún cambio a los datos originales de la malla es así: 

Imagen de un mapa de normales default

En cambio un mapa de normales que sí modifica el aspecto de una malla es por ejemplo este... Sus colores son generalmente azulados pero varían hacia el rojo o hacia el verde.

¿Por qué es así?

Si utilizásemos un editor de imágenes como Photoshop o paint veríamos que el color de todos esos píxeles de la imagen en RGB (rojo, verde y azul) es:  (122, 122, 255). COMPROBAR

En vez de usar rango de cero a 255 vamos a usar de 0 a 1 para verlo tal como son los valores de los vectores normalizados que tienen longitud 1. 

Es decir, ese valor sería (0.5, 0.5, 1).

Recordad que esto codifica vectores. Los vectores tienen x y y z con lo cual cada uno de esos valores corresponde a esos tres componentes del vector.

¿No es raro que el vector tenga esos valores tan extraños?

¿Y qué pasaría si queremos convertir a color un vector (-1, 0, 0)?. ¿Qué valor tomaría el -1? 

Esta es la razón por la que se usan solo valores positivos, los colores solo pueden ser positivos no negativos. Esto es lo que se llama el empaquetado.

Lo que hacemos es mapear valores de -1 a 1 al rango 0 a 1, que es el rango que permite un canal de color.

Es decir el menos uno es cero y el 1 es 1. 

(-1,1) --> (0,1)

Cambiar de uno a otro es muy fácil, solo hay que sumar uno y dividir entre dos.

Y para desempaquetar habría que multiplicar por dos y restar 1. 

Veamos como queda el vector (0.5, 0.5, 1) desempaquetado...

Quedaría (0,0,1).

Dibujo del vector.

Como vemos es el mismo vector que tenía la malla originalmente si estaba bien construido. Por eso esto es un mapa de normales que no modifica la normal original. 

En resumen, la razón por la que suelen ser azulados es porque casi siempre permanece el valor original de la normal que es un vector mirando hacia afuera que es el eje z, el color azul cuando lo convertimos a textura RGB. Suele ser predominante el color azul por ello.