跳到正文

目录

ManimGL:用代码精确编排数学动画的引擎——从 3Blue1Brown 到你的讲解视频

ManimGL:用代码精确编排数学动画的引擎

核心判断: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
别称ManimGLmanim
pip 包名manimglmanim
维护方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 OpeningManimExample

Linux(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()

这段代码对应四个核心概念:

  1. 对象(Mobject)Square()Circle() 是画面里的几何对象。它们不是像素,而是带坐标、颜色、描边等属性的数学结构,可以变换、组合、复用。
  2. 场景(Scene)class SquareToCircle(Scene) 定义一段独立的视频单元,construct 是它的入口。一条视频就是一串场景按顺序跑完。
  3. 动画(Animation)self.play(ShowCreation(square)) 让正方形从无到有画出来,Transform(square, circle) 让正方形平滑变成圆形。self.play 负责插值,你只声明起点和终点,引擎在对象上逐帧过渡。
  4. 节奏(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 发行版,需要系统里有 texlivemactex。不想装全套,装 texlive-latex-extra 这类组合也能覆盖大部分公式。

Q:manimgl 打不开窗口,或报 OpenGL 错误?

ManimGL 走 OpenGL,必须有可用的图形环境。无头服务器没有显示环境,实时预览打不开;要么配虚拟显示,要么改用不依赖 GPU 的社区版走 Cairo 渲染。

Q:中文文本显示成方块或乱码?

文本渲染依赖系统字体,ManimGL 对字体的处理比社区版粗糙。先确认系统装了中文字体,再通过 Textfont 参数指定字体名称(官方示例里就是这么用 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。

进一步阅读

想深入,可以看官方 example_scenes.py 里的几个场景:AnimatingMethods.animate 语法,UpdatersExample 讲逐帧更新的对象,CoordinateSystemExample 讲坐标系作图——按这个顺序读,够你上手大部分 3B1B 风格效果。

参与讨论

使用 GitHub 登录。欢迎补充事实、异议与实践。