HeadlinesBriefing favicon HeadlinesBriefing.com

Bevy动画指南:玩家与图形基础

Hacker News •
×

假设你刚从免费资产网站下载了一个动画3D角色.glb文件。你有一个基本的Bevy应用程序正在运行。现在你想在你的Bevy应用中生成你的角色。这很容易,可能有一个函数可以做到。你在Bevy的网站上查找基本的Animated Mesh示例……然后很快就会发现事情并不像你希望的那样简单。有很多设置工作,动画相关类型的用途并不明显……你也许能很快调整示例以满足你的需求,但基于示例真正理解Bevy中动画的工作原理,需要认真思考。

这篇文章是我几周前试图理解Bevy动画时希望拥有的。我首先逐步构建一个足够的心智模型来处理Bevy中的基本动画。然后我带你浏览官方示例,解释它如何与该心智模型相关联,并在遇到你可能尚未遇到的方法时给予一些指导。如果你熟悉Bevy的ECS基础知识,那么你就是这篇文章的目标受众。

第一直觉:让我们暂时忘记Bevy和ECS,抽象地思考让一个动画3D模型动起来需要什么。你需要两个要素:一个生成的3D模型(或对它的某种引用),一个要播放的动画(或对它的某种引用)。所以起初,你可能期望播放动画的方式是这样的:my_model.play_animation(my_animation); 这是我们目前的心智模型:现在这实际上与Bevy实际函数的工作方式有些接近,即AnimationPlayer类型的play方法……至少如果它的self实际引用3D模型,并且它的animation参数实际引用动画的话。但目前,它们是否如此并不清楚。但让我们更详细地看看这两个要素在Bevy中是如何表示的,也许我们可以调和我们的直觉与play函数的工作方式。

AnimationPlayer:一种控制3D模型动画的方式。假设你从.glb文件生成一个3D模型。理想情况下,你想使用生成实体的ID来引用它,但3D模型通常不是作为单个实体生成的,而是作为实体层次结构生成的:要动画化你的模型,你需要以其他方式引用它。Bevy有一个机制可以做到这一点——引用3D模型进行动画——以AnimationPlayer类型的形式。AnimationPlayer是一个组件,当模型生成时,它会自动插入到与可动画3D模型对应的实体层次结构中的某个实体中。一旦你获得了AnimationPlayer,你可以告诉它播放/暂停动画,访问当前正在播放的动画……但这假设你首先有动画!现在让我们关注这些。

AnimationGraph:一种存储和组合动画的方式。Bevy中动画的表示方式有点复杂,因为你通常操作的不是单个动画,而是一个能够同时存储多个动画并将它们组合在一起的数据结构的实例。这个结构就是AnimationGraph。我不会在这里深入讨论AnimationGraph的使用细节;一旦你熟悉了简单动画,你可以通过AnimationGraph示例了解更多关于通用动画图的内容。现在我们专注于我们的图只包含一个我们感兴趣的动画的情况。在这些情况下,标识你的动画的数据将是:(对)AnimationGraph(的引用),以及你的动画在图中的位置标识符——这就是NodeIndex类型的用途。

整合起来:好的,假设你有一个AnimationPlayer,以及一个AnimationGraph和一个NodeIndex。以下是你如何连接它们来播放你的动画:插入对……的引用。