# Animaciones

La animación es el arte de dar vida a las cosas. Y no hay mejor manera de hacer que tu escena sea más animada que añadiendo algunas animaciones a tus modelos 3D.

Hay varias maneras de hacerlo: mediante **animación de objetos**, mediante un **rig (animación esquelética)**, o usando **shape keys (animación de morph targets)**.

**La animación de objetos** es la mejor para modelos simples, como una pelota que rebota, un globo giratorio o una silla flotante, y no necesita una armature. Es importante mencionar que la animación de objetos es diferente de **animación de vértices**. En la animación de objetos, el modelo se animará como un todo, mientras que en la animación de vértices cada vértice del objeto puede animarse por separado.

**Las shape keys (también conocidas como morph targets o blend shapes)** son una forma de animación de vértices que está **compatible con el engine de Decentraland**. Son particularmente útiles para expresiones faciales, sincronización labial o cualquier deformación que sea difícil de lograr solo con huesos. Las animaciones de shape keys incrustadas en un archivo glTF/GLB se reproducirán en el mundo igual que las animaciones esqueléticas o de objetos.

Si tienes un modelo más complejo, como una persona, una criatura o maquinaria, entonces necesitarás un **rig**. Un rig no es más que un esqueleto digital que moverá y deformará la Mesh. El proceso de vincular la Mesh al esqueleto se llama Skinning, donde defines qué hueso afectará a cada grupo de vértices y cuán fuerte será esa influencia, asegurándote de que el modelo se deforme de la mejor manera posible.

De cualquier manera, para ambos métodos, todas las animaciones de un modelo 3D deben estar incrustadas dentro de su *glTF* archivo, ya que no puedes referenciar animaciones en archivos separados.

## Creando una animación

Así es como creas animaciones usando Blender.

### Animación de objetos

* Asegúrate de tener la pestaña ***Dope Sheet*** > ***Action Editor*** abierta y haz clic en ***New*** para añadir un clip de animación.
* Renómbralo como quieras y asegúrate de activar ***Fake User*** (el icono de escudo) para que tu animación se guarde.
* Establece un keyframe en el primer frame seleccionando el objeto y presionando ***I***. Luego mueve, rota o escala el objeto y, en otro frame de la timeline, presiona ***I*** de nuevo para establecer otro keyframe con los transforms actuales.
* El frame final de la animación debe ser igual al primero, así que simplemente copia el primer frame y pégalo en el último.

![](https://1216664193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-efdf5b9c23ab8b9fe1c9dba379a9f19927fca580%2F01_object_animation_02.gif?alt=media)

*Creando un clip de animación y añadiendo keyframes.*

### Animación de rig

Para una animación de rig, necesitarás una armature. Si quieres hacerlo tú mismo, consulta [Crear un Rig](https://www.notion.so/686e6f59a1604585b059f990a36b2d55) para obtener instrucciones sobre cómo configurar una armature consistente.

Cuando el rigging está hecho y el Skinning tiene buenas deformaciones, ¡estás listo para empezar tu animación! El proceso es muy similar a la Animación de objetos, pero en lugar de hacerlo en ***Object Mode***, la animarás en ***Pose Mode***.

* Ve a ***Pose Mode*** y asegúrate de tener el ***Dope Sheet*** > ***Action Editor*** abierta y haz clic en ***New*** para añadir un clip de animación.
* Renómbralo como quieras y asegúrate de activar ***Fake User*** (el icono de escudo) para que tu animación se guarde.
* Con el mouse sobre el ***Viewport***, presiona ***A*** para seleccionar todo y luego ***I*** para establecer un keyframe para toda la armature.
* Ve a un frame diferente en la timeline y manipula el hueso como quieras para obtener la pose que deseas. Puedes cambiar la ubicación, rotación y escala de un hueso según cómo hayas configurado tu rig.
* Cuando tengas un buen resultado, establece otro keyframe para toda la armature. Sigue haciendo eso hasta que termines tu animación. Recuerda que el primer y el último frame deben ser iguales si la animación va a hacer loop.

![](https://1216664193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-56d38d4203ef345849a93c8bfe86ec7c517342cd%2F02_rig_animation_02.gif?alt=media)

Si eres nuevo en el proceso de animación, echa un vistazo a este tutorial con algunos buenos consejos para principiantes:

[![Video Preview](https://img.youtube.com/vi/-iWslh4uQIk/maxresdefault.jpg)](https://youtu.be/-iWslh4uQIk)

## Animaciones con Skinning vs Animaciones de transforms

**Las animaciones de transforms suelen ser mejores que las animaciones de skinned mesh en cuanto a rendimiento porque implican menos carga en términos de recursos computacionales necesarios para mostrar la animación.**

La animación de skinned mesh implica usar una Mesh con un esqueleto de huesos que está ponderado a los vértices de la Mesh. El esqueleto se anima, lo que a su vez anima la Mesh. Este proceso puede ser bastante costoso en términos computacionales, especialmente cuando hay un gran número de vértices que animar.

Las animaciones de transforms, por otro lado, implican animar directamente las propiedades transform de un objeto (como su posición, rotación y escala). Esto puede hacerse con menos recursos computacionales que la animación de skinned mesh, ya que normalmente hay menos propiedades transform que animar que vértices en una Mesh.

Además, las animaciones de transforms a menudo pueden precalcularse y almacenarse en un formato más compacto, como datos de keyframes, a los que se puede acceder rápidamente y reproducir sin necesidad de cálculos intensivos en tiempo real.

En general, aunque la animación de skinned mesh puede producir animaciones más detalladas y realistas, las animaciones de transforms suelen preferirse para aplicaciones críticas de rendimiento, como los videojuegos.

## Creando y exportando múltiples clips de animación

Puedes tener tantos clips de animación como quieras para tu modelo. Puedes consultar cómo crear, explorar y eliminar animaciones en [esta sección aquí](https://www.notion.so/5e962e5d54a24bcb9b906748007eb4cc).

En el video de abajo, aprenderás cómo exportar múltiples animaciones desde Blender en un solo archivo GLB.

[![Video Preview](https://img.youtube.com/vi/YxAB4bujO_w/maxresdefault.jpg)](https://www.youtube.com/watch?v=YxAB4bujO_w\&ab_channel=Decentraland)

## Exportando muchas animaciones como una sola

A diferencia de una animación esquelética, donde puedes hacer rig de varios objetos y combinar sus animaciones en un solo clip de animación, en la animación de objetos no puedes hacer eso. Las animaciones se exportarán por separado y solo se reproducirá un objeto a la vez. Una solución para esto es fusionar muchas animaciones en una sola, de modo que tengas un clip de animación con todos los objetos moviéndose al mismo tiempo.

Para hacerlo, baja al ***Nonlinear Animation Track*** la animación de cada objeto, como se muestra abajo.

![](https://1216664193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-202a85c0ab83178cd4cab88cd54cea29d5741928%2F03_object_animation_push_down_02.gif?alt=media)

*Baja la animación de cada objeto al NLA Track.*

Una vez que todas las animaciones estén listadas en el NLA Editor, selecciona todos los objetos, ve a **File > Export > glTF2.0**. Expande Include y marca Selected Objects. Expande Animation, vuelve a expandir Animation y desmarca **Group by NLA Track**. Puedes renombrar el clip de animación en Merged Animation Name y luego simplemente presionar **Export glTF 2.0**.

![](https://1216664193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-07d1d6ede0e3413282e94383abfc8f51cedfc722%2F04_export_single_animation_clip.png?alt=media)

*Configuración para exportar múltiples animaciones como una sola.*

Ten en cuenta que esto solo funcionará si los objetos tienen una sola animación cada uno. Si los objetos tienen múltiples clips de animación, es mejor exportarlos por separado.

{% hint style="info" %}
**💡 Consejo**: En lugar de crear tus propias animaciones, también puedes descargar animaciones genéricas y aplicarlas a tu modelo. Por ejemplo, para personajes 3D con características humanas, puedes descargar animaciones gratuitas o de pago de [Mixamo](https://www.mixamo.com/#/).
{% endhint %}

## Muestreo

A veces, tu archivo de animación puede acabar siendo demasiado pesado debido a la cantidad de animaciones o a la combinación de animación+modelo.

El muestreo es una buena forma de optimizar la animación. La tasa de muestreo definirá con qué frecuencia se horneará un keyframe en la animación. Por ejemplo, si la tasa de muestreo se establece en 2, eso significa que se creará un keyframe cada dos frames. Una tasa de muestreo de 3 horneará un keyframe cada tres frames, y así sucesivamente. Cuanto mayor sea la tasa de muestreo, más ligero será el archivo.

La desventaja, sin embargo, es que la animación empezará a ser cada vez menos fluida, ya que pierde algunos keyframes importantes (están distribuidos a lo largo de la animación de manera desigual). También es importante notar que **el muestreo NO consiste en dividir el número de frames de la animación por la tasa de muestreo**.

Normalmente, **una tasa de muestreo de 2 o 3** hará el trabajo. Esos números pueden optimizar la animación sin comprometer la calidad.

Puedes encontrar la ***Sampling Rate*** en la configuración de exportación, bajo ***Animation***.

![](https://1216664193-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-5bb9203e0a74492dfa68b1c7d3596c39baf62f95%2F05_sampling_rate.png?alt=media)

{% hint style="info" %}
**💡 Consejo**: Si el número de frames de la animación puede dividirse por la tasa de muestreo, ¡eso es algo bueno! Significa que el frame final será horneado, preservando la transición del final al inicio de la animación.
{% endhint %}

## Implementando animaciones

Este documento cubre cómo añadir animaciones a un modelo 3D. Consulta [**handle animations**](https://docs.decentraland.org/creator/development-guide/3d-model-animations/) para obtener instrucciones sobre cómo activar y manejar animaciones en una escena.

## Mejores prácticas para animaciones

* Mantén la armature lo más simple posible; crea solo huesos para las partes del modelo que quieras animar. Los huesos pueden afectar al rendimiento, así que asegúrate de añadir solo lo que sea realmente necesario.
* Si la animación va a hacer loop en tu escena, asegúrate de que la pose final sea idéntica a la inicial para una mejor transición.
* Nunca dejes a un personaje sin animación, incluso si realmente no está haciendo nada. Crea una animación "idle" para cuando el personaje esté quieto. La idle puede incluir movimientos sutiles como respirar y quizá miradas ocasionales.
* No dejes huesos sin posar, como las manos, los dedos, la cabeza o el cuello. Los detalles son realmente importantes en una buena animación y un movimiento rígido solo la hará menos creíble.
* Evita demasiados keyframes, a menos que sea extremadamente necesario. Cuantos más keyframes añadas, mayores serán las posibilidades de obtener una mala interpolación y una animación más pesada.
* Selecciona todos tus huesos (incluidos los que deforman) y establece un keyframe en los primeros y últimos frames de tu animación. Esto evitará tener huesos sin información, lo que provocaría que una animación afecte a la otra involuntariamente.
* Asegúrate de que tu archivo solo tenga una armature cuando lo exportes. Al importar animaciones, también se importará una armature con ellas. Todas las animaciones deben ser realizadas por la misma armature base, así que elimina todo lo que no necesites.
* Renombra siempre tus huesos y animaciones. ¡Mantén todo organizado!
* Al exportar el *glTF* modelo, confirma que estás exportando todos los objetos y animaciones. Algunos exportadores solo exportarán lo ***actualmente seleccionado*** por defecto.
* Después de exportar el modelo, revísalo en [Babylon Sandbox](https://sandbox.babylonjs.com/) y comprueba si todas las animaciones están funcionando y tienen el nombre esperado.
