Dentro del workflow habitual de aplicaciones 3D como en videojuegos existe un paso algo desconocido llamado "Desajuste de coordenadas de mapeado" que consiste en generar una serie de coordenadas en nuestro modelo que nos permiten definir que poligonos de nuestro modelo se pondrán en que partes de nuestra textura.
En el caso de WPF es un paso muy importante ya que si nuestro modelo tiene alguna textura interactiva (Viewport2DVisual3D) es muy normal que queramos definir en que parte del modelo ha de representarse el Control de Usuario.
Vamos a definir primero unos conceptos:
- Coordenadas de Textura (o Coordenadas de Mapeado): Se trata de información intrínseca a la geometría del modelo y esta definida por puntos de 2 Dimensiones (Point). (en el caso de UV, que es el que soporta WPF)
Los puntos definen un espacio comprendido entre 0 y 1 es decir, habrá puntos que sean 0,1 o 1,0 o 0.3,0.6 pero nunca 2,0 o 3,5. Tened en cuenta que lo que marcan estos puntos, es una posición relativa en el bitmap de la textura. Aunque WPF se tragará sin problemas una posición mayor a 1, siempre "estirará" las coordenadas hasta hacerlas unitarias.
Si las coordenadas son negativas (tipo -1,-0.3) WPF las estirará y mostrará la textura al revés, si el modelo está alojado en un ModelVisual3D. Pero si el modelo es interactivo (Viewport2DVisual3D) la textura no se verá, así que cuidado.
Mi recomendación es que SIEMPRE os aseguréis de que todas las coordenadas están por debajo de 1,1 y por encima de 0,0. Y también que siempre tenéis alguna de las coordenadas siempre en el borde, es decir que siempre haya una en 0,0 y otra en 1,1. De esta forma WPF no estirará las coordenadas y la textura se verá tal y como esperáis.
De todos modos todo esto lo podemos hacer de una manera visual, asi que no nos pongamos nerviosos y pasemos a explicar...
¿Como se generan estas coordenadas para poner las cosas donde yo quiero?
Pues bien, necesitamos un programa de modelado 3D (Yo uso 3DStudio Max, pero podéis usar igualmente Blender que es gratuito, Maya etc...).
Abrimos el Modelo y seleccionamos en la pestaña de modificadores UnWarp UVW y le damos al botón editar. Veremos una ventana con la representación de las coordenadas de mapeado (UV) tal que así.
Como podemos ver en la ventana Edit UVW hay un montón de puntos sin mucho sentido aparente. Pensad que son puntos son las proyecciones 2D de los puntos 3D del modelo. Ahora expandimos el modificados Unwarp UVW y seleccionamos "Face" y hacemos clic en alguna parte del modelo, vereis que se selecciona tanto en el Viewport o como en la ventana edit UVW. ¿Se entiende ya la cosa mejor?
Ahora por ejemplo seleccionemos la mitad de nuestro modelo (un pato en este caso) y proyectemos las coordenadas a un plano (Si bajáis en el menú de Unwarp UVW encontraréis muchas maneras de proyección) en este caso le daremos al botón "Planar" y viereis como nos proyecta los polígonos a un plano dado (Align Y en el ejemplo).
Ahora id eligiendo partes del modelo y planos de mapeado óptimos hasta que lo defináis entero dentro del cuadrado azul de la ventana Edit UVW. Tened en cuenta que cuanto mas en verdadera proporción sea la proyección, mejor mapeada estará la textura y mejor de verá después.
Bueno yo después de un ratin he conseguido un mapeado de esta manera.
He separado el modelo en 2 partes, el pico y el cuerpo. Y ahora que lo tengo todo listo vamos a photoshopear un poco. Ahora que se que parte de la textura va en cada parte del modelo solo tengo que dibujar y colorear en photoshop una imagen que se ajuste. Debería quedar algo así:
Perfecto! (No es mi mejor textura pero da el pego bastante. Ahora no tenéis mas que importar el Modelo en OBJ, meterlo en Blend y en el Brush del DiffuseMaterial aplicarle la imagen! y listo.
En el próximo post explicaremos como hacer que la textura sea interactiva! Aquí os dejo un proyecto con el pato, el archivo de 3dstudio, el obj y la textura! Ale! a disfrutar!
Patosis WPF Project. 2.5 Mb Aprox.