Rig Facial de “Virginia”
En el blog de Mercator Project escribí un post sobre el rig facial de Virginia, uno de los protagonistas.
Aquí copio las explicaciones y el enlace al video
Virginia’s Facial Rig from Mercator Project on Vimeo.
Despues de probar varias cosas para lograr un rostro lo suficientemente expresivo y facil de animar, terminé volviendo a las bases,esto es, usar Shapekeys, Blendshapes, o como le digan. La creacion de los shapekeys en sí no es ningún secreto aunque lleva bastante tiempo, solo hay que tener cuidado de no olvidar que las combinaciones entre ellos es aditiva.
Me basé en el libro de Jason Osipa “Stop Staring” que creo es la Biblia para este tipo de trabajo. Llevar a Blender (2.49) el sistema de control de Osipa me llevó algo de tiempo. Este sistema se basa en que el eje vertical de un slider tipo joystick modula la intensidad de una expresión construida con dos shapekeys (lado izquierdo y derecho por ejemplo) mientras que moviendo de izquierda a derecha cambiamos la mezcla favoreciendo a uno o a otro. Esto se llama un “control asimetrico”.
Para lograrlo recurri a un Pydriver. Las curvas de los shapekeys las hice todas iguales: lineales empezando en 0,0 y terminando en 1,1. El driver python consiste en una unica llamada a una funcion almacenada en un archivo pydrivers.py, que se encarga de obtener un valor de esa curva apropiado dependiendo de la posición del hueso controlador.
Cuando vamos hasta arriba por el centro, los shapekeys 1 y 2 quedan ambos al 100%. Si ahora nos movemos de izquierda a derecha, uno de los shapekeys seguirá al 100%, mientras que el otro disminuirá gradualmente. Cualquiera sea la mezcla, al bajar verticalmente se mantendrá la proporción izquierda-derecha que hayamos establecido.
Para abajo ocurre lo mismo con los otros dos shapekeys. Este sistema permite simplificar la cantidad de controles. Aqui pueden ver el sistema aplicado a los shapekeys de Virginia (pobrecita sin cabello).
La función definida en el pydrivers.py, necesita el nombre del armature, el nombre del hueso que controla, luego un codigo indicando el “cuadrante”, y finalmente los limites minimos y maximos para el movimiento del hueso. Si queremos un control muy “sensible” pondremos un valor pequeño para el desplazamiento.
Aqui pueden descargar el archivo de ejemplo con el pydriver para que lo usen en sus propios rigs. Hasta la proxima !


February 20th, 2010 at 7:26 am
Gracias malefico, se ve muy interesante, una buena oportunidad e empezar a ver como esta esto de los pydrivers.
May 17th, 2010 at 1:06 pm
Hola Maléfico. Vi este pydriver hace un tiempo y ahora me gustaría implementarlo. Me resulta interesante y útil… pero estuve horas intentando entender cómo funcionaba y me tomé el atrevimiento de modificarlo. Posteé en Blenderheads para ver qué se puede hacer.
http://www.blenderheads.org/forums/es/viewtopic.php?f=5&t=173&start=0
Un abrazo y gracias.
May 18th, 2010 at 8:29 am
Hola malefico, me parece interesante tu pydriver.
pero una pregunta. al descargarlo como lo instalo?
sencillamente lo llevo a la carpeta script del blender o como deberia? para poder aplicarlo a un personaje?
muchas gracias espero tu pronta respuesta amigo. saludos.
May 20th, 2010 at 9:14 am
noel: lo unico que tenes que hacer es importar el archivo pydrivers.py a tu archivo de personaje, y luego configurar los sliders que vayas a usar con el pydriver como esta en el ejemplo (fijate en la ventana IPO).
Mario: no deja de ser curioso que modifiques algo que no terminas de entender jejejeje
May 20th, 2010 at 10:35 am
Una explicacion mas detallada de como funciona esto. Para empezar DEBE HABER CURVAS IPO PARA LOS SHAPEKEYS. Estas curvas deben ir de (0,0) a (1,1).
El driver cumple una unica funcion que es restar la influencia del par complementario, cuando llevo a izquierda y derecha. Si estoy en el medio, debe proporcionar una mezcla 100%-100% (Si fuera una sonrisa, tendria que dar la sonrisa completa).
Como las curvas son todas positivas, lo que hacemos es crear un factor a traves del driver, que al multiplicarlo por el valor de la curva (positivo siempre) nos de el valor que debemos usar para la influencia del shapekey (positivo o negativo segun sea el caso).
Por ejemplo, si muevo el hueso en la coordenada negativa X, estando en la coordenada Y=+1, lo que intento lograr es que se dispare el shapekey 1, pero al mismo tiempo quiero reducir la influencia del shapekey 2, y claro, mantener en 0 las influencias del 3 y el 4.
Entonces calculo un factor igual a Factor = desplazamiento en X / delta desplazamiento, es decir que Factor seria la proporcion de desplazamiento sobre el desplazamiento maximo permitido.
Si el hueso se mueve en la coordenada X negativo, debo corregir el signo de este valor, porque la IPO es positiva (y va de 0 a 1) y entonces si quisiera buscar un valor que le correspondiera, no encontraria ninguno. Para esto sirve el “sector” en la llamada del pydriver.
Entonces, recapitulando, si muevo 0.6 en X negativo (X = -0.6) , con Y =1, el pydriver del shapekey 1 llama a python y calcula Factor = (-0.6) / (0.0 - (-1.0)) = -0.6 (en este caso los valores maxX = 0, minX = -1.0, maxY= 1.0, minY = 0.0) con lo que queda X = -0.6, Y= 1.0
Estos valores maximos y minimos son referidos al desplazamiento real que tendra el hueso de control.
Luego usa la funcion Math(X,Y), para determinar cual es el valor a devolver con el driver. Si Y es negativo no hace nada, mejor dicho devuelve Value=0, si Y es positivo, entonces se lo asigna a Value.
A continuacion, como X es negativo, no hace nada (con lo que Value = Y = 1.0) y eso devuelve. Esto significa que la intensidad del shapekey 1 permanece inalterada = 1.0.
Simultaneamente, para el pydriver del shapekey 2, los calculos serian los mismos excepto que X= 0.6 (sector 1 corrige signo del desplazamiento) con lo que sera math(0.6, 1.0)
A continuacion, como esta vez X es positivo, entonces se lo resta a 1 y este resultado lo multiplica por el anterior de Y. Significa que el valor para X=0.6 sera, Value = Value * (1 - X) = 0.4 (40%) que es la influencia que debe tener el shapekey2 en realidad.
Si no hubiera habido desplazamiento en X, el Value seria = Y = 1.0 (100%) para ambos shapekeys.
Espero que ahora se entienda mejor :).
Saludos.