菜单

场景系统

相关源文件

场景系统是Manim中核心的编排机制。它通过协调数学对象(Mobjects)、动画、摄像头、窗口和文件输出,来管理动画的创建、操纵和渲染。本页面解释了场景如何工作、它们的生命周期以及如何创建自定义场景。

有关定义场景中元素的Mobject系统的更多信息,请参阅Mobject系统。有关渲染过程本身的详细信息,请参阅渲染管线

场景生命周期

Manim中的场景从创建到完成都遵循特定的生命周期。

来源:manimlib/scene/scene.py51-184 manimlib/scene/scene.py148-168

  1. 初始化:场景构造函数设置核心属性和配置。
  2. 设置 (Setup):可选方法,场景可以重写该方法以在construct方法之前进行初始化。
  3. 运行 (Run):通过调用setup、construct、interact和tear_down来协调场景的执行。
  4. 构建 (Construct):定义动画的主要用户定义方法。
  5. 交互 (Interact):如果存在窗口,则进入交互模式,允许用户与场景进行交互。
  6. 拆卸 (Tear Down):清理资源并完成输出。

场景的核心组件

来源:manimlib/scene/scene.py51-184 manimlib/scene/scene_file_writer.py28-386 manimlib/window.py23-242

场景配置

场景可以通过多种机制进行配置

  1. 构造函数参数:创建场景实例时传递。
  2. 命令行参数:运行Manim时通过CLI传递。
  3. 配置文件:在default_config.yml或自定义配置文件中设置。

场景最重要的配置选项包括:

配置描述默认
skip_animations是否跳过动画,仅显示最终状态。
always_update_mobjects即使没有更新器,是否更新mobject。
start_at_animation_number从哪个动画开始渲染。None
end_at_animation_number在哪个动画结束渲染。None
show_animation_progress是否显示动画进度条。
presenter_mode在wait调用时暂停,直到用户交互。
default_wait_time未指定时,wait()的默认时间。1.0

来源:manimlib/scene/scene.py62-86 manimlib/config.py295-312 manimlib/default_config.yml62-71

Scene.play()中的动画管线

play()方法是Manim动画系统的核心。动画的处理流程如下:

来源:manimlib/scene/scene.py570-588 manimlib/scene/scene.py536-569

场景渲染和输出

场景系统通过与SceneFileWriter的协作来渲染帧并管理输出。

来源:manimlib/scene/scene.py249-261 manimlib/scene/scene_file_writer.py178-202 manimlib/scene/scene_file_writer.py303-332

创建自定义场景

要创建自定义场景,请继承Scene类并重写construct方法。

特殊场景类型

Manim包含具有附加功能的专用场景类型:

  • ThreeDScene:增强了3D场景的创建,具有更好的默认摄像机方向和深度测试。
  • InteractiveScene:增加了用于交互式开发的选择和操纵功能。

来源:manimlib/scene/scene.py919-930 manimlib/scene/interactive_scene.py65-922

使用Scene.embed()进行交互式开发

embed()方法通过打开IPython shell来实现交互式开发。

当使用embed()时,您可以直接在交互式Python shell中操作场景,增量测试动画,并尝试不同的参数。

来源:manimlib/scene/scene.py202-218 manimlib/scene/scene_embed.py23-204 example_scenes.py648-692

场景事件处理

场景可以通过事件处理器响应用户输入。

事件处理器目的
on_mouse_motion处理鼠标移动。
on_mouse_drag处理鼠标拖动。
on_mouse_press处理鼠标按钮按下。
on_mouse_release处理鼠标按钮释放。
on_mouse_scroll处理鼠标滚动。
on_key_press处理按键按下。
on_key_release处理按键释放。
on_resize处理窗口大小调整。

这些处理器在交互式场景以及在动画期间响应用户输入时特别有用。

来源:manimlib/scene/scene.py730-857 manimlib/window.py155-226

使用CLI运行场景

场景通常通过命令行界面(CLI)运行。

manimgl example_scenes.py OpeningManimExample

CLI提供了多种选项:

  • -w:将场景写入文件。
  • -s:跳过动画,只渲染最终帧。
  • -o:将场景写入文件并打开它。
  • -p:演示者模式(在wait调用期间等待按键)。
  • -n:从指定的动画编号开始。

来源: manimlib/config.py54-232 manimlib/extract_scene.py20-195 manimlib/__main__.py20-65

此 CLI 集成由 extract_scene.py 模块处理,该模块查找指定的场景类,使用适当的配置创建实例,并运行它。

总结

场景系统作为 Manim 中的编排层,控制着从初始设置到最终渲染的整个动画制作过程。通过理解场景的生命周期和组件,您可以高效地创建复杂的动画,并利用 Manim 的交互式开发功能。