6个版本 (重大更新)
0.5.0 | 2024年7月21日 |
---|---|
0.4.0 | 2024年6月30日 |
0.3.0 | 2024年3月17日 |
0.2.0 | 2024年2月1日 |
0.1.0 | 2023年12月20日 |
#1098 在 游戏开发
每月148 次下载
用于 bevy_animation_graph_editor…
315KB
7.5K SLoC
Bevy Animation Graph
此crate包含此项目的库部分。这是在游戏中加载和运行动画图的代码。
lib.rs
:
Bevy Animation Graph
Bevy Animation Graph为Bevy提供了一种基于图的动画系统。
简介
此库引入了三种类型的资源
GraphClip
,定义在*.anim.ron
文件中。这些资源包含动画数据,类似于Bevy的AnimationClip
。这些*.anim.ron
文件不包含实际的动画数据,而是指向动画的源。目前,支持由其名称标签标识的Gltf文件中的动画。例如( source: GltfNamed( // Asset path of the (root) gltf asset path: "models/Fox.glb", // Name of the animation within that asset animation_name: "Walk", ), )
AnimationGraph
,定义在*.animgraph.ron
文件中。这些资源是库的核心,指定了动画图的节点、边、输入、输出和默认参数。动画播放器(AnimationGraphPlayer
)使用动画图的句柄进行播放,还可以通过输入覆盖将输入传递给图。因此,使用AnimationGraphPlayer
的API程序化设置图参数是首选方式,因为这样做不会实际修改图。这使得多个动画播放器可以同时使用相同的图。请参阅示例部分以获取示例。编辑图的推荐方式是使用可视化编辑器:在安装编辑器后,运行以下命令
以在给定的资源文件夹上启动编辑器。目前,编辑器仅支持创建和修改动画图和状态机,但它可以显示bevy_animation_graph_editor -a <PATH_TO_ASSETS_DIRECTORY>
AnimatedScene
资源的实时预览。StateMachine
,在*.fsm.ron
文件中定义。这些用于定义,正如其名所示,状态机,其中每个状态和转换都回放一个动画图,每个转换的图可以查询源状态和目标状态的相应图(用于以不同方式混合或播放单独的转换动画)。状态机可以用图形编辑器进行编辑,并用作现有动画图中的节点。AnimatedScene
,在*.animscn.ron
文件中定义。这些资源解决了通过动画图动画的场景实例化的人机工程学问题。没有AnimatedScene
,您必须手动实例化场景,找到并移除 Bevy 的AnimationPlayer
,用AnimationGraphPlayer
替换它,并设置它播放所需的AnimationGraph
。一个*.animscn.ron
文件指定要实例化的目标场景文件路径,要替换的AnimationPlayer
的路径(使用实体Name
),以及要播放的动画图的资源路径。例如
现在我们可以简单地将给定的( source: "models/Fox.glb#Scene0", path_to_player: ["root"], animation_graph: "animation_graphs/fox.animgraph.ron", )
AnimatedScene
句柄实例化为AnimatedSceneBundle
,就像我们对常规场景所做的那样
一旦动画场景成功实例化,就会向其中添加一个//... commands.spawn(AnimatedSceneBundle { animated_scene: asset_server.load("animated_scenes/character.animscn.ron"), ..default() }); //...
AnimatedSceneInstance
组件。为了方便起见,此组件包含包含AnimationGraphPlayer
的子实体的实体ID,以便用户决定手动设置一些动画图参数。如果动画场景实例化失败(例如,因为提供的path_to_player
路径不正确),则会打印错误,并添加AnimatedSceneFailed
组件。
节点
当前实现的图节点包括
ClipNode
:回放动画剪辑。ChainNode
:链(依次播放)两个动画输入。BlendNode
:根据输入因子线性混合两个动画输入。FlipLRNode
:根据具有L
和R
后缀的骨骼名称在X轴上镜像动画。LoopNode
:无限循环动画输入。SpeedNode
:调整动画输入的播放速度。GraphNode
:嵌套动画图。节点输入和输出与嵌套图匹配。RotationNode
:将(四元数)旋转应用于输入姿态定义中使用的骨骼掩码的一组骨骼。输入和输出。- 参数算术
编辑器安装
编辑器位于一个独立的存储库中,名称恰当地命名为 bevy_animation_graph_editor
。就像安装其他任何cargo二进制文件一样安装它。为了安装发布到crates.io的最新版本,请运行以下命令:
cargo install bevy_animation_graph_editor
要从git存储库安装最新版本,请运行以下命令:
cargo install --git 'https://github.com/mbrea-c/bevy_animation_graph.git' bevy_animation_graph_editor
最后,要从工作空间本地版本安装,请运行以下命令:
cargo install --path <PATH_TO_WORKSPACE> bevy_animation_graph_editor
示例
根据移动速度混合运行和行走动画
考虑以下简单场景:
- 输入
- 我们拥有运行和行走动画。
- 我们为角色设定了目标移动速度。
- 我们知道未修改的行走和运行动画对应的移动速度,我们称它们为
walk_base_speed
和run_base_speed
。 - 我们确定了一个目标速度范围,在这个范围内行走和运行之间的混合将发生。我们称这个范围为
blend_start
和blend_end
。
- 期望输出
- 如果目标速度在
blend_start
和blend_end
之间,则混合运行和行走动画,并根据walk_base_speed
和run_base_speed
缩放播放速度以匹配目标速度。
- 如果目标速度在
解决这个问题的一个方案如下:
-
两个动画之间的混合系数可以计算为
blend_fac = clamp((target_speed - blend_start) / (blend_end - blend_start), 0, 1)
应用于两个动画的播放速度系数为
speed_fac = target_speed / (walk_base_speed * (1 - blend_fac) + run_base_speed * blend_fac)
-
使用
blend_fac
将两个动画混合在一起。循环结果并应用速度系数speed_fac
。
生成的图可以在这个源存储库的资产目录中看到,在 源存储库 下的 assets/animation_graphs/velocity_to_params.animgraph.ron(用于计算 speed_fac
和 blend_fac
)以及 assets/animation_graphs/human.animgraph.ron(用于动画任务)。
依赖关系
~24MB
~437K SLoC