Manim 入门:把数学画成动画的造物快乐
看过 3Blue1Brown 的视频吗?向量在空间中旋转、傅里叶级数逐项叠加逼近方波——那种”数学活起来”的观感,背后是一个叫 Manim 的 Python 动画引擎。这篇讲怎么入门它:从安装到做出你的第一个数学动画。
Manim 是什么
一句话:用代码写动画,专精数学可视化。
你写 Python 脚本描述场景——一个坐标系、一条曲线、一个公式——然后 Manim 把它渲染成视频或 GIF。它的杀手锏:
- 数学原生:LaTeX 公式、坐标系、函数曲线、几何变换都是一等公民
- 精确可控:每一帧都由代码决定,可复现、可版本管理
- Transform 是灵魂:公式 A 变形为公式 B、圆展开成直线,这种”连续变形”的叙事是普通动画工具做不到的
两个版本要分清:
| 版本 | 说明 |
|---|---|
| ManimCE(Community Edition) | 社区维护,文档全、安装顺,新手选这个(pip install manim) |
| ManimGL | Grant 本人维护的 3b1b 内部版本,迭代快但文档少 |
下面全部以 ManimCE 为准。
安装
需要 Python 3.9+ 和两个系统依赖(渲染用 FFmpeg,LaTeX 用 MiKTeX/TeX Live):
# macOS
brew install ffmpeg
brew install --cask mactex
# Ubuntu
sudo apt install ffmpeg texlive
# 然后装 manim
pip install manim
验证安装:
manim --version
LaTeX 是给公式渲染用的(MathTex)。如果暂时不想装几十 GB 的 TeX Live,可以先跳过——只用 Text() 不用 MathTex() 也能做很多事。
第一个场景
Manim 的代码单元叫 Scene(场景)。写一个类,construct 方法里描述动画:
from manim import *
class SquareToCircle(Scene):
def construct(self):
circle = Circle().set_fill(PINK, opacity=0.5)
square = Square().set_fill(BLUE, opacity=0.5)
self.play(Create(square)) # 画出正方形
self.play(Transform(square, circle)) # 变形成圆
self.play(FadeOut(square)) # 淡出
渲染命令:
manim -pql square_to_circle.py SquareToCircle
参数解读:-p 渲染完自动播放,-ql 是低画质(480p,渲染快,调试用)。出成品时换 -qh(1080p)。你会看到:一个蓝色正方形平滑变形为粉色圆——四行代码,一个动画。
核心概念速览
Mobject:万物皆对象
Circle、Square、MathTex、Axes……都继承自 Mobject(Mathematical Object)。它们有位置、颜色、缩放,可以被排列(next_to、align_to)、变换(Transform、Rotate)。
常用几何:Circle Square Rectangle Line Arrow Brace(大括号)
文本:Text("中文")(走系统字体)、MathTex(r"\int_0^\infty e^{-x} dx")(走 LaTeX)
play:动画的动词
self.play(...) 播放一个动画,self.wait(1) 停顿一秒。常用动词:
| 动画 | 效果 |
|---|---|
Create / Uncreate | 沿路径画出 / 擦除 |
Write | 手写体逐字写出(公式常用) |
FadeIn / FadeOut | 淡入淡出 |
Transform | A 连续变形为 B |
ReplacementTransform | 同上,但 A 被 B 替换 |
Indicate / Circumscribe | 强调闪烁 / 圈注 |
一个 play 里可以同时放多个动画:self.play(Create(a), Write(b), run_time=2)。
坐标系与函数曲线
数学可视化的主角:
class PlotExample(Scene):
def construct(self):
axes = Axes(
x_range=[-3, 3, 1],
y_range=[-2, 2, 1],
axis_config={"include_numbers": True},
)
sin_graph = axes.plot(lambda x: np.sin(x), color=BLUE)
label = MathTex(r"y = \sin(x)").next_to(axes, UP)
self.play(Create(axes), Write(label))
self.play(Create(sin_graph))
axes.plot(lambda x: ...) 接收任意 Python 函数——这意味着你的动画可以直接复用 NumPy 生态。
ValueTracker:让参数动起来
进阶必备:用一个连续变化的数值驱动整条曲线更新,这是”傅里叶逐项逼近”这类动画的核心机制:
class MovingCircle(Scene):
def construct(self):
tracker = ValueTracker(0) # 参数 t 从 0 开始
circle = always_redraw(lambda: Circle(radius=1 + tracker.get_value()))
self.add(circle)
self.play(tracker.animate.set_value(2), run_time=3)
always_redraw + ValueTracker 的组合 = 参数式动画。掌握这个,你就从”摆图形”进入”做叙事”了。
上手路径建议
- 抄一遍官方示例:docs.manim.community 的 Example Gallery 全部跑通
- 复刻一个 3b1b 片段:比如”圆的定义”或”勾股定理的图形证明”,做完你对 Transform 的理解会质变
- 做一个小作品:把最近文章里的一个概念(K8s 的伸缩?状态机的流转?)做成 30 秒动画——给技术博客配 Manim 动图是我见过最惊艳的用法
- 进阶再看:
AnimationGroup编排时序、Updaters帧级回调、ThreeDScene三维场景
值不值得学
诚实的成本收益:
- 成本:环境折腾半天、每个动画渲染几分钟、学一套特有的思维模型(一切皆 Mobject + 动画动词)
- 收益:表达能力的天花板极高。PPT 做不出公式变形,录屏做不出精确的几何叙事。一旦学会,你的数学/算法/技术讲解内容会和其他人拉开代差
我的建议:如果你的输出里有”讲解”这个场景——技术博客、课程、论文答辩——Manim 值得一周的入门时间。它不是效率工具,是表达工具。
结语
从四行代码的正方形变圆开始,到参数驱动的动态系统——Manim 给的不是一个工具,是一种”让思想可见”的能力。
pip install manim
manim -pql my_first_scene.py SquareToCircle
跑通这一行命令,你就已经入门了。剩下的,交给好奇心。