菜单

交互式开发

相关源文件

目的与范围

ManimGL 中的交互式开发是一项强大的功能,它允许您暂停动画并通过 IPython shell 或直接的鼠标/键盘操作实时与动画进行交互。这对于快速开发、调试和微调动画特别有价值,无需重新启动渲染过程。

本页面介绍了如何进入交互模式、使用交互式 shell 以及在场景中直接操作对象。有关以编程方式创建动画的信息,请参阅“动画系统”页面。

进入交互模式

embed() 方法

进入交互模式最简单的方法是在场景的 construct 方法中调用 self.embed()

命令行集成

您也可以在使用 ManimGL 时使用 -e 标志在特定行插入一个嵌入点

这会在您代码的第 10 行自动插入 self.embed()

交互式开发工作流程

来源:manimlib/scene/scene.py202-218 manimlib/scene/scene_embed.py201-218 manimlib/__main__.py34-46

交互式 Shell 功能

启动交互式 shell 时,您可以访问:

  1. 场景上下文:在 embed() 之前定义的所有变量都可以在 shell 中使用。
  2. 缩短的命令:使用命令的简写形式(不带 self.
  3. 实时更新:更改会立即反映在动画窗口中。
  4. 状态管理:保存、撤销和重做场景状态。
  5. 代码检查点:运行带检查点的代码块。

快捷函数

交互式 shell 提供以下快捷函数:

快捷键等效描述
playself.play运行动画
waitself.wait暂停给定时间
addself.add将对象添加到场景
removeself.remove从场景中移除对象
clearself.clear清除所有对象
focusself.focus聚焦窗口
save_stateself.save_state保存当前场景状态
undoself.undo恢复到之前的状态
redoself.redo重做已撤销的操作
i2gself.i2g从 ID 获取组
i2mself.i2m从 ID 获取 mobject
checkpoint_paste运行带检查点的复制代码
clear_checkpoints清除保存的检查点
reload重新加载场景

来源:manimlib/scene/scene_embed.py63-79 manimlib/scene/scene.py651-677

交互式架构

来源:manimlib/scene/scene.py202-218 manimlib/scene/scene_embed.py22-204 manimlib/scene/interactive_scene.py65-693 manimlib/window.py23-243

视觉选择与操作

InteractiveScene 类提供了通过鼠标和键盘控件的高级对象选择和操作功能。

选择控件

  • 按住 s 并单击以选择一个对象。
  • 按住 s 并拖动以在矩形内选择对象。
  • u 取消选择所有对象。
  • Cmd/Ctrl + a 选择所有对象。
  • Cmd/Ctrl + t 在顶层和详细选择之间切换。

操作控件

  • 按住 g 来抓取和移动选定的对象。
  • 按住 h 将移动限制在水平方向(X 轴)。
  • 按住 v 将移动限制在垂直方向(Y 轴)。
  • 按住 t 调整选定对象的大小。
  • 使用箭头键微调选定的对象。
  • c 显示选定对象的颜色调色板。

剪贴板操作

  • Cmd/Ctrl + c 复制选定的对象。
  • Cmd/Ctrl + v 粘贴对象/文本。
  • Cmd/Ctrl + x 剪切选定的对象。
  • Cmd/Ctrl + z 撤销。
  • Cmd/Ctrl + Shift + z 重做。
  • Cmd/Ctrl + g 对选定对象进行分组。
  • Cmd/Ctrl + Shift + g 对选定对象进行取消分组。

相机控制

  • 按住 f 平移相机。
  • 使用滚轮放大/缩小。
  • 按住 d 进行 3D 旋转。
  • r 重置相机视图。
  • k 切换准星光标。
  • i 显示坐标信息。

来源:manimlib/scene/interactive_scene.py86-141 manimlib/default_config.yml103-116

交互式命令流

来源:manimlib/scene/scene.py202-218 manimlib/scene/scene_embed.py35-99 manimlib/window.py155-239

使用示例

这是一个展示如何使用交互式开发的完整示例。

在交互式 shell 中,您可以尝试:

来源:example_scenes.py648-692

检查点系统

检查点系统允许您通过复制代码块并使用 checkpoint_paste() 来重新运行它们。

  1. 复制一个以注释开头的代码块(例如,# Animation 1)。
  2. 在 shell 中运行 checkpoint_paste()
  3. 进行更改并再次复制相同的块。
  4. 再次运行 checkpoint_paste() - 场景将恢复到第一次运行时的状态。

这对于迭代优化动画序列特别有用。

来源:manimlib/scene/scene_embed.py151-203

自动重载

--autoreload 标志一起使用时,对 Python 模块的更改将在交互式 shell 中被自动检测和重新加载。

您也可以通过在 shell 中调用 reload() 来手动重新加载带有更改的场景。

来源:manimlib/scene/scene_embed.py142-150 manimlib/config.py329-331 manimlib/module_loader.py23-176

提示和最佳实践

  1. 用于实验:交互模式非常适合尝试不同的动画和参数。

  2. 保存状态:在进行重大更改之前使用 save_state() 以便轻松撤销。

  3. 检查点注释:使用一致的注释开始代码块,以利用检查点系统。

  4. 使用简短命令:请记住在 shell 中使用命令的简短形式(play() 而不是 self.play())。

  5. 窗口焦点:如果窗口失去焦点,请使用 focus() 将其重新激活。

  6. 对象 ID 访问:使用 i2m(id) 通过 ID 获取对象,这在引用先前创建的对象时很有用。