16 dic. 2013

Motion Capture para animar personajes en Blender 2.69

En este tutorial mostraré cómo hacer para animar un personaje usando el Motion Capture de Blender. Para comenzar, habrá que tener el personaje ya con su Armature lista para el trabajo. Para aprender cómo asociar una armadura a una malla y darle movimiento hay muchos tutoriales disponibles (al final de esta entrada están los link a muchos de estos tutoriales los cuales seguí).
Lo que sí, como lo que haremos será animar el personaje siguiendo los movimientos reales de un humano, por ejemplo, sería conveniente tener un número reducido de marcadores para ahorrar trabajo. De modo que habrá que asociar los huesos usando Inverse Kinematics. De esta manera, tendríamos sólo un marcador por cada pierna y brazo (cuatro en total) y otro para el tronco. Es decir que con cinco marcadores bastarán para animar un personaje. Luego los movimientos individuales de los demás huesos se podrán hacer a conveniencia de la manera tradicional.


Comienzo del tutorial

Entonces, para comenzar ya tenemos nuestro personaje totalmente articulado como podría ser el del siguiente ejemplo:


Como se ve, hay algunos huesos con IK tales como los que parten del talón y de las muñecas. También, para evitar que el personaje realice movimientos no naturales, habrá que ponerle limitantes a los huesos. Esto se hace desde las opciones de Bone. Y se pondrán cuántos grados se podrá girar cada hueso en tres dimensiones. Si estas limitaciones no se colocan, cuando el marcador se mueva podrían ser que algunos huesos giren de manera inesperada.

Agregando limitaciones a los huesos en Blender

Movimiento capturado o actuación B

Ahora llega el momento de colocar los marcadores al modelo humano (o cualquier objeto que queramos capturar su movimiento) y largarse a la actuación. Para la mayoría de los casos requeriremos, como se mencionó, de cinco marcas. Aquí, sin embargo usé cuatro dado que la mano izquierda llevaba un maletín que no requería demasiados movimientos. Un marcador de alto contraste es lo que se necesita, entonces un fondo negro con un círculo blanco funcionará muy bien:

Marcadores para Notion Capture en Blender
Es muy importante que el marcador se vea la mayor cantidad de tiempo posible para poder hacer el Tracking más rápido y natural. En los momentos en que el marcador sea tapado, habrá que intuir por dónde va y hacer manualmente el trabajo



Una vez que tenemos los marcadores con su recorrido, iremos a la opción Reconstruction y le daremos a Link Empty to Track. Ahora nos dirigimos a Default y notaremos los Emptys asociados. 
Algo importante a tener en cuenta es que estos Emptys o Tracks difícilmente coincidan con los huesos que queramos asociar a ellos. De modo que lo que haremos será asociar algún objeto a estos emptys (por ejempo unas esferitas) y ellas a los huesos. Con estos ganamos doblemente. Primero, una vez que el hueso se asocia al empty o a otro objeto ya no se puede manejar manualmente, con lo que no podremos corregir movimientos malos y la otra es que las esferas, al ser libres, se pueden colocar justo en la posición requerida por el hueso y además se pueden animar. Con lo que tendríamos un personaje muy versátil el cual estaría animado desde el motion capture o también manualmente mediante el movimiento de las esferitas y de los demás huesos individuales:


En la imagen se aprecia esto. Las esferas rojas coinciden perfectamente con los huesos asociados mientras que los emptys del Motion Capture, no.

¿Cómo asociar los huesos al movimiento capturado?

Hay al menos dos maneras de hacerlo. Si es un hueso que es IK, en la opción misma de Inverse Kinematics le pondremos la guía en Target. En la imagen dice “Guía pierna derecha” lo que significa que allí está asociada la esfera que mueve la pierna derecha. A la esfera, a su vez, la emparentamos con el track correspondiente con CTRL+P


De esta manera ya tendremos un hueso padre emparentado al Motion Capture. Como se ve allí, donde dice Influence podremos bajarle el valor para que el bone se mueva menos o más según nos convenga.
La otra manera es emparentar un hueso simple al track. Para ello, seleccionaremos el hueso y le agregaremos una Constraint Copy Location

Inverse Kinematics en Blender
Nuevamente aquí tendremos la Influence para hacer que el objeto mueva más o menos nuestra armadura a conveniencia. Porque hay veces que al agregarle la constraint, el hueso se contrae bruscamente como dándole una especie de espasmo, haciendo el movimiento un poco forzado. Bueno, aquí al bajarle la influencia solucionamos eso. En el siguiente video se ve todo esto puesto en práctica. 



El personaje por momentos se bambolea bastante, quizás hasta pareciera que está bajo los efectos etílicos. Pero a no alarmarse, esto ocurrió porque yo al actuar exageré demasiado los movimientos y al hacer la captura de movimientos el alien copió exactamente lo que hice.


Otro punto fundamental a tener en cuenta es que podemos convertir a Keyframes por ejemplos estos emptys que provienen del motion capture. Esto es muy útil a la hora de llevar los personajes a otros archivos o para desvincular el tracking de la escena. Para hacer estos marcamos el Track en cuestión y vamos a Object, Animation, Bake Action. Nos preguntará el número de fotogramas que queramos transformar a keyframes y cada cuántos frames queremos que coloque un Key. Si dejamos el 1, generará tantos Keyframes como fotogramas tenga la acción.


Como se ve, se genera un Loc Rot Scale. Luego podemos borrar lo que no se necesite para restar peso al archivo y trabajo al pc.
Y esto es todo, espero que haya servido y como siempre cualquier pregunta o sugerencia será muy tenida en cuenta.


Ahora sí me despido. Hasta la próxima.

10 comentarios:

Pablo Flores dijo...

Hola como estás?
Para capturar los movimientos que utilizas? un kinect o solo la web cam?

Mariano Miguel L. dijo...

Hola, utilicé una cámara HD. El kinect todavía no he llegado a comprarlo. ¡Saludos!

Jesus Acevedo Contreras dijo...

Te felicito. Eres el primero que postea sobre cómo hacer mocap para blender. Tengo una idea algo vaga sobre cómo hacerlo con más cámaras, pero los Constraint no me acompañan sobre cómo relacionar un marcador sobre dos coordenadas.

Mariano Miguel L. dijo...

Hola Jesús. Ante todo muchas gracias. Resultaría muy interesante lo que comentas, el hecho de capturar con más de una cámara dado que se ahorraría tiempo y además se ganaría perfección en los movimientos. Pero claro, habría que hacer que el marcador trabaje con la otra coordenada. Voy a investigar y cualquier novedad la posteo. ¡Saludos!

Jesus Acevedo Contreras dijo...

De nada. Quizás este video aclare un poco lo que propongo, claro que el autor lo toma de referencia para los movimientos, no como un calco exacto. Aunque me atrevería a llevarlo más allá y hacerlo preciso (fijate que uno de los videos lo reescaló, dado que la distancia era mucho mayor y las camaras no estaban trianguladas en 90º. En su lugar, usaría un frame de cada video y haría "tracking" con esos dos frames para calibrar la posición exacta de las camaras.) https://www.youtube.com/watch?v=qm6UIclnbdM&index=40&list=LLFsgUm8x5wqD3PZlJ9_aqng

Mariano Miguel L. dijo...

Entiendo. Se me ocurre, para comenzar a probar, usar dos cámaras como dices, a 90º y hacer los dos tracking. Luego generar los emptys y hacer que todos los emptys frontales copien el movimiento lateral de los otros generados por la otra cámara, entonces tendíamos el movimiento 3D de cada marcador.

Mariano Miguel L. dijo...

Hola Jesús, a partir de tu último comentario en el formulario creo entender tu idea. Voy a ensayar la cosa a ver si sale (no te contesté al mail porque olvidaste adjuntarlo) Saludos!

Adrián dijo...

buenas en primer lugar muchísimas gracias por compartir tus ideas y experiencia con nosotros me a ayudado muchísimo , pero tengo un problemilla como exponen por arriba hay alguna forma en blender ahora que esta la version esta mas avanzada en hacer un traking con dos camaras para poder sacar no solo la cordenada "X" o "Y" Sino tambie la "z" de los traks? hice un movimiento de golpeo de espada pero me falla que el track no diferencia entre detras y delante seria estupendo poder decirle al track que tambien sigua el movimento de una camara de perfil para sacar la procundidad del movimiento un saludo y gracias por todos tus esfuerzos

Mariano Miguel L. dijo...

Hola. Muchas gracias!
La verdad que estuve intentándolo desde aquellos comentarios de arriba y no lo logré. Pero quizás algo me está faltando entender en el cuadro de aplicaciones de Motion Capture. Todavía no experimenté con todo lo que allí aparece. Donde dice marcadores 3D, por ejemplo. Voy a seguir intentándolo. Lo que sí se puede hacer es lo siguiente: Captura el movimiento con dos cámaras, la de adelante moverá un empty en dos coordenadas, por ejemplo XZ, y la del costado (a 90º más o menos), hacer nuevamente el tracking y permitir que ese marcador sólo se mueva en el eje Y.. Luego pasamos todos los marcadores a keyframes y al que posee las dos coordenadas le agregamos una constraint copy location del otro (se me ocurre) o lo emparentamos. No sé si se entiende lo que quiero decir.
¡Saludos Adrián!

Adrian dijo...

buenas , puess creo que si le e entendido si consigo algo lo subo por aqui para que lo veais , gracias por todo