Manim 中的动画系统是负责创建数学对象(mobjects)的视觉过渡和变化的核心框架。本页面将解释动画如何工作、可用的各种动画类型以及如何创建自定义动画。有关动画之外的连续对象更新信息,请参阅 Updaters and Continuous Animation(更新器和连续动画)。
Manim 中的动画遵循特定的生命周期,并由 Scene 类管理。动画定义了 mobject 如何随时间变化,而 Scene 则协调何时以及如何播放这些动画。
来源:manimlib/scene/scene.py536-588 manimlib/animation/animation.py60-78
当您调用 scene.play() 并传入一个或多个动画时,会发生以下过程:
interpolate() 方法。所有动画都是基于 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:移动到最终状态,然后返回到初始状态。动画连接场景和 mobjects,随时间转换 mobjects,同时场景管理动画流程。
来源:manimlib/scene/scene.py571-588
Scene 类中的 play() 方法是执行动画的地方。
此方法:
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 类并覆盖关键方法。
__init__:使用任何特定参数进行初始化。begin:设置动画(可选覆盖)。interpolate_submobject:定义动画期间每个子对象如何变化。finish:执行任何清理(可选覆盖)。一个简单的自定义动画示例。
对于基于变换的动画,您也可以覆盖
来源:manimlib/animation/animation.py86-105 manimlib/animation/creation.py25-46
动画代表在特定时间段内的离散变化,而 Manim 也通过更新器函数支持连续动画。动画系统通过 turn_animation_into_updater 函数与更新器连接,该函数将动画转换为连续运行的更新器。
此函数可以创建应用动画效果的更新器,无论是单次还是循环应用。
来源:manimlib/mobject/mobject_update_utils.py83-123
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 实现视觉魔力的地方,它允许平滑、数学上精确的过渡,有效地传达复杂的思想。