[Blender] Mapeado UV

mapeado UV en Blender
Por Claudio Maléfico Andaur. http://www.malefico3dorg

introducción.

El mapeado UV consiste en la asignación de una textura 2d a las caras de un modelo 3d siguiendo las coordenadas de la superficie (las coordenadas UV precisamente). Es uno de los métodos más populares y efectivos para texturizar personajes animados, pero a la vez es uno de los más difíciles y tediosos de utilizar cuando se quieren obtener resultados dignos. Blender soporta texturizado UV, pero no da demasiadas facilidades de uso, por ello es común que la mayoría de las veces para realizar el mapeado se recurra a software externo como lithunwrap, ultimateunwrap3d, uvmapper, etc.

En este tutorial voy a explicar un método efectivo basado en técnicas de texturizado UV comunes a la mayoría de los software comerciales. Este método es prácticamente idéntico a otros comentados en tutoriales para Maya, 3dstudio y Wings3d por mencionar unos pocos, aquí se ha intentado suplir el uso de herramientas especificas de esos paquetes por las propias de Blender con sus conocidas limitaciones.

Uwmap vs unwrap
Existen dos enfoques tradicionales para texturizar que están relacionados de alguna manera. El primero de ellos, el mapeado UV tradicional, consiste en mapear la geometría de nuestro modelo sobre un plano. Para ello, y dependiendo de qué tipo de geometría estamos manejando, normalmente se dispone de un editor UV y una serie de algoritmos de volcado uv esto es un programa que matemáticamente despliegue o proyecte nuestro modelo sobre un plano. De esta forma se generara un mapa de nuestro modelo, que podremos llevar a un programa de imagen como Gimp o Photoshop para pintar nuestra textura.

El otro método, consiste en algo similar, pero diferente. Se trata de desplegar o desenrollar el modelo mismo (no una proyección) en el espacio 3d (esto en inglés se dice unwrap que es más canchero) y luego trabajo este modelo despanzurrado sobre un plano. Una vez que se ha hecho la textura y se la a asignado a la proyección, el modelo se vuelve a su forma original.
¿Qué forma es mejoré depende del gusto del comensal. Normalmente el segundo método requiere de mayor manipulación de la malla y más pasos intermedios. Hay quienes lo hacen manualmente mientras que otros confían en un programa. En definitiva, es más complicado, aunque bastante efectivo en la mayoría de los casos reduciéndose mucho el defecto de estiramiento de las texturas. Para aplicarlo en Blender necesitamos mucho trabajo, paciencia, tiempo, cuidado y suerte. Existen algunos scripts en Python, que con mayor o menor fortuna permiten hacer un unwrap de nuestros modelos. Y luego está el problema de hacer lo inverso, volver a armar el modelo.

Por ello es que vamos a optar por el primer método, es decir el mapeado UV tradicional, que es el soportado nativamente en Blender.

Manos a la obra
Cuando trabajamos con algo más complejo que un cubo es conveniente dividir el trabajo en cuantas partes sean necesarias para facilitarlo. Un personaje como moncho, conviene dividirlo en cabeza, extremidades y tronco al mejor estilo Jak el destripador. Primeramente porque será más sencillo de mapear, y luego porque nos permitirá utilizar distintos materiales y texturas para cada parte con ajustes particulares según nuestro criterio.

Para dividir la malla, simplemente se seleccionan las partes de la malla en modo edición y se pulsa p para separarlas como objetos independientes.


Figura 1. Moncho antes y después de ser despedazado.

Una vez dividida la malla en partes más pequeñas, iniciaremos nuestro trabajo de mapeo creando grupos de vértices como si estuviéramos por usar un armature. Esto tiene la ventaja que luego cuando queramos ocultar o seleccionar rápidamente un sector de la malla no perdamos tiempo con los vértices de difícil acceso. Mejor trabajar una vez y no decenas de veces.

Vamos a empezar con la cabeza de moncho, la misma técnica se aplicará para el resto del cuerpo.

Seleccionemos la cabeza y entremos en el áspero face select mode (de ahora en delante fsm), pulsando la tecla f en modo objeto. Este modo nos muestra todas las caras visibles (con la normal hacia afuera) en color blanco. Las caras seleccionadas aparecen con un delineado horrible (con puntitos) que hace doler la vista. La ventaja de este modo es que podemos seleccionar caras y ocultarlas o mostrarlas pulsando h y Alt+h respectivamente. De cualquier manera podremos entrar y salir de modo edición al fsm pulsando tab.

Podemos entrar en modo edición y utilizar las herramientas de selección mejoradas de este modo. Luego al salir, aparecerán resaltadas las caras cuyos vértices hayamos seleccionado antes.

Para ayudarme a seleccionar las partes mejor, yo utilizo el siguiente método:
1. En la vista lateral selecciono los vértices de la parte posterior de la cabeza.
2. Creo un grupo de vértices, le pongo atrás por nombre y le asigno estos vértices. Puedes probar que la asignación haya sido correcta pulsando el botón select/deselect.

Figura 2. Creamos un grupo de vértices para ocultar vértices.

3. Salgo de modo edición (volviendo a fsm) y oculto las caras pulsando h. Si lo hiciera en modo edición se ocultarían también las caras aledañas a los vértices del contorno de la selección.
4. Vuelvo a modo edición y deselecciono todo.
5. Vuelvo a fsm y ahora selecciono todas las caras visibles pulsando a. Observar que las caras que antes oculté, permanecen ocultas a pesar de haber salido del modo.


Figura 3. Ocultamos las caras en fsm.

6. Vuelvo a modo edición. Esta vez se encuentran seleccionados solos vértices de las caras que seleccione, observar que a en el paso anterior no selecciono caras ocultas.
7. Creo ahora un grupo de vértices con nombre frente por ejemplo, y le asigno estos vértices. Existirá un contorno de vértices que pertenecen a ambos grupos ahora.

Figura 4. Nuevo grupo de vértices. Observar que los vértices centrales pertenecen a ambos grupos.

¿Para que todo esto? Ahora podremos ocultar la nuca del personaje para que no moleste cuando queramos seleccionar vértices en la vista frontal y viceversa.

Ahora para trabajar con los vértices de la vista frontal haremos lo siguiente.
1. Seleccionemos el grupo atrás. Pulsemos select.
2. Seleccionemos el grupo detrás, pulsemos deselect. Esto hará que la línea en común que tienen ambos grupos sea eliminada de la selección. Un select swap no funcionaría porque los vértices del límite que estén compartidos entre los grupos quedarían fuera de la selección.
3. Pulsemos h para ocultar los vértices seleccionados.

Figura 5. Los grupos de vértices en acción.

Ahora, hemos podido ocultar las caras posteriores sin perder ningún vértice de la parte frontal.

Alternativamente podríamos hacer esto otro:
1. En modo edición seleccionamos los vértices del grupo atrás.
2. Vamos a fsm y ocultamos las caras.
3. Todavía en fsm, pulsamos a para seleccionar las caras visibles.
4. Volvemos a modo edición y ahora sí pulsamos swap select para invertir la selección.
5. Ahora pulsamos h y otra vez hemos ocultado los vértices de las caras posteriores sin tocar los de la parte frontal.

Usando las herramientas de selección del modo edición (Control + Alt+bir para seleccionar Edges, shift+r para seleccionar loops de caras) podremos ayudarnos para seleccionar los contornos de los ojos, mejillas, mentón y zonas próximas. Iremos seleccionando aquellos vértices que estén en sectores de mapeado similar. Por ejemplo, la nariz podría adecuarse bien a un mapeado esférico, mientras que el cuello seguramente funcionara mejor con un mapeado cilíndrico. Para las zonas de los ojos y mejillas, quizás lo mejor sea un mapeado según la vista de la ventana.

Figura 6. El grupo de vértices de la nariz.


Figura 7. El grupo de vértices de la cara se generó a partir del grupo delante. Se omitieron la nariz y los labios que están en grupos separados. En la vista en fsm a la derecha se ocultaron las caras.

En fsm, ocultaremos estas caras. Siguiendo cualquiera de las rutinas descritas arriba, iremos eliminado caras del grupo inicial frente para generar otros grupos en los que progresivamente habrá menos vértices.

Siguiendo este esquema de trabajo es posible obtener un conjunto de selecciones que nos permitan despedazar la malla.

El mapa del tesoro
Cada zona de nuestra malla tendrá un mapeado que será el más apropiado. Para entender un poco mejor que es lo que se ve en el editor UV cuando mapeamos convendrá girar en modo edición (o en modo objeto y luego aplicar la deformación con Control + a) al modelo antes de mapear. Veamos un ejemplo.

He definido un grupo de caras que corresponde a una tira o lonja de caras que incluye los laterales, parte de la zona superior y parte de la zona inferior de la cabeza de moncho.

Esta tira intuitivamente vemos que debería ser mapeada como cilindro. Veamos que ocurre cuando lo hacemos. En fsm pulsemos u para mapear y elijamos la opción cylinder.


Figura 8. El mapeado es cruzado y poco claro para texturizar.

En la ventana UV veremos cómo aparecen vértices y líneas punteadas representando las caras mapeadas. Las caras aparecen cruzándose de forma poco clara, esto impedirá aplicar la textura bien.

Ahora entremos en modo objeto, rotemos la cabeza de modo que el eje del cilindro imaginario se oriente con z, y apliquemos la deformación con Control + a.

Volvamos a fsm y mapemos otra vez. Ahora obtenemos una lonja de caras claramente definidas y sin cruces de aristas.


Figura 9. Esta vez el mapeado es claro y no hay aristas cruzadas.

Parece complicado, pero con un poco de práctica nos daremos cuenta que transformación realizar en cada zona para obtener un mapeado más claro.

En modo edición elijamos el grupo de vértices de la nariz. Volvamos a fsm, y pulsemos u.

En este caso, como dijimos antes, lo más práctico sería elegir sphere. Hagamoslo. (si el mapeado no es correcto y claro, habrá que rotar el modelo y aplciar la deformación como antes. Casi siempre con rotar 90 o 180 grados, se obtiene un mapeado mucho más eficiente).

Las líneas están casi bien exceptuando un cruce en los vértices de dos caras. En esta ventana podemos mover, rotar y escalar vértices con los mismos comandos que en la ventana 3d (pero en 2d). Podemos entonces seleccionar esos vértices mal ubicados y escalarlos simétricamente para que dejen de estar cruzados.


Figura 10. Corrigiendo errores de mapeado.

Nota: a veces para evitar cruces al mapear una zona esférica conviene mapearla por mitades, definiendo dos grupos de vértices, uno por cada mitad. Se seleccionan ambos grupos y se mapean juntos.

Una vez que hayamos mapeado un sector convendrá apartarlo de la zona central de la ventana para mantener prolija la zona de trabajo.

Por ejemplo, seleccionaremos todos los vértices con a o mediante b para activar el border select.

Ahora escalemos los vértices achicándolos y desplacemoslos hacia un rincón de la ventana UV. Tomemos nota Mental del sector donde dejamos los puntos para evitar que se superpongan luego con los vértices de otras zonas mapeadas.

Otra vez en la ventana 3d en fsm, ocultemos las caras mapeadas para mayor comodidad. En modo edición deseleccionamos este grupo, y seleccionemos otro.

La secuencia de trabajo sería entonces como sigue:
1. En modo edición, selecciono el grupo a mapear.
2. En fsm pulso u y elijo el modo de mapeo más apropiado.
3. Si el mapeado no es bueno, rotar el modelo y aplicar la deformación. Siempre rotar 90 o 180 grados, nunca usar valores intermedios.
4. En ventana UV, acomodamos los vértices en una zona libre del espacio disponible.
5. Ocultamos las caras en fsm.
6. De vuelta en modo edición deseleccionamos todo y volvemos al paso 1 eligiendo otro grupo.

Si hemos sido cuidadosos y pacientes, podremos verificar que hemos mapeado toda la malla revelando todas las caras en fsm y seleccionándolas con a.

En la ventana UV deberán aparecer todas las caras mapeadas.

Un error común es pulsar u en modo edición, con lo que en realidad estaremos haciendo un undo y perderemos la selección hecha. Peor aún, en Blender 2.30 esto provoca además un reset del mapeado UV con lo que habría que volver a empezar.

Finalmente acomodamos las caras en una forma más lógica, para indicar cómo habrán de ensamblarse. Para facilitar esta tarea podemos enterarnos de la coordenadas xy de un objeto pulsando la tecla n en el editor UV, rotar y desplazar los vértices. Incluso podemos escalar rebatir en x y en y para obtener una imagen especular (teclas SX y sy) si nos hiciera falta.

Fíjense como fui doblando la lonja de más arriba hasta hacer casi coincidir los vértices con los homólogos de la zona frontal de la cara. Si vamos a aplicar una textura deberíamos fundir estos vértices para evitar saltos en el texturizado. Una forma de hacerlo es seleccionando todos los vértices que confluyen y escalarlos a cero.


Figura 11. fundiendo vértices para evitar saltos en el texturizado.

Ya vendrá el día en que Blender pueda hacerlo por nosotros, pero por ahora hay que apañarselas a mano. En cualquier caso, siempre disponemos de un as bajo la manga que explicaremos más adelante si no es posible juntar más los vértices.

Figura 12. El mapa final.

y ahora qué?
Lo que queda es menos tedioso. Prácticamente ya tenemos todo el trabajo hecho. Ahora necesitamos exportar una imagen de nuestro mapa UV a algún programa de dibujo que permita trabajar con capas (layers) como Gimp, Photoshop o paintshoppro, para poder pintar nuestra textura.

Para ello disponemos de dos métodos:
1. Captura de pantalla del editor UV.
2. Utilizar un script en Python.

El primero de ellos, muy rudimentario, consiste en escalar la ventana UV al máximo posible y capturar la pantalla. Blender puede hacerlo por nosotros con la combinación Control + f3. Nos permite guardar en el formato que hayamos seteado en los botones de render. Desgraciadamente con este método estamos limitados a la resolución de la ventana, por lo que no podremos generar imágenes muy grandes.

Una vez hecho esta operación, deberemos abrir la imagen en el programa de edición de imágenes, y recortar solo la parte cuadrada útil del editor. Es necesario hacerlo porque sino no coincidirá la forma de la textura con la forma del mapa obtenido en Blender.

Luego sí, crearemos capas transparentes para nuestro trabajo utilizando la imagen del mapeado como plantilla en el fondo.

El segundo método, requiere utilizar desde Blender el script uvexport escrito por Martín Poirier (aka theth). Simplemente necesitamos importar el texto en una ventana de texto y pulsar Alt+p para mostrar el GUI. Aquí podemos definir la resolución de la imagen (cuadrada) y el grosor y color de la línea con que se dibujara el mapa.

Figura 13. El script uvexport y una salida típica en tga.

Una vez terminado obtendremos un Targa (. Tga) con una imagen preciosa de nuestro mapa UV, que utilizaremos en el editor de imagen igual que antes, pero sin necesidad de recortar nada y con mayor resolución.

Una pintura
Aún podemos hacer algo más con nuestro mapa, antes o después de exportarlo. Blender ofrece un medio para pintar nuestra textura desde el propio editor UV. Originalmente estaba pensado para retocar una imagen, es por ello que solo se activa si cargamos una imagen en el editor UV.

Como lo que yo en realidad quiero hacer es crear una textura desde cero, preparé en Gimp, una imagen de 256 por 256 totalmente blanca. Esta imagen hará las veces de tela sobre la que pintaré la textura.

Una vez cargada, activaremos el modo face Paint, en el editor UV.

Para poder pintar disponemos de los controles de vertex Paint. Para hacerlos visibles, pulsemos v en la ventana 3d. Ahora podremos cambiar el color, tamaño de pincel, y opacidad del trazo con estos controles y haciendo click con el botón izquierdo del ratón y arrastrándolo, podremos trazar y pintar sobre el fondo blanco que hemos cargado en el editor UV. Si en la ventana 3d activamos el modo texturizado (Alt+z) veremos en tiempo real el efecto de nuestro trabajo.

Figura 14. El modo text Paint en la ventana UV. Para elegir el color y pincel, activamos el modo vertex Paint en la ventana 3d.

Cuando terminemos con el trabajo, podremos guardar la nueva textura generada haciendo click en el botón save.

Utilizando este método podemos parchear la textura si existen áreas inconexas en el mapeado (las brechas que hablábamos antes). Simplemente pintando un poco aquí y, allá podremos subsanar cualquier salto en la textura.

Conclusión
Ha sido trabajoso, ¿verdad? Pues sí. Pero no vayan a creer que un unwrap es menos trabajoso que esto. Existen muchas cosas para mejorar en el editor UV de Blender, como, por ejemplo, snapping de vértices, selección de grupos de caras, resaltado de las caras seleccionadas, pero si trabajamos con paciencia y cuidado podemos resolver casi cualquier situación por nuestros medios.

Si el tiempo lo permite, en la próxima intentaremos un unwrap con ayuda de las herramientas de modelado de Blender y algo de Python.

Hasta la próxima.

Por Claudio Maléfico Andaur
http://www.malefico3dorg.

Ver más sobre el tema y los comentarios en el foro