开发者生态
morning
《Bevy:大局》中的动画
2026-09-09
1 阅读
约6分钟阅读
ibobev
字号:
2026 年 8 月 27 日 您刚刚在免费资源网站上下载了一个动画 3D 角色 .glb 文件。您已经运行了一个基本的 Bevy 应用程序。现在您想在 Bevy 应用程序中生成您的角色。很简单,可能有一个函数可以做到这一点。您在 Bevy 的网站上查找基本的动画网格示例...很快就会发现事情并不像您希望的那么简单。有很多与动画相关的设置,其确切目的并不明显......您可能能够相当快地调整示例以适应您的需求,但实际上,根据示例形成动画在 Bevy 中如何工作的心理模型,需要进行一些认真的思考。这篇文章是我几周前尝试理解 Bevy 动画时所希望看到的。我首先逐步建立足够的心理模型来处理 Bevy 中的基本动画。然后我会引导您完成官方示例,解释它与心理模型的关系,并在遇到您可能尚未遇到的方法时握住您的手。如果您对 Bevy 的 ECS 基础知识感到满意,那么您就是本文的目标受众:) 第一直觉 让我们暂时忘记 Bevy 和 ECS,并(非常抽象地)思考如何让动画 3D 模型移动。您需要两个成分:生成的 3D 模型(或对模型的某种引用)、要播放的动画(或对模型的某种引用)。因此,首先,您可能期望播放动画的方式是这样的: my_model 。播放动画(我的动画);到目前为止,我们的心智模型是这样的:现在这实际上有点接近实际 Bevy 函数的工作方式,即来自 AnimationPlayer 类型的 play 方法……或者至少会是这样,如果它的 self 实际上引用了 3D 模型,并且它的动画参数实际上引用了动画。但现在还不清楚他们是否这样做。但是,让我们更详细地研究一下 Bevy 中两种成分的表示方式,也许我们可以将我们的直觉与 play 函数的工作方式相协调。 AnimationPlayer:一种控制 3D 模型动画的方法假设您从 .glb 文件生成 3D 模型。理想情况下,您希望使用生成的实体的 ID 来引用它,但 3D 模型通常不会生成为单个实体,而是生成为实体的层次结构:要为模型设置动画,您需要以其他方式引用它。 Bevy 有一个机制可以做到这一点——参考动画的 3D 模型——以 AnimationPlayer 类型的形式。 AnimationPlayer 是一个组件,当生成该模型时,它会自动插入到实体中……与可动画 3D 模型相对应的实体层次结构中的某个位置。一旦你掌握了 AnimationPlayer ,你就可以告诉它播放/暂停动画,访问当前正在播放的动画......但这是假设你首先有动画!现在让我们关注这些。 AnimationGraph:一种存储和组合动画的方法 Bevy 中动画的表示方式有点复杂,因为您通常操作的不是单个动画,而是能够同时存储多个动画并将它们相互组合的数据结构实例。该结构就是 AnimationGraph 。这里我不会详细介绍AnimationGraph是如何使用的;一旦您熟悉了简单的动画,您就可以通过动画图示例了解有关通用动画图的更多信息。现在,我们将重点关注图表仅包含我们感兴趣的一个动画的情况。在这些情况下,标识动画的数据将是:(对)AnimationGraph 的引用,即动画实际位于图表中的位置的标识符 - 这就是 NodeIndex 类型的用途。把它们放在一起好吧,假设你有一个 AnimationPlayer ,以及一个 AnimationGraph 和一个 NodeIndex 。以下是连接它们来播放动画的方法:将对 AnimationGraph 的引用作为组件插入到与 AnimationPlayer 相同的实体上。这正是 AnimationGraphHandle 的用途:它保存一个 AnimationGraph 的句柄,并实现 Component 特征。调用 my_animation_player.play(my_node_index); 。就是这样!在该调用后,my_animation_player 知道要查找与自身位于同一实体上的组件 AnimationGraph,它会在该图中查找索引为 NodeIndex 的动画,并对它所属的模型进行动画处理。以下是我此时的想法: 现在让我们再次看一下示例代码。浏览示例代码 在本节中,我将简单浏览 Bevy 官方示例中的 Animated Mesh ,解释它与我上面所说的内容之间的关系。我主要会按时间顺序进行,尽管我可能会重新排序甚至跳过某些部分。我的目标是提供一个比现有的内联注释更深入的解释(这些注释已经相当彻底了)
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱