HeadlinesBriefing favicon HeadlinesBriefing.com

Guia de Animação Bevy: Player e Grafo

Hacker News •
×

Então, você acabou de baixar um arquivo .glb de um personagem 3D animado em um site de ativos gratuitos. Você tem um aplicativo Bevy básico em execução. Agora você quer gerar seu personagem no seu aplicativo Bevy. Fácil o suficiente, provavelmente há uma função para isso. Você procura o exemplo básico de Animated Mesh no site do Bevy... e rapidamente fica evidente que as coisas não são tão simples quanto você esperava. Há muita configuração, tipos relacionados à animação cujo propósito exato não é óbvio... Você pode ser capaz de ajustar os exemplos para atender às suas necessidades razoavelmente rápido, mas realmente formar um modelo mental de como a animação funciona no Bevy, com base nos exemplos, vai exigir uma reflexão séria.

Este post é o que eu gostaria de ter tido ao tentar entender animação no Bevy há algumas semanas. Começo construindo, passo a passo, um modelo mental suficiente para lidar com animação básica no Bevy. Então, eu o guio pelo exemplo oficial, explicando como ele se relaciona com esse modelo mental, e também segurando sua mão um pouco ao encontrar métodos que você pode não ter encontrado ainda. Se você está confortável com o básico do ECS do Bevy, você é o público-alvo deste post.

Primeira intuição: Vamos esquecer o Bevy e o ECS por um segundo, e pensar (muito abstratamente) sobre o que é preciso para fazer um modelo 3D animado se mover. Você precisa de dois ingredientes: Um modelo 3D gerado (ou algum tipo de referência a um), Uma animação para reproduzir (ou algum tipo de referência a uma). Então, no início, a maneira como você pode esperar reproduzir uma animação é algo assim: my_model.play_animation(my_animation); Aqui está nosso modelo mental até agora: Agora, isso está realmente um pouco próximo da maneira como uma função real do Bevy funciona, ou seja, o método play do tipo AnimationPlayer... ou pelo menos seria, se seu self realmente se referisse a um modelo 3D, e seu argumento animation realmente se referisse a uma animação. Agora, porém, não está claro que eles o façam. Mas vamos olhar mais detalhadamente como nossos dois ingredientes são representados no Bevy, e talvez possamos reconciliar nossa intuição com a maneira como a função play funciona.

AnimationPlayer: Uma maneira de controlar as animações de um modelo 3D. Digamos que você gere um modelo 3D a partir de um arquivo .glb. Idealmente, você gostaria de se referir a ele usando o ID da entidade gerada, exceto que os modelos 3D geralmente não são gerados como uma única entidade, mas sim como uma hierarquia de entidades: Para animar seu modelo, você precisa se referir a ele de outra maneira. O Bevy tem um mecanismo para fazer exatamente isso — referir-se a um modelo 3D para animação — na forma do tipo AnimationPlayer. AnimationPlayer é um Componente que é automaticamente inserido em uma Entidade... em algum lugar na hierarquia de entidades correspondente a um modelo 3D animável, quando esse modelo é gerado. Depois de obter um AnimationPlayer, você pode dizer a ele para reproduzir/pausar uma animação, acessar a que está sendo reproduzida atualmente... mas isso pressupõe que você tenha animações em primeiro lugar! Vamos focar nelas agora.

AnimationGraph: Uma maneira de armazenar e combinar animações. A maneira como as animações são representadas no Bevy é um pouco complexa, porque o que você geralmente manipulará não são animações individuais, mas instâncias de uma estrutura de dados capaz de armazenar várias animações ao mesmo tempo e combiná-las entre si. Essa estrutura é o AnimationGraph. Não vou entrar nos detalhes de como os AnimationGraphs são usados aqui; uma vez que você se sentir confortável com animações simples, pode aprender mais sobre gráficos de animação gerais com o exemplo AnimationGraph. Por enquanto, vamos nos concentrar em casos em que nosso gráfico contém apenas uma animação que nos interessa. Nesses casos, os dados que identificam sua animação serão: (Uma referência a) um AnimationGraph, Um identificador de onde sua animação realmente está dentro do gráfico — é para isso que serve o tipo NodeIndex.

Juntando tudo: Ok, digamos que você tenha um AnimationPlayer, bem como um AnimationGraph e um NodeIndex. Aqui está como você os conecta para reproduzir sua animação: Insira uma referência a ....