Las Normales: Qué son y cómo usarlas al texturizar en 3D

Cuando se comienza a aprender sobre 3D, el de las normales es uno de los conceptos que más cuesta coger. Están ahí y sabemos que existen, pero los más amateurs muchas veces no sabemos muy bien qué hacer con ellas ni cómo podemos usarlas para obtener mejores resultados.

Las normales son un vector perpendicular a un polígono (o a un vértice) que sirve para indicarnos la orientación de la cara de este. Es decir, las normales sirven para que el programa de 3D o el motor en el que estemos trabajando sepa cómo debe renderizar los polys que forman nuestro modelo 3D. La dirección de la normal determina cómo la luz incide en el polígono y por tanto, cómo termina por verse en el render final.

Aunque algunos programas de edición 3D nos muestran los polys desde cualquier ángulo (por comodidad para trabajar con ellos simplemente), estos en realidad solo tienen una cara determinada por la normal: si le diésemos la vuelta, se vería invisible. ¿No os ha pasado nunca en un juego que la cámara se vuelve loca y de pronto atraviesa paredes a través de las cuales podéis ver? pues eso es porque estamos viendo el polígono desde el lado contrario a la normal y desde este ángulo no se renderiza (cuestión también de optimización y rendimiento: ¿para qué queremos gastar recursos en renderizar 2 caras si solo necesitamos ver una?).

normales-esquema

Sabiendo ya la definición técnica de las normales seguimos en las mismas. Vale, nos hemos leído un par de páginas sobre 3D y nos han dado la definición técnica. Pero, ¿para qué uso yo las normales a la hora de hacerme un modelo 3D y meterlo en un juego o en una animación?

Normales para modelar:

En el proceso de modelado, como las normales nos determinan la dirección de las caras y los vértices, también son un recurso que podemos usar para darle un aspecto u otro a la escultura.

Si estamos haciendo una estética low poly muy típica de algunos indies, queremos que en el resultado final se distingan perfectamente unos polys de otros: buscamos ese aspecto facetado. Esto se consigue (a parte de como el propio nombre indica, con pocos polígonos) poniendo las normales de los vértices en hard shading. En Maya esto se consigue en el modo Modeling -> menú Mesh Display -> Harden Edges. En 3D Studio Max esto se consigue seleccionando las caras que quieras endurecer y en el menú Graphite Modeling Tools -> Hard Selected. Por defecto, todas las piezas que se modelan ya tienen las normales endurecidas.

dino-hardedges

Si por el contrario, queremos un acabado suavizado, no es necesario que sacrifiquemos nuestros pocos polígonos (en videojuegos cuantos menos usemos, mejor). Podemos suavizar las normales de nuestros vértices para que las caras se rendericen de tal modo que no se noten los edges entre poly y poly. En Maya esto se logra en el modo Modeling -> menú Mesh Display -> Soften Edges. En 3D Studio Max en el menú Graphite Modeling Tools ->Smooth Selected o mediante Smoothing Groups (herramienta encontrada dentro del modificador Editable Poly del objeto en cuestión).

dino-smoothdges

 

En esta última imagen, vemos la misma pieza aunque suavizada pero con el mísmo número de polígonos que la anterior. Aun así, al haberla suavizado, perdemos algunos rasgos que quizás quedarían mejor si las aristas que los recogen estuviesen endurecidas. En un misma pieza se pueden mezclar normales suavizadas y endurecidas, solamente hay que aplicar el cambio (soften edge/harden edge) con las aristas que queramos cambiar seleccionadas. De este modo, podemos usar la colocación de las normales para darle un acabado u otro a nuestra escultura.

dino-mixededges

Las normales pueden ser editadas (cambiar el ángulo, revertirlas, etc) desde el menú Mesh Display en Maya o desde el modificador Edit Normals de 3D Studio Max. De este modo, con un poco de maña, se pueden manipular las normales de un objeto 3D para ayudarnos a que tenga el aspecto deseado.

Sobre normales en: Maya y en 3D Studio Max.

Normales para texturizar:

Como ya hemos dicho antes, las normales determinan cómo se renderizan los polígonos ya que, en esencia, lo que hacen es decirle al motor en qué dirección rebota la luz. Cualquiera que sepa un mínimo de dibujo o fotografía, sabrá que los volúmenes se forman mediante la luz. En 3D, podemos darle a un polígono información más compleja de cómo rebota la luz sobre él mediante mapas de textura, principalmente normal maps y bump maps.

Poniendo un ejemplo práctico, en un videojuego la regla principal es “cuanto menos, mejor”. Cuantos menos polígonos, más optimizado estará un modelo, menos pesará y más fácil será para un motor gráfico moverlo. Entonces, ¿creéis, por ejemplo, que es óptimo que si en nuestro juego queremos meter un muro de ladrillos modelemos toda la pared con todo su correspondiente detalle? Imaginad que cada pared de una habitación tuviese medio millón de polígonos. Probablemente el technical artist nos tiraría el teclado a la cabeza o, en caso de no tener un technical artist, se quemaría tu ordenador según intentases mover esa escena en tiempo real en un juego.

Para este tipo de cosas usamos los bump maps y normal maps, para dar todo el detalle de volumen que podemos ahorrarnos modelar. Hasta en los últimos juegos AAA, por muy buena tecnología que se use, no te puedes permitir que una Play 4 corra el Uncharted 4 con un modelo que tenga hasta los poros y las arruguitas de Nathan Drake.

Yendo a lo simple, en vez de tener un millón de polígonos en una pared de gotelé, podemos usar un solo polígono y una textura tileable (que se repita en patrones). El technical artist y el motor gráfico te lo agradecerán.

normales-ladrillos

En la imagen de ejemplo de arriba, vemos un fragmento de pared de apenas 4 caras (y como ya he dicho con un solo poly nos bastaría) pero que sin embargo tiene todo el detalle de profundidad entre los ladrillos y la rugosidad de estos. Esa es la magia del normal map o del bump map. Ahora, ¿cómo funcionan estas texturas y cómo las podemos hacer?

Primero tenemos que entender que el normal y el bump son texturas bastante similares en función: sirven para indicarle a la luz cómo reflejarse sobre el modelo creando relieves falsos. Muchas veces se usan de manera complementaria, otras sólo uno, depende de cómo estemos trabajando.

Estas texturas siempre van conectadas al nodo que tiene su mismo nombre en el material que estamos usando. Dependiendo del programa, quizás ponga solo “normal” o solo “bump” pero el mismo nodo acepta los dos tipos de mapa.

Bump Map: es una textura que funciona de manera similar a un alfa. Es una imagen en blanco y negro, en la cual los programas de 3D interpretan el negro en esta como los volúmenes que se meten hacia dentro y el blanco como los volúmenes que salen hacia afuera. En el ejemplo de la pared de ladrillos, los ladrillos serían la parte blanca (volumen positivo) y los surcos entre ellos, la parte negra. Podemos conseguir un bump desaturando la textura de color que tengamos y contrastandola o manipulando sus niveles según lo que tengamos.

Normal Map: el normal es el hermano mayor del bump, puesto que es más complejo, ya que en vez de tener 2 variables, tiene 3. Los normals son mapas formados por 3 colores que representan cada uno de los ejes del espacio 3D: rojo para la X, verde para la Y, azul para la Z. En lugar de darnos información solo de qué volúmenes van hacia arriba y qué volúmenes van hacia abajo, nos da información de cómo rebota la luz en 3D, por lo que nos da más detalle. Estos mapas generalmente se consiguen bakeandolos de modelos de alta resolución. Aunque no de manera tan precisa, se puede sacar un normal de un bump mediante un pluggin de Nvidia para Photoshop.

comparacion bump normal

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s