
Recientemente intenté reutilizar algunas animaciones de Mixamo para aplicarlas a uno de mis personajes en Blender. Sin embargo, me encontré con un problema bastante común dentro de cualquier pipeline de animación: Mixamo utiliza su propio sistema de armatures y mi personaje ya estaba completamente riggeado con una estructura distinta. En un principio pensé en resolverlo utilizando restricciones (constraints) para copiar las transformaciones de una armadura a otra. La idea parecía funcionar correctamente, hasta que apareció un detalle técnico importante: Mixamo maneja las rotaciones utilizando cuaterniones, mientras que mi rig trabajaba completamente en modo Euler XYZ. Esto puede parecer un detalle menor, pero en producción realmente marca una gran diferencia. Los cuaterniones son el estándar en la industria para manejar rotaciones 3D porque evitan problemas clásicos como el gimbal lock, además de ofrecer interpolaciones mucho más suaves durante las animaciones. Por otro lado, las rotaciones Euler son más intuitivas para muchos animadores y suelen utilizarse bastante en rigs personalizados o proyectos antiguos. El verdadero problema comenzó cuando descubrí que mi personaje ya tenía varias animaciones creadas utilizando Euler XYZ. Cambiar el sistema de rotación manualmente implicaba corregir curvas, keyframes y orientaciones de huesos en prácticamente toda la librería de animaciones. Frente a este escenario solo tenía dos alternativas:
- Corregir todas las animaciones manualmente, fotograma por fotograma.
- Automatizar el proceso mediante scripting.
¿Por qué ocurre este problema?
Cuando importamos una animación desde Mixamo, Blender genera automáticamente los huesos utilizando rotaciones en modo Quaternion (WXYZ). Esto significa que cada keyframe almacena la rotación utilizando cuatro componentes matemáticos en lugar de los tres ejes clásicos de Euler. El inconveniente aparece cuando intentamos transferir esa animación a un rig que trabaja bajo otro sistema de rotación. Aunque visualmente ambas armaduras puedan verse similares, internamente Blender interpreta los datos de manera completamente distinta. Esto provoca problemas como:- Rotaciones inesperadas.
- Saltos entre keyframes.
- Interpolaciones incorrectas.
- Desalineación de huesos.
- Pérdida parcial de la animación.
Desarrollando la solución en Python
Blender cuenta con una API increíblemente potente que permite automatizar prácticamente cualquier tarea dentro del software. Aprovechando esto, decidí crear un script capaz de recorrer automáticamente todos los huesos de una armadura y convertir el modo de rotación sin perder la información de animación. El objetivo principal era:- Convertir automáticamente los huesos de Quaternion a Euler.
- Preservar los keyframes existentes.
- Mantener la integridad de la animación.
- Evitar correcciones manuales innecesarias.
Creando el Add-on
Una vez que el script comenzó a funcionar correctamente, el siguiente paso fue convertirlo en un complemento instalable para Blender. La ventaja de crear un add-on es que permite reutilizar la herramienta fácilmente en cualquier proyecto sin necesidad de copiar scripts manualmente cada vez. Además, otros usuarios que trabajen con retargeting de animaciones o pipelines híbridos entre Mixamo y rigs personalizados pueden beneficiarse directamente de esta solución. Repositorio en Github:https://github.com/RichardCollao/RotationConvert
¿Cuándo puede ser útil este add-on?
Este tipo de herramienta puede ahorrar muchísimo tiempo en situaciones como:- Transferencia de animaciones entre rigs distintos.
- Conversión de proyectos antiguos.
- Integración de animaciones descargadas desde Mixamo.
- Corrección de incompatibilidades entre sistemas de rotación.
- Automatización de pipelines de animación.