Skip to content
Ejemplo de Animation

Mecanim: sistema de animación en Unity

Conociendo Unity3D (VI)
1. MakeHuman y Blender: diseño y modelado 3D de personajes
2. Creación de personaje con MakeHuman y Blender para Unity 3D
3. Video: creación personaje para juego en Unity3D
4. Componentes para Físicas en Unity 3D: indumentaria y articulaciones
5. Ejemplo de implementación de Físicas 3D: Cloth y Skinned Mesh Renderer
6. Ejemplo de implementación de Físicas 3D: Hinge Joint
7. Físicas en Unity 3D: Asistente Ragdoll
8. Video: implementación Asistente Ragdoll en Unity 3D
9. Mecanim: sistema de animación en Unity
10. Videotutorial: creación de animación en Unity 3D con Mecanim

Mecanim es el sistema de animación implementado en Unity, para el control de los movimientos de los personajes, y que nos permite de una manera fácil configurar las animaciones disponibles, reproduciéndolas de una forma predeterminada o bajo cierta condiciones que vayan cumpliéndose.

Ya lo mencionamos cuando tratamos la creación de personajes con Make Human y Blender , pero en esta publicación y la próxima (video) veremos su funcionamiento a través de un sencillo ejemplo de animación donde haremos que un personaje salude moviendo su brazo.

Antes de abordar este ejemplo, haremos una breve recopilación a modo de resumen de un aspecto que ya tratamos en aquella publicación: la creación y diseño de un modelo que permita la ejecución de las animaciones diseñadas.

Creación y diseño de un modelo

Para obtener un modelo humanoide para el sistema de animación Mecanim podemos escoger básicamente una de estas opciones:

  1. Crear el personaje fuera de Unity con herramientas auxiliares como hicimos con Makehuman y Blender o utilizando otras opciones disponibles como PoserMixamo, 3ds Max ó Maya  por citar algunas muy conocidas. Las funcionalidades que nos ofrecen estos distintos softwares varían. Unos son más básicos y solo modelan personajes casi ‘preconstruidos’ y otros en cambio son muy potentes y nos permiten partir de cero y exportar proyectos con personajes completamente modelados, con articulaciones definidas (rigging) y malla (skinning). También podemos combinar el uso de varios para realizar las distintas partes del proceso.
  2. Adquirir desde la asset store de Unity modelos ya diseñados, como es el caso del recurso «Raw Mocap Data», ya que se trata de un paquete completamente gratuito, y que podrás importar a Unity con sólo iniciar sesión.

Nosotros para el ejemplo que desarrollaremos en las publicaciones posteriores elegiremos la segunda opción porque nos simplificará mucho el proceso. No obstante, recordamos los procesos necesarios para la creación de un personaje humanoide animado no ‘prefabricado’ antes de abordar nuestro ejemplo:

Modelling (modelado)

Proceso de creación de la malla de un humanoide, a partir de un modelo 3D creado con algún software especializado en esta tarea del os que hemos citado anteriormente. Desde la propia página de Unity, se recomienda tener una serie de aspectos muy en cuenta para su funcionalidad dentro de un proyecto de Unity:

  • Modelar los personajes humanoides en posición de T, para mejorar el ajuste de los polígonos que construyen la malla.
  • Ajustar la malla lo más fiel posible al modelo del personaje, evitando posteriores errores del punto de anclaje del personaje al suelo.
  • Utilizar una topología de malla muy precisa, que permita visualizar una deformación fluida de dicha estructura cuando el personaje sea animado.

Rigging

Proceso que consiste en establecer la lógica de deformación de la malla que construye un cuerpo humanoide, identificando el conjunto de huesos, articulaciones y conexiones que lo forman, para la simulación de movimientos reales. En la propia documentación de Unity recomiendan utilizar algunas de las siguientes convenciones para estructurar el cuerpo humanoide:

  • Caderas (Hips) – espina dorsal (spine) – pecho (chest) – hombros (shoulders) – brazo (arm) – antebrazo (forearm) – mano (hand)
  • Caderas – espina dorsal – pecho – cuello (neck ) – cabeza (head)
  • Caderas – pierna superior (Up Leg)) – Pierna (leg) – pie (foot) – dedo del pie (toe) –  extremo de los dedos del pie (toe_end)

Aquí podemos observar un ejemplo de estructura humanoide que se pueden encontrar en la asset store denominado «Raw Mocap Data»

 

Estructura Humanoide

Skinning

Proceso de asignación de la malla creada al esqueleto del personaje humanoide, mediante la unión de los vértices de la malla a los huesos. Uno de los consejos que nos brindan desde Unity es la realización de animaciones básicas para comprobar el comportamiento de la malla asignada al esqueleto, y visualizar así si se muestra correctamente la malla al animar el personaje. Con estas pautas, es posible ajustar de manera más precisa la malla al esqueleto de personaje, aumentando progresivamente la construcción de animaciones más complejas.

Crear una animación con Mecanim

Como hemos comentado anteriormente para nuestro ejemplo de animación partiremos un modelo ya construido para nuestros personaje. Para ello, utilizaremos el paquete de recursos «Raw Mocap Data» de la asset store de Unity, que nos proporciona un humanoide a modo de prototipo.

Para este personaje diseñaremos una animación que consistirá en la realización de un saludo con el brazo al pasar un determinado tiempo. Aquí puedes ver el resultado final (en la próxima publicación mostraremos el video completo con todo el proceso de creación de la animación que también explicaremos a continuación):

 

Para la creación de una animación, y su posterior implementación como estado del Animator Controller, se realizarán los siguientes pasos:

Seleccionaremos la ventana Animation a través del menú Window > Animation para acceder a esta herramienta:

Menú Animator

Posteriormente elegiremos dentro de la ventana de jerarquía de objetos, el GameObject que se desea animar (en este caso el recurso con extensión .fbx añadido a la jerarquía de objetos de la escena).

Animation Window

A continuación, pulsaremos sobre el icono de grabación, indicando donde deseamos almacenar la animación que se va a crear. Una vez guardada, podremos realizar modificaciones sobre este objeto (traslación, rotación, escalado etc.), quedando registradas todas las acciones. A partir de ahí, tendremos varias opciones para reproducir la animación, desde avanzar frame a frame a reproducirla completamente.

Ejemplo de Animation
Una vez finalizada la animación, podremos arrastrarla dentro de la máquina de estados del Animator Controller y de esta forma, poder configurar la lógica de transiciones entre animaciones.

Creación de un Animator Controller

En primer lugar, deberemos crear un Animator Controller dentro de los recursos del proyecto. Para ello nos situamos sobre la ventana «Project» y realizamos click con el botón derecho del ratón seleccionando el menú Create > Animator Controller.

Crear Proyecto Animator Controller

Una vez creado este recurso, y con la ventana Animator situada en la interfaz de Unity, podremos visualizar la siguiente lógica de elementos:

Ventaba Animator, descripción de elementos e interfaz

A partir del anterior diagrama, se deben tener en cuenta una serie de premisas para comprender las posibilidades de Mecanim:

  • Los tipos básicos de parámetros que se pueden establecer son los siguientes:
    • Int: un número entero.
    • Float: un número con una fracción que representa la aproximación a un número real.
    • Bool: un valor de True o False.
    • Trigger: un parámetro booleano que se reinicia desde el controlador cuando se efectúa una transición.
  • Cuando se disponen de varios estados, es posible establecer cuál será el estado por defecto pulsando sobre él con el botón derecho del ratón y seleccionando la opción «Set As Default». Pasará el estado a color naranja.
  • Se podrán establecer transiciones entre los diferentes estados, definiendo para cada uno de ellos una condición para que se produzca la transición.

En las siguientes imágenes pueden apreciarse dentro del Animator Controller los dos estados añadidos (una animación por defecto, y la animación de Saludo creada en el apartado anterior) junto con sus transiciones, en el que pueden diferenciarse dos parámetros añadidos (tiempoAnimacion de tipo entero y lanzarAnimacion de tipo booleano), y en cuyas transiciones se establecen una determinada condición:

  • Transición de Base Layer.ReposoSaludo -> Base Layer.Saludo: lanzarAnimacion == true
  • Transición de Base Layer.Saludo -> Base Layer.ReposoSaludo: ExitTime = 2.2

Ejemplo estados de la animación
Transición de estado en la animación
Transición inversa en la animación

Por último dentro de la lógica de lanzar la animación de «Saludo», y como parte de los componentes que se definen dentro del GameObject del humanoide, implementamos un script denominado AnimacionSaludo, que se encargará de pasar el parámetro declarado en el Animator Controller a valor true cuando se produzca una determinada condición:

 

En este script hemos definido:

  • Línea 1: se añade de manera automática la dependencia del componente (atributo RequireComponent).
  • Líneas 5 a 10: declaramos una variable de tipo Animator, para inicializarla desde el método Start().
  • Líneas 12 a 14:  dentro del método Update(), se declara e inicializa una variable de tipo entero, a las que se asigna el valor del parámetro tiempoAnimacion del Animator Controller (mapeo clave/valor), y a continuación se asigna el valor recibido como argumento del método GetInteger().
  • Línea 16 a 19: establecemos la condición de que el número de frames actuales debe ser múltiplo del valor asignado en el parámetro del Animator Controller para cambiar el valor del parámetro lanzarAnimacion a true:

Para mayor claridad, en la siguiente imagen se puede apreciar cómo quedaría la estructura de componentes del GameObject Player, además de un breve vídeo con el funcionamiento final de la animación:

Inspector Player

Componente Animator

Para finalizar, se describirán las diferentes propiedades que pueden configurarse dentro del componente Animator asociado al modelo humanoide que iniciará la animación (este componente podrá añadirse a un GameObject seleccionando Add Component > Miscellaneous > Animator):

Propiedad
Función
Controller Referencia al Animator Controller del personaje.
Avatar Identidad del personaje. En el siguiente enlace podrás encontrar más información sobre esta propiedad: http://docs.unity3d.com/es/current/Manual/class-Avatar.html.
Apply Root Motion Si se habilita se controlará la posición del personaje desde la animación, en caso contrario desde un script.
Update Mode Permite establecer si las animaciones interaccionaran con las físicas.
Culling Mode Define que animaciones se reproducirán sin cortes al no ser visibles por los renderizadores. Se pueden establecer los valores Always animate, que reproduce las animaciones sin cortes, o Based on Renderers, en el que sólo se reproducirán las animaciones de los objetos raíz cuando el personaje no esté visible.

 


Volver arriba
Esta web usa cookies para su correcto funcionamiento. No hay cookies de publicidad, aunque algunos de los contenidos mostrados (videos o documentos insertados) están alojados en servicios externos (Youtube, Vimeo, Box...) que sí pueden implementar sus propias cookies.    Más información
Privacidad