菜单

自定义动画

相关源文件

本页面介绍如何在 ManimGL 中通过扩展动画系统来创建自定义动画。有关 Manim 中包含的预构建动画的信息,请参阅 基础动画。有关使用更新器进行连续动画的信息,请参阅 更新器和连续动画

动画类层次结构

Manim 的动画系统围绕着 Animation 基类构建,它提供了动画对象的核心功能。所有自定义动画都继承自此类或其子类。

来源:manimlib/animation/animation.py23-203 manimlib/animation/transform.py24-134 manimlib/animation/composition.py27-59 manimlib/animation/fading.py21-67 manimlib/animation/creation.py25-45

动画生命周期

动画运行时,它会遵循一个特定的生命周期,您可以在创建自定义动画时介入该生命周期。

来源:manimlib/animation/animation.py60-85 manimlib/animation/animation.py135-155 manimlib/animation/animation.py77-82

创建简单的自定义动画

要创建自定义动画,请继承 Animation 类并重写必要的方法。

  1. 最基本的方法是重写 interpolate_submobject() 来定义每个子对象如何随时间变化。
  1. 对于类似变换的动画,请继承 Transform 类并重写 create_target()

来源:manimlib/animation/animation.py156-164 manimlib/animation/transform.py78-81

需要重写的方法

创建自定义动画时,您可能需要重写以下关键方法:

方法目的何时重写
__init__初始化动画特定的参数当您的动画需要自定义参数时
create_starting_mobject定义起始状态当初始状态与当前状态不同时
create_target定义目标状态对于类似变换的动画
interpolate_submobject定义每个子对象如何进行动画对于精确控制插值
begin动画开始前的设置对于复杂的初始化
finish动画结束后的清理当需要额外的清理时
clean_up_from_scene与场景相关的清理对于场景修改

来源:manimlib/animation/animation.py60-85 manimlib/animation/transform.py78-81 manimlib/animation/animation.py156-164

动画插值系统

Manim 动画系统的核心是插值过程,它控制对象如何从起始状态过渡到目标状态。

来源:manimlib/animation/animation.py135-179

自定义动画示例

让我们研究创建不同类型自定义动画的关键模式。

1. 自定义变换

Transform 类提供了一个对象变形的框架。要创建自定义变换,请...

代码库中的示例:Restore 类将 mobject 恢复到其保存的状态。

来源:manimlib/animation/transform.py248-252

2. 自定义创建动画

创建动画通常继承自 ShowPartial 类,并定义对象如何出现。

来源:manimlib/animation/creation.py25-45 manimlib/animation/creation.py48-53

3. 自定义淡入淡出动画

淡入淡出动画控制不透明度,并可以包含移动。

来源:manimlib/animation/fading.py34-43 manimlib/animation/fading.py46-67

组合动画

对于更复杂的动画,您可以使用 AnimationGroupSuccessionLaggedStart 来组合多个动画。

动画组

AnimationGroup 以可自定义的计时方式播放多个动画。

来源:manimlib/animation/composition.py27-122

示例:FlashAround

Manim 代码库中的 FlashAround 展示了如何组合一个复杂的动画。

来源:manimlib/animation/indication.py255-276

高级动画技术

自定义插值函数

对于特殊动画,您可以创建自定义插值函数,超出默认的线性插值。

来源:manimlib/animation/animation.py156-164

基于路径的动画

对于遵循路径的动画

来源:manimlib/animation/transform.py43-52

动画生命周期详解

为了了解每个方法在动画过程中何时被调用,这里有一个详细的分解。

来源:manimlib/animation/animation.py60-85 manimlib/animation/animation.py135-179 manimlib/animation/animation.py82-85

创建自定义动画的最佳实践

  1. 选择正确的基类:

    • 对于状态之间的变形,请继承 Transform 类。
    • 对于对象的局部显示,请继承 ShowPartial 类。
    • 对于基本的自定义行为,请直接继承 Animation 类。
  2. 使用属性动画:

    • 对于简单的属性更改,可以考虑使用 ApplyMethod
  3. 优化性能:

    • interpolate_submobject 中的复杂计算会影响每一帧的性能,请务必注意。
    • 尽可能在 begin() 中预先计算值。
  4. 正确清理:

    • 如果您的动画添加或删除了 mobjects,请重写 clean_up_from_scene 方法。
    • 为应该移除对象的动画设置 remover=True 参数
  5. 处理边缘情况:

    • 确保您的动画能够处理边缘情况(alpha=0,alpha=1)
    • 使用各种速率函数进行测试

来源: manimlib/animation/transform.py161-196 manimlib/animation/animation.py82-85