ManimGL:用代码精确编排数学动画的引擎——从 3Blue1Brown 到你的讲解视频
posts posts 2026-08-15T03:24:06+08:00Manim 是 Grant Sanderson(3Blue1Brown)开发的开源数学动画引擎,用精确的程序化动画制作数学讲解视频。本文聚焦作者原版 ManimGL:讲清它和 Manim Community 版的区别、安装、第一个场景怎么写、渲染流程与使用边界,并给出选型判断。技术笔记Manim, 动画, 数学, Python, 3Blue1BrownManimGL:用代码精确编排数学动画的引擎
核心判断:Manim 的价值在“精确”。它把数学动画从逐帧手工拖拽变成可复现的程序化编排,让每个几何变换、每条曲线运动都能被代码精确控制。它源于 Grant Sanderson(3Blue1Brown)做视频的个人工具。动手前必须分清一件事:3b1b/manim 是作者原版 ManimGL,与社区维护的 Manim Community 是两条不同的安装与生态路径,装错版本会一路踩坑。
本文按“为什么需要它 → 两个版本怎么区分 → 怎么写第一个场景 → 怎么渲染成片 → 边界与选型”的顺序展开。想最快拿到结论,直接跳到「怎么选」;想跟着写一遍,从「写一个场景」开始。
它解决的是什么
传统视频工具把动画拆成时间轴上的关键帧,创作者靠鼠标一帧帧调位置、颜色、速度。Manim 反着来:一段数学关系被写成 Python 对象,放到“场景”里,再用动画把它随时间的变化描述出来——一个向量绕定点旋转、一条曲线随公式形变、一次矩阵变换同时作用于画面上所有对象。
这套设计的好处在于重放。输入的数值一变,重跑一遍场景,整段动画跟着变,不需要回到每个关键帧上返工。3Blue1Brown 正是靠它把推导视频做成生产流水线:他每个视频背后的场景代码都公开在 3b1b/videos 仓库里,这些代码经受住了多年真实生产使用,反过来也压着原版 API 不断演进出可靠能力。
仓库现状:约 8.8 万 star(2026-08),Python,MIT 许可。star 是关注度信号,不等于安装量或稳定性,选型仍以前面的那件事为准。
两个版本,先分清再装
| 本仓库(3b1b/manim) | Manim Community | |
|---|---|---|
| 别称 | ManimGL | manim |
| pip 包名 | manimgl | manim |
| 维护方 | Grant Sanderson(原版) | ManimCommunity 社区 |
| 渲染 | OpenGL(GPU) | Cairo(CPU),可选 OpenGL |
| 特点 | 原版,个人驱动 | 更稳定、测试更好、社区响应快 |
| 目标 | 复现 3Blue1Brown 风格 | 易上手、更通用 |
| 文档 | 示例驱动、较简 | ReadTheDocs、官方站点 |
| 生态 | 无官方 Docker/Jupyter | 官方镜像、%%manim |
⚠️ README 明确警告:这些安装指令只适用于 ManimGL。把社区版安装说明套到原版(或反过来)会造成问题。请先决定用哪个版本,再只看对应版本的文档。这条警告是真实的版本区分依据,不是防呆口号。
渲染器差异不是性能八卦。ManimGL 用 OpenGL 渲染,复杂场景能靠 GPU 加速,还带实时预览窗口——边写边看,不用等渲染完。代价是依赖 OpenGL 环境。社区版默认走 Cairo(CPU),换平台更省心、输出更可预测,但复杂场景要等。
快速上手(ManimGL)
需要 Python 3.10+、FFmpeg、OpenGL,以及可选的 LaTeX(渲染数学公式时)。Linux 还需 Pango 及其开发头文件。
pip install manimgl
# 试运行
manimgl从源码开发:
git clone https://github.com/3b1b/manim.git
cd manim
pip install -e .
manimgl example_scenes.py OpeningManimExample
# 或
manim-render example_scenes.py OpeningManimExampleLinux(Ubuntu/Debian)系统依赖:
sudo apt update
sudo apt install ffmpeg
sudo apt install libpango1.0-dev
# 可选:轻量 LaTeX
sudo apt install texlive-science texlive-fonts-extra texlive-latex-extra建议用虚拟环境安装,避免与系统 Python 包冲突。
写一个场景:从代码到画面
ManimGL 里没有“画一帧”的概念,只有“定义一个场景,然后让它动”。最小结构是这样:
from manimlib import *
class SquareToCircle(Scene):
def construct(self):
square = Square()
circle = Circle()
self.play(ShowCreation(square))
self.wait()
self.play(Transform(square, circle))
self.wait()这段代码对应四个核心概念:
- 对象(Mobject):
Square()和Circle()是画面里的几何对象。它们不是像素,而是带坐标、颜色、描边等属性的数学结构,可以变换、组合、复用。 - 场景(Scene):
class SquareToCircle(Scene)定义一段独立的视频单元,construct是它的入口。一条视频就是一串场景按顺序跑完。 - 动画(Animation):
self.play(ShowCreation(square))让正方形从无到有画出来,Transform(square, circle)让正方形平滑变成圆形。self.play负责插值,你只声明起点和终点,引擎在对象上逐帧过渡。 - 节奏(wait):
self.wait()让画面停留一拍,给观众消化的时间。
保存成 scenes.py,然后渲染:
manimgl scenes.py SquareToCircle渲染完成后默认打开预览窗口。常用参数:
| 参数 | 作用 |
|---|---|
-w | 写入视频文件 |
-o | 写入并自动打开 |
-s | 跳过过程,只存最后一帧,出缩略图常用 |
-n 3 | 从场景的第 3 个动画开始渲染,调试常用 |
这四条参数来自官方示例文件顶部注释,是调试时最常用的几个。
理解了“对象 + 动画 + 渲染”这条链,就理解了为什么改参数是重跑而不是重画:动画的每一帧都由引擎按起点、终点和插值函数算出来,改一个数值,重跑一遍,整段跟着变。视频输出时,帧序列交给 FFmpeg 打包成文件。
常见问题与踩坑
Q:装了 manim,脚本里却报 manimlib 找不到?
多半是把包名混了。原版必须 pip install manimgl,社区版才是 manim。两个包可以共存,但同一个脚本只会认其中一个,写代码前先确认用的是哪个。
Q:渲染数学公式报 LaTeX 错误?
公式依赖 LaTeX。ManimGL 本身不含 TeX 发行版,需要系统里有 texlive 或 mactex。不想装全套,装 texlive-latex-extra 这类组合也能覆盖大部分公式。
Q:manimgl 打不开窗口,或报 OpenGL 错误?
ManimGL 走 OpenGL,必须有可用的图形环境。无头服务器没有显示环境,实时预览打不开;要么配虚拟显示,要么改用不依赖 GPU 的社区版走 Cairo 渲染。
Q:中文文本显示成方块或乱码?
文本渲染依赖系统字体,ManimGL 对字体的处理比社区版粗糙。先确认系统装了中文字体,再通过 Text 的 font 参数指定字体名称(官方示例里就是这么用 font="Consolas" 指定字体的)。
Q:渲染出来只有一帧,没有动起来?
确认命令里没有带 -s。-s 只存最后一帧;去掉它,self.play 声明的动画才会逐帧写入视频。
自测:确认你真的读懂了
- 看到
pip install manim,你装的是哪个版本?反过来manimgl呢? self.play(Transform(a, b))里,引擎替你做了哪件事?- 一段公式渲染不出来,先查哪个系统依赖?
这三问能答上来,版本、动画、渲染链三条主线就都通了。
适用边界
- 适合:制作数学 / 物理 / 算法讲解视频;想用代码精确控制动画、看重可复现性的人;复现 3Blue1Brown 风格的教学内容。
- 边界:ManimGL 是个人驱动的原版,API 更“原汁原味”,但迭代方向取决于作者,接口可能随他的视频需求变动;踩坑时能依赖的社区支持也比社区版少。
- 环境要求:FFmpeg + OpenGL 是硬依赖,LaTeX 可选但数学公式渲染时会用到。GPU 加速和实时预览只属于 ManimGL,不是社区版的卖点。
怎么选
- 想复现 3Blue1Brown 风格、要做实时预览、能接受 API 随作者演进的,直接用 ManimGL。
- 要稳定 API、完整文档和教程、想要 Docker 镜像或 Jupyter 集成的(面向长期项目或团队协作),先看 Manim Community。
- 二元落地建议:一个人做视频、追求 3B1B 效果 → ManimGL;多人协作、要工程化稳定 → Community。
进一步阅读
- 官方仓库与示例场景:https://github.com/3b1b/manim
- 两版安装区分说明:https://docs.manim.community/en/stable/faq/installation.html#different-versions
- 3Blue1Brown 视频仓库:https://github.com/3b1b/videos
- 社区版:https://github.com/ManimCommunity/manim
想深入,可以看官方 example_scenes.py 里的几个场景:AnimatingMethods 讲 .animate 语法,UpdatersExample 讲逐帧更新的对象,CoordinateSystemExample 讲坐标系作图——按这个顺序读,够你上手大部分 3B1B 风格效果。
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。