HeadlinesBriefing favicon HeadlinesBriefing.com

Guía de Animación de Bevy: Jugador y Gráfico

Hacker News •
×

Así que acabas de descargar un archivo .glb de un personaje 3D animado de un sitio web de activos gratuitos. Tienes una aplicación básica de Bevy ejecutándose. Ahora quieres generar tu personaje en tu aplicación de Bevy. Bastante fácil, probablemente hay una función para eso. Buscas el ejemplo básico de Animated Mesh en el sitio web de Bevy... y rápidamente se hace evidente que las cosas no son tan simples como esperabas. Hay mucha configuración, tipos relacionados con la animación cuyo propósito exacto no es obvio... Puede que puedas ajustar los ejemplos para satisfacer tus necesidades razonablemente rápido, pero realmente formar un modelo mental de cómo funciona la animación en Bevy, basado en los ejemplos, requerirá una seria reflexión.

Esta publicación es lo que desearía haber tenido cuando intentaba entender la animación en Bevy hace un par de semanas. Empiezo construyendo, paso a paso, suficiente modelo mental para lidiar con la animación básica en Bevy. Luego te guío a través del ejemplo oficial, explicando cómo se relaciona con ese modelo mental, y también te tomo de la mano un poco cuando encuentres métodos que quizás no hayas encontrado aún. Si te sientes cómodo con los conceptos básicos del ECS de Bevy, eres el público objetivo de esta publicación.

Primera intuición: Olvidémonos de Bevy y ECS por un segundo, y pensemos (muy abstractamente) en lo que se necesita para hacer que un modelo 3D animado se mueva. Necesitas dos ingredientes: Un modelo 3D generado (o algún tipo de referencia a uno), Una animación para reproducir (o algún tipo de referencia a una). Así que al principio, la forma en que podrías esperar reproducir una animación es algo así: my_model.play_animation(my_animation); Aquí está nuestro modelo mental hasta ahora: Ahora esto está realmente algo cerca de la forma en que funciona una función real de Bevy, a saber, el método play del tipo AnimationPlayer... o al menos lo estaría, si su self realmente se refiriera a un modelo 3D, y su argumento animation realmente se refiriera a una animación. Ahora mismo, sin embargo, no está claro que lo hagan. Pero veamos con más detalle cómo se representan nuestros dos ingredientes en Bevy, y tal vez podamos reconciliar nuestra intuición con la forma en que funciona la función play.

AnimationPlayer: Una forma de controlar las animaciones de un modelo 3D. Digamos que generas un modelo 3D desde un archivo .glb. Idealmente, te gustaría referirte a él usando el ID de la entidad generada, excepto que los modelos 3D generalmente no se generan como una sola entidad, sino como una jerarquía de entidades: Para animar tu modelo, necesitas referirte a él de otra manera. Bevy tiene un mecanismo para hacer exactamente eso — referirse a un modelo 3D para animación — en forma del tipo AnimationPlayer. AnimationPlayer es un Componente que se inserta automáticamente en una Entidad... en algún lugar de la jerarquía de entidades correspondiente a un modelo 3D animable, cuando ese modelo se genera. Una vez que has obtenido un AnimationPlayer, puedes decirle que reproduzca/pause una animación, acceder a la que se está reproduciendo actualmente... pero eso asume que tienes animaciones en primer lugar. Centrémonos en ellas ahora.

AnimationGraph: Una forma de almacenar y combinar animaciones. La forma en que las animaciones se representan en Bevy es un poco compleja, porque lo que generalmente manipularás no son animaciones individuales, sino instancias de una estructura de datos capaz de almacenar varias animaciones a la vez y combinarlas entre sí. Esa estructura es el AnimationGraph. No entraré en detalles sobre cómo se usan los AnimationGraphs aquí; una vez que te sientas cómodo con animaciones simples, puedes aprender más sobre gráficos de animación generales con el ejemplo de AnimationGraph. Por ahora nos centraremos en casos donde nuestro gráfico contiene solo una animación que nos interesa. En esos casos, los datos que identifican tu animación serán: (Una referencia a) un AnimationGraph, Un identificador de dónde se encuentra tu animación dentro del gráfico — eso es para lo que sirve el tipo NodeIndex.

Poniéndolo todo junto: Ok, digamos que tienes un AnimationPlayer, así como un AnimationGraph y un NodeIndex. Así es como los conectas para reproducir tu animación: Inserta una referencia a ....