morphing 3d geometry · 2015-06-18 · tipos de morphing (geometría 3d) • en el morphing de...
TRANSCRIPT
MorphingPROGRAMACIÓN DE TARJETAS GRÁFICAS
Que es el morphing?
• El Morphing es una técnica que se
utiliza en gráficos por ordenador para
conseguir un efecto de transición entre
un objeto o imagen y otro distinto.
Que es el morphing?
• En 1988 aparece en la película “Willow” el
primer morphing, con la transformación de
una de los personajes en distintos animales
(cabra-avestruz-tigre…).
• De modo que se van interpolando las
formas de una a otra creando un efecto
de metamorfosis.
Tipos de Morphing (imágenes)
• Trata de la interpolación de una
imagen en otra a partir de puntos
clave (similitudes de color o forma),
que con una duración y velocidad
consiguen un tipo de transición.
Tipos de Morphing (Morph Targets)
• El morph target es la deformación de una forma dada.
• Se utiliza para simular expresiones faciales en videojuegos, películas…
• Se hace la interpolación de una expresión neutral a otra y viceversa
• De esta forma se consigue un movimiento más natural
• https://www.youtube.com/watch?v=AXba8B739mg
Tipos de Morphing (geometría 3d)
• En el morphing de geometría, se recoge la malla de vértices de una figura geométrica y se interpolan con los de otra.
• De esta forma modificamos la geometría inicial convirtiéndola en otra.
Ejemplo Práctico
• Tenemos las posiciones y normales de los vértices de una geometría.
• Lo que queremos es convertirlos en un cubo, que es una geometría sencilla y conocida.
• Desde el fragment shader, modificamos los vértices de la geometría en función de la variable uBlend.
//VERTEX SHADER
in vec3 aPosition;
in vec3 aNormal;
const float SIDE = 0.5;
void main()
{
vec4 vertex = vec4(aPosition, 1.0);
vertex.xyz *= 4./length(vertex.xyz); //multiplica por 4/longitud del vector en cada caso
vertex.xyz = clamp( vertex.xyz, -SIDE, SIDE ); //limita los vertex a size y -size
vec3 tnorm = normalize( uNormalMatrix * aNormal );
Ejemplo Práctico
float light = max(dot(uLight.intensity, tnorm), 0.0);
if (light < 0.125)
light= 0.125;
vLightIntensity = light;
vColor =vec4(tnorm,0.0);
gl_Position = uModelViewProjMatrix * mix( vec4(aPosition,1.0), vertex, uBlend );
}
//FRAGMENT SHADER
void main()
{
fFragColor =vec4(vLightIntensity*vColor.rgb,1.0);
}
Ejemplo Práctico
Ejemplo Práctico
• Eliminando la función clamp() del programa anterior, eliminamos la restricción y podemos generar una esfera, aunque no es perfecta.
Ejemplo Práctico
• Podemos ver que hemos desplazado los vértices pero no están organizados de forma correcta.
• Algunos han quedado acumulados y otros los hemos estirado.
• Para evitar esto deberíamos reconstruir por partes el modelo
Problemas
• Para hacer morphing de una geometría compleja a otra también compleja que sean distintas, es necesario un calculo de la interpolación minucioso (no podemos usar solamente la función mix).
• Además es necesario que el número de vértices sea el mismo en los 2 modelos, ya que pueden salir deformaciones.
• Así como los materiales y texturas también deben ser las mismas.
Ventajas
• No se necesita aplicar físicas, solo cálculos de interpolación.
• Se consiguen buenos efectos (ej. expresiones faciales en personajes videojuegos).
• Coste de ejecución bajo.
• Deformación fácil de controlar
• Ya existen librerías y programas que hacen transparente el proceso (ej.Cinema4D).
Referencias
• Graphics Shaders: Theory and Practice. 2nd Edition
• GPU GEMS Chapter 4.
• https://www.shadertoy.com/
• http://web.mit.edu/manoli/morph/www/morph.html
Gracias por vuestra atención!