菜单

动画系统

相关源文件

Manim 中的动画系统是负责创建数学对象(mobjects)的视觉过渡和变化的核心框架。本页面将解释动画如何工作、可用的各种动画类型以及如何创建自定义动画。有关动画之外的连续对象更新信息,请参阅 Updaters and Continuous Animation(更新器和连续动画)。

动画架构与流程

Manim 中的动画遵循特定的生命周期,并由 Scene 类管理。动画定义了 mobject 如何随时间变化,而 Scene 则协调何时以及如何播放这些动画。

动画生命周期

来源:manimlib/scene/scene.py536-588 manimlib/animation/animation.py60-78

当您调用 scene.play() 并传入一个或多个动画时,会发生以下过程:

  1. 播放前:Scene 准备动画,更新跳过状态,并在需要时初始化文件写入。
  2. 开始动画:每个动画进行初始化,创建起始和目标状态。
  3. 动画进度:Scene 按时间步进,在每个步骤中调用每个动画的 interpolate() 方法。
  4. 完成动画:完成后,每个动画进行最终化并进行清理。
  5. 播放后:Scene 更新其内部状态,为下一个操作做准备。

基础动画类

所有动画都是基于 Animation 类创建的。

来源:manimlib/animation/animation.py23-203

Animation 类中的关键方法:

  • begin():初始化动画,创建起始 mobject 状态的副本。
  • interpolate(alpha):更新 mobject 以获得给定的进度值(alpha ∈ [0,1])。
  • finish():完成动画,通常确保 mobject 精确达到其最终状态。
  • clean_up_from_scene():执行任何场景特定的清理(例如,当 remover=True 时移除 mobjects)。

速率函数

速率函数控制动画的节奏,将线性进度(0 到 1)映射到可能非线性的值。

来源:manimlib/utils/rate_functions.py manimlib/animation/animation.py134-179

常见的速率函数包括:

  • linear:全程匀速(α → α)。
  • smooth:缓入缓出(开始和结束时速度为零)。
  • rush_from:快速开始,然后减速。
  • rush_into:慢速开始,然后加速。
  • there_and_back:移动到最终状态,然后返回到初始状态。

与 Scene 和 Mobjects 的集成

动画连接场景和 mobjects,随时间转换 mobjects,同时场景管理动画流程。

来源:manimlib/scene/scene.py571-588

Scene 类中的 play() 方法是执行动画的地方。

此方法:

  1. 将动画构建器转换为实际动画。
  2. 应用任何指定的计时参数(run_time、rate_func、lag_ratio)。
  3. 开始、进行和完成动画。

动画类型

Manim 为不同目的提供了许多专用动画类型。

变换动画

变换将一个 mobject 变为另一个 mobject。

  • Transform:所有变换的基类。
  • ReplacementTransform:类似于 Transform,但也会将原始 mobject 替换为目标 mobject。
  • MoveToTarget:将 mobject 变换为其 target 属性。
  • ApplyMethod:应用 mobject 方法并动画化到结果。

来源:manimlib/animation/transform.py24-313

创建动画

这些动画展示了 mobjects 的出现或绘制过程。

  • ShowCreation:沿路径逐渐显示 mobject。
  • Uncreate:沿路径逐渐移除 mobject。
  • DrawBorderThenFill:先绘制轮廓,然后填充内部。
  • Write:模拟文字的书写效果。

来源:manimlib/animation/creation.py25-245

淡入淡出动画

这些动画控制透明度。

  • FadeIn/FadeOut:逐渐改变透明度。
  • FadeInFromPoint/FadeOutToPoint:从某个点淡入/淡出。
  • FadeTransform:淡出第一个 mobject,同时淡入第二个 mobject。

来源:manimlib/animation/fading.py21-213

指示动画

这些动画用于突出显示或吸引对 mobjects 的注意。

  • Indicate:短暂缩放并改变颜色。
  • Flash:在点周围创建闪光效果。
  • ShowPassingFlash:显示一个“波浪”穿过 mobject。
  • CircleIndicate:用圆圈围绕 mobject。

来源:manimlib/animation/indication.py41-406

动画组合

Manim 提供了组合动画的方式。

描述
AnimationGroup同时播放多个动画。
Succession按顺序播放动画。
LaggedStart带有时间延迟地开始播放多个动画。
LaggedStartMap带有时间延迟地将同一动画应用于多个 mobjects。

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

创建自定义动画

要创建自定义动画,请扩展 Animation 类并覆盖关键方法。

  1. __init__:使用任何特定参数进行初始化。
  2. begin:设置动画(可选覆盖)。
  3. interpolate_submobject:定义动画期间每个子对象如何变化。
  4. finish:执行任何清理(可选覆盖)。

一个简单的自定义动画示例。

对于基于变换的动画,您也可以覆盖

来源:manimlib/animation/animation.py86-105 manimlib/animation/creation.py25-46

动画与更新器

动画代表在特定时间段内的离散变化,而 Manim 也通过更新器函数支持连续动画。动画系统通过 turn_animation_into_updater 函数与更新器连接,该函数将动画转换为连续运行的更新器。

此函数可以创建应用动画效果的更新器,无论是单次还是循环应用。

来源:manimlib/mobject/mobject_update_utils.py83-123

Scene 动画控件

Scene 类提供了几种控制动画的方法。

方法描述
play(*animations, **kwargs)播放一个或多个动画。
wait(duration=None, stop_condition=None)等待指定的时间。
stop_skipping()停止跳过动画(用于预览模式)。
get_time_progression(run_time)获取动画的时间步长。
get_run_time(animations)计算动画的总运行时间。

play 的附加参数:

  • run_time:动画的时长(秒)。
  • rate_func:控制动画节奏的函数。
  • lag_ratio:控制复杂 mobject 的时间偏移。

来源:manimlib/scene/scene.py460-615


动画系统是 Manim 实现视觉魔力的地方,它允许平滑、数学上精确的过渡,有效地传达复杂的思想。