本页面介绍如何在 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 类并重写必要的方法。
interpolate_submobject() 来定义每个子对象如何随时间变化。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
让我们研究创建不同类型自定义动画的关键模式。
Transform 类提供了一个对象变形的框架。要创建自定义变换,请...
代码库中的示例:Restore 类将 mobject 恢复到其保存的状态。
来源:manimlib/animation/transform.py248-252
创建动画通常继承自 ShowPartial 类,并定义对象如何出现。
来源:manimlib/animation/creation.py25-45 manimlib/animation/creation.py48-53
淡入淡出动画控制不透明度,并可以包含移动。
来源:manimlib/animation/fading.py34-43 manimlib/animation/fading.py46-67
对于更复杂的动画,您可以使用 AnimationGroup、Succession 或 LaggedStart 来组合多个动画。
AnimationGroup 以可自定义的计时方式播放多个动画。
来源:manimlib/animation/composition.py27-122
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
选择正确的基类:
Transform 类。ShowPartial 类。Animation 类。使用属性动画:
ApplyMethod。优化性能:
interpolate_submobject 中的复杂计算会影响每一帧的性能,请务必注意。begin() 中预先计算值。正确清理:
clean_up_from_scene 方法。remover=True 参数处理边缘情况:
来源: manimlib/animation/transform.py161-196 manimlib/animation/animation.py82-85