Captura de movimiento low-cost

Programando un motor 3D desde cero - Brakeza3D

Captura de movimiento low-cost

Buenas a tod@s!. El otro día paseando por mi ciudad, pude encontrar en un escaparate de una tienda se segunda mano dos viejos Kinect 360 y no pude evitar la tentación de comprarlos para testear el rendimiento de estos aparatos en su funcionalidad de skeletal tracking.

Un dispositivo profesional de Motion Capture, puede rondar tranquilamente los 10.000k en sus soluciones más económicas. Obviamente, estamos muy lejos de esa inversión para nuestro propósito, más bien amateur. Es por ello que hoy vamos a explicar como habilitar un sistema de Motion Capture casero pero funcional por poco menos de 100€.

Recomiendo echar un vistazo al artículo de “Animando mallas en 3D”, donde repasamos al detalle el concepto de hueso, herencia de los mismos y cómo estos deforman una malla.

¿Tiene sentido el motion capture casero?

Hoy en día existen impresionantes herramientas de animación, especialmente, las relativas a la animación de bípedos humanos, léase Motion Builder o IClone o directamente hay multitud de librerías de animaciones (BVH), donde descargártelas, por ejemplo,  Mixamo de Autodesk, por lo que tiene sentido preguntarnos si merece la pena usar motion capture o no.

Es por la existencia de estas herramientas específicas, por lo que yo no recomendaría la utilización de un sistema de mocap casero exclusivamente, ya que generan otros tipos de problemas. Principalmente hay que tener en cuenta que el motion capture NO nos evita el tener que intervenir y manipular dicha animación para corregir las imperfecciones del sistema de grabación. Por tanto al final es necesario un animador (o un mínimo de conocimientos en animación), ya sea para limpieza de la animación o para la corrección del a misma. 

Sin embargo puede ser una muy buena herramienta de bocetado, ya sea para partir de una animación base que ir mejorando, o para transmitir a un animador profesional la idea de lo que se pretende, es un buen punto de partida.

Repasando un poco de historia

El primer dispositivo Kinect vio la luz en 2010. Mucho ha llovido desde entonces, tanto que ahora mismo Kinect es un producto deprecado por Microsoft, que ha evolucionado esta tecnología hacia sus Azure Kinect. En todo este tiempo hemos visto el lanzamiento de una versión 2.0 del dispositivo, en la que se producía una gran mejora en la precisión de la captura y la salida al mercado de otros dispositivos similares (léase Intel RealSense). 

En definitiva, Kinect es un dispositivo que ha ido perdiendo fuerza progresivamente en el mundo de las consolas, pero que sin embargo ha ido ganándose el respeto en la comunidad desarrolladores indie gracias a sus múltiples posibilidades. Es en este punto donde podremos encontrar un gran ecosistema de software que trabaja con el SDK de Kinect.

Open NI

OpenNI, acrónimo de Open Natural Interaction, es una organización sin ánimo de lucro impulsada por la industria centrada en la certificación y mejora de la interoperatibilidad de la interfaz natural de usuario y la interfaz orgánica de usuario para dispositivos de interacción natural.

Sobre el driver OpenNI se han implementado aplicaciones de alto nivel que ofrecen funcionalidades muy interesantes, para el caso que nos interesa: Skeletal tracking. La instalación de openNI incluye numerosos ejemplos de las posibilidades que ofrece este driver.

Ni-Mate

Los chicos de Delicode han implementado este sencillo pero potente software que nos permitirá compartir la información capturada mediante el sensor Kinect a través de un servicio web local. Cabe destacar que Ni-Mate es compatible con Intel RealSense y otros dispositivos tipo LMC, del que hablaremos más tarde.

La instalación de éste software, ya incluirá la instalación de los drivers openNI, por tanto los pasos se reducen a simplemente instalar Ni-Mate y asegurarse de configurar el dispositivo Kinect correctamente. En cuestión de minutos estaremos en disposición de ver nuestro skeletal tracking funcionando a través del visor de Ni-Mate.

¿Y ahora qué?

Bien, tenemos un skeletal tracking funcionando en un software de terceros con un rigging que no hemos hecho nosotros, así que… ¿por donde empezar?

Lo más probable es que tus modelos ya dispongan de un rigging, con su propio sistema de huesos y/o dependencias, por lo que es imposible pensar que podamos aplicar, sin magia de ningún tipo, las transformaciones capturadas del kinect directamente a nuestros modelos. Resumiendo: El skeletal tracking ofrecido por Ni-Mate, viene ajustado para unos huesos concretos y exactos.

Asi que una parte del trabajo consistirá en mapear los huesos del sistema de skeletal tracking hacia nuestro sistema de huesos en animación. Posiblemente esta sea la más ardua labor, aunque tomaremos un atajo que veremos más adelante.

Integración con Blender

Con la idea clara del mapeo de huesos que debeos realizar, el siguiente objetivo será el integrar físicamente la lectura de Ni-Mate contra el software de animación que estemos usando, en mi caso Blender. Para ello haremos uso del plugin que ofrece Ni-Mate para Blender, el cual no es más que un sencillo script de Python que captura los datos X, Y, Z de cada “joint” definido en el skeletal tracking accediendo al servidor web local que levante Ni-Mate y lo lleva a una escena Blender.

En este punto podríamos ver la representación del skeletal tracking directamente en nuestro Blender, aunque todavía no estamos en disposición de capturar nada, ya que los elementos creados por el plugin de Ni-Mate, son objetos tontos que no hacen nada por si mismos, más que actualizar su posición/rotación según lo que le llega del web-server.

Es ahora cuando hemos de armarnos de paciencia y mapear cada objeto creado por el plugin Ni-Mate contra nuestros huesos. Por suerte Ni-Mate ofrece un sistema de nombres muy clarificador para cada hueso, por lo que no será dificil encontrar el hueso homólogo en nuestra armadura. Así sucesivamente iremos mapeando cada hueso, aplicándole la translación y rotación del joint de Ni-Mate que corresponda.

Concretamente en Blender utilizaré un “modificador” para copiar la translación y otro para la rotación, es decir, dos modificadores por cada hueso que quiera manipular.

Una vez hayamos terminado, y si todo ha ido correctamente, deberiamos de poder ver nuestra armadura sincronizada con los elementos creados por Ni-Mate (los cuales ya podríamos ocultar para trabajar cómodamente).

Atajando que es gerundio

Como os podéis imaginar, alguien en el mundo ya ha caminado por este sendero antes que nosotros, asi que no será dificil encontrar algún rigging decente mapeado contra el de Ni-Mate. Concretamente éste es el mejor que he encontrado, disponible para Blender:

Gracias a este trabajo, dispondréis de una armadura bípeda 100% mapeada contra los huesos de Ni-Mate, sin esfuerzo 🙂

Resultado

A continuación os enseño el resultado de haber aplicado lo escrito al modelo del mítico zombie del Quake:

 

Leap Motion Controller

El Kinect 360 no dispone de precisión suficiente para hacer una captura del movimiento de dedos de manos (si el v2) y curiosamente era el caso que me interesaba profundizar, asi que en un alarde de derroche económico sin sentido, decidí comprar un dispositivo Leap Motion Controller (90$), el cual no deja de ser un Kinect más moderno con esteroides.

La teoría para integrar un LMC con Blender es exactamente la misma que para Kinect, a través de Ni-Mate. Al igual que sucede con las armaduras del skeletal tracking, deberemos mapear cada hueso contra nuestra armadura, pero en esta ocasión, serán los huesos de una mano (falange, metacarpio…)

 

LMC dispone de APIs de integración con los lenguajes más comunes, además existen utilidades Web capaces de guardar las animaciones en un JSON bastante manejable. Recomiendo echar un ojo a LeapJS, una de las más evolucionadas.

Resumen

Presentamos dos dispositivos económicos a través de los cuales podrás hacer motion capture para tus proyectos. Además enumeramos los drivers/softwares que lo hacen posible además de mostrarte algún ejemplo del resultado.  Nos vemos en la próxima!

 

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.