如果您在过去十年中看过 YouTube 上的教育视频,您几乎肯定见过 Manim 的作品。Grant Sanderson 的 3Blue1Brown 频道独特的风格——流畅、精确动画的几何变换、实时展开的方程式以及将复杂数学概念渲染得直观可视——完全由这个开源 Python 库驱动。Manim 代表 Mathematical Animation Engine(数学动画引擎),它已经让世界级的数学可视化创作变得普及。
Sanderson 最初编写 Manim 作为个人工具,用于制作他的 3Blue1Brown 频道的动画,该频道已成长为超过 600 万订阅者。该库于 2019 年首次公开发布,并迅速在教育工作者、学生和内容创作者中获得关注,他们希望将同样的视觉清晰度带到自己的项目中。Manim 背后的基本见解是:数学动画不是插图——它们是论证。精心设计的动画可以以静态图表无法做到的方式,传达证明背后的逻辑或概念背后的直觉。
该库自首次开源发布以来已显著发展。最重要的发展是 ManimCommunity 分支的出现,它接管了 Sanderson 的原始代码库,并增加了全面的文档、稳定的发布周期、广泛的测试和数十项新功能。两个版本都仍在积极维护,但它们现在服务于不同的受众:原始版本用于 3Blue1Brown 的制作工作,社区版用于其他所有人。
Manim 是如何诞生的?为什么有两个版本?
Manim 的起源故事在开源领域中并不常见。Grant Sanderson 完全为自己使用而创建了第一个版本的 Manim,同时制作 3Blue1Brown 视频。它从来就不是一个通用的动画库——它只是一个碰巧被开源化的个人工具。API 仅由 Sanderson 自己的使用模式来记录,并且不保证稳定性或向后兼容性。
随着 YouTube 频道人气的增长,对该工具的兴趣也随之增加。开发者开始贡献补丁和功能,但代码库并非为协作维护而设计。2020 年,社区成立了 ManimCommunity 组织,以创建一个分支的、由社区维护的版本,可以独立于 Sanderson 的制作需求而发展。该分支进行了完整的文档重写、适当的渲染器架构和语义版本控制方案。
graph TB
A[Grant Sanderson 创建 Manim<br>用于 3Blue1Brown 视频] --> B[2019:首次开源发布]
B --> C[原始分支:3b1b/manim]
B --> D[2020:ManimCommunity 分支]
D --> E[MCE:ManimCommunity/manim]
C --> F[Sanderson 维护用于<br>3Blue1Brown 制作]
E --> G[社区功能:<br>文档、测试、插件]
E --> H[稳定发布:<br>v0.18, v0.19+]
F --> I[针对特定视频需求<br>的自定义补丁]| 方面 | 3b1b/manim (原始) | ManimCommunity/manim |
|---|---|---|
| 维护者 | Grant Sanderson | 社区维护者 |
| 发布周期 | 不定期,以生产为导向 | 定期语义版本 |
| 文档 | 极简(源码即文档) | 全面的指南和 API 文档 |
| 稳定性 | 可能出现破坏性变更 | 稳定,附带弃用警告 |
| 安装命令 | pip install manim (原始) | pip install manim (社区) |
| 最适合 | 遵循 Sanderson 的确切工作流程 | 一般用途、教学、学习 |
你可以用 Manim 创建什么?
Manim 擅长于特定类别的动画:精确、程序化的数学对象运动。它的原始对象——称为"Mobjects"——包含从基本几何形状到 LaTeX 渲染的方程式、坐标系统、函数图形、数轴和 3D 曲面的一切。
动画是通过随时间变换 Mobjects 来定义的:移动圆形、变形图形、转换方程或在两个形状之间进行插值。Manim 的渲染器会自动处理中间帧,产生具有可自定义缓动函数的流畅运动。
| 功能类别 | 示例 | 实现 |
|---|---|---|
| 几何对象 | 圆形、方形、多边形、弧 | Circle(), Square(), Polygon() |
| 数学符号 | LaTeX 公式、变量文本 | Tex(), MathTex(), Text() |
| 图形和坐标轴 | 坐标系统、函数绘图 | Axes(), Graph(), NumberPlane() |
| 3D 场景 | 旋转对象、3D 曲面 | ThreeDScene(), Surface() |
| 相机效果 | 缩放、平移、跟随对象 | self.camera.frame.move_to() |
| 动画类型 | 淡入、变换、生长、绘制边框 | FadeIn(), Transform(), Create() |
sequenceDiagram
participant Dev as 开发者 (Python)
participant Manim as Manim 引擎
participant FFmpeg as FFmpeg
participant Output as 视频文件
Dev->>Manim: 定义含 construct() 的 Scene 类
Dev->>Manim: 添加 mobjects 和动画
Manim->>Manim: 渲染中间帧
Manim->>Manim: 逐帧应用变换
Manim->>FFmpeg: 发送帧序列
FFmpeg->>Output: 编码为 MP4
Output-->>Dev: 完整动画文件如何编写 Manim 动画?
Manim 动画是纯 Python 代码。每个动画从创建一个继承自 Scene 的类并在 construct 方法中定义其内容开始:
from manim import *
class SquareToCircle(Scene):
def construct(self):
square = Square()
self.play(Create(square))
self.play(square.animate.move_to(RIGHT))
self.play(Transform(square, Circle()))
self.wait(1)
这个七行脚本创建了一个完整的动画:一个方形出现、向右滑动、变形为一个圆形,然后暂停。使用 manim -pql scene.py SquareToCircle 执行,它会用单个终端命令渲染成视频文件。-pql 标志表示"预览品质,低"——适合快速迭代——而 -pqh 则产生用于发布的高品质输出。
运行 Manim 需要什么硬件?
| 组件 | 最低 | 建议 |
|---|---|---|
| CPU | 双核处理器 | 四核或更好 |
| RAM | 4 GB | 8 GB 或更多 |
| GPU | 集成显卡 | 专用 GPU(用于 OpenGL 渲染器) |
| Python | 3.8 | 3.11 或更新版本 |
| 存储 | 库 500 MB | 渲染项目需 5 GB+ |
Manim 默认使用 cairo 后端,完全在 CPU 上渲染。可选的 OpenGL 后端提供更快的渲染和实时预览,但需要性能足够的 GPU。社区版还支持用于替代渲染器的插件系统。
关于 Manim 的常见问题
Manim 只适用于数学吗?
虽然 Manim 的名称和传统来自数学,但其功能远不止于纯数学。教育工作者和内容创作者已将 Manim 用于:
- 物理动画:可视化场、力和粒子运动
- 计算机科学:展示算法执行、数据结构操作
- 工程:说明电路图、机械系统
- 数据可视化:创建动态图表、图形和网络图
- 音乐理论:动态乐谱、和弦进行和节奏模式
该库能够动画化 LaTeX 渲染的文本和数学符号,使其对于任何 STEM 领域特别强大,但其面向对象的动画模型足够通用,适用于任何类型的说明性内容。
Manim 在教育与内容创作中的应用
自开源发布以来,Manim 已在像 YouTube 这样的平台上推动了教育内容创作的革命。“3Blue1Brown 风格"本身已成为一种可识别的类型,数千个教育频道采用 Manim 来制作他们的视频。大学已将 Manim 整合到数学传播的课程中,该库已被用于 TED-Ed 动画、会议演示和交互式教科书。
ManimCommunity 版已显著降低了入门门槛。文档包含一个名为"快速入门指南"的综合教程系列、带有可下载源代码的示例画廊,以及一个活跃的 Discord 社区,初学者可以在此获得动画方面的帮助。
延伸阅读
- ManimCommunity 仓库 — 社区版源代码和安装指南
- 3Blue1Brown YouTube 频道 — Grant Sanderson 展示 Manim 完整功能的频道
- 原始 Manim 仓库 (3b1b) — Grant Sanderson 的个人制作分支
- Manim 文档 — 官方社区版文档和教程
- Manim 示例画廊 — 带源代码的示例动画集合