#animation #bevy #gamedev #game-engine #state-transition

bevy_animation_graph

Bevy游戏引擎的动画图库

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游戏开发

Download history 8/week @ 2024-06-02 3/week @ 2024-06-09 2/week @ 2024-06-23 191/week @ 2024-06-30 46/week @ 2024-07-07 133/week @ 2024-07-21 12/week @ 2024-07-28 3/week @ 2024-08-04

每月148 次下载
用于 bevy_animation_graph_editor…

MIT/Apache

315KB
7.5K SLoC

Bevy Animation Graph

此crate包含此项目的库部分。这是在游戏中加载和运行动画图的代码。


lib.rs:

Bevy Animation Graph

Bevy Animation GraphBevy提供了一种基于图的动画系统。

简介

此库引入了三种类型的资源

  • 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:根据具有LR后缀的骨骼名称在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_speedrun_base_speed
    • 我们确定了一个目标速度范围,在这个范围内行走和运行之间的混合将发生。我们称这个范围为 blend_startblend_end
  • 期望输出
    • 如果目标速度在 blend_startblend_end 之间,则混合运行和行走动画,并根据 walk_base_speedrun_base_speed 缩放播放速度以匹配目标速度。

解决这个问题的一个方案如下:

  1. 两个动画之间的混合系数可以计算为

    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)
    
  2. 使用 blend_fac 将两个动画混合在一起。循环结果并应用速度系数 speed_fac

生成的图可以在这个源存储库的资产目录中看到,在 源存储库 下的 assets/animation_graphs/velocity_to_params.animgraph.ron(用于计算 speed_facblend_fac)以及 assets/animation_graphs/human.animgraph.ron(用于动画任务)。

依赖关系

~24MB
~437K SLoC