Manim 全面对比:3b1b 原版 vs 社区版,87k+39k star 的两个数学动画引擎怎么选
痛点切入
你看过 3Blue1Brown 的视频——那些丝滑的数学可视化动画,傅里叶变换在屏幕上旋转,线性代数的矩阵变换实时作用于几何图形。你想做类似的东西,但打开 PowerPoint 做不出来,用 After Effects 调参数调到崩溃,用 Blender 建模建到怀疑人生。
问题不是”哪个工具能做动画”,而是哪个工具能让你用代码精确描述”第 3 秒让这条曲线从蓝色渐变为红色,同时镜头从俯视旋转 45 度到侧视”这种事。
Manim 就是为这个需求而生的。它是 3Blue1Brown 视频背后的那个引擎,87.8k GitHub star,MIT 协议,Python 写的。
项目简介
Manim 全称 Mathematical Animation Engine,由 Grant Sanderson(3Blue1Brown 频道主理人)开发。但”Manim”现在指两个不同的项目,这是新手最常踩的坑:
| 3b1b/manim(原版) | ManimCommunity/manim(社区版) | |
|---|---|---|
| Star | 87.8k | 39.1k |
| Fork | 7.3k | 2.9k |
| Watcher | 933 | 52 |
| 提交数 | 6,369 | 6,264 |
| pip 包名 | manimgl | manim |
| 渲染引擎 | OpenGL(GPU) | Cairo(CPU),可选 OpenGL |
| 语言占比 | Python 96.4%,GLSL 3.6% | Python 98.2%,GLSL 1.6% |
| 最新版本 | v1.7.2(2024-12) | v0.20.1(2026-02) |
| 发布数 | 13 | 33 |
| 文档 | 基础,以示例为主 | 完善,ReadTheDocs + 官网 |
| 测试 | 无 CI | 完整 CI + Codecov |
| Docker | 无 | 官方镜像 |
| Jupyter | 无 | %%manim magic |
| 协议 | MIT | MIT(双版权方) |
简单说:3b1b/manim 是 Grant 自己用的版本,ManimCommunity/manim 是给社区用的版本。
2020 年社区 fork 出了 Manim Community Edition,目标是更稳定、测试更完善、社区贡献更友好。Grant 本人继续维护自己的版本,但社区版才是目前活跃开发的主流选择。
为什么是它
代码即动画:精确到像素的控制
Manim 的核心理念是用 Python 代码描述动画,而不是拖拽时间线。两个版本都支持:
- 每个对象在每一帧的位置、颜色、缩放
- 镜头运动的起止时间、插值方式、旋转角度
- LaTeX 公式的逐符号高亮和变换
- 3D 场景的相机轨迹和光照
这不是”做个动画”,而是”用代码描述一个数学对象在时间维度上的变化”。你写的不是脚本,是数学对象的行为定义。
渲染管线:OpenGL vs Cairo,核心分歧
这是两个版本最本质的区别:
3b1b/manim 用 OpenGL(GPU 渲染):
- 实时预览窗口——写代码时直接看到动画效果,不用等渲染
- GPU 加速——复杂场景渲染速度比 CPU 方案快一个数量级
- GLSL 着色器——可以写自定义视觉效果,项目里 3.6% 的代码就是 GLSL
- 代价:需要 OpenGL 支持,macOS ARM 需要额外装 Cairo,系统要求更高
ManimCommunity/manim 用 Cairo(CPU 渲染):
- 跨平台兼容性更好——不需要 GPU 支持
- 渲染结果更可预测——Cairo 的 2D 渲染一致性高
- 可选 OpenGL 后端——社区版也支持切换到 OpenGL,但默认是 Cairo
- 代价:渲染速度较慢,复杂场景可能需要等
选择建议: 如果你要做 3D 场景或需要实时预览,选 3b1b 版本。如果你主要做 2D 数学动画、看重稳定性,社区版更省心。
3Blue1Brown 的实战背书
3b1b/manim 的最大优势是经过真实项目验证。3Blue1Brown 的每一期视频都是用它做的,所有源代码在 3b1b/videos 开放。这意味着:
- API 经过真实项目验证,不是理论设计
- 有大量真实场景的代码参考
- 作者自己在用,遇到问题会修
社区版的优势则是工程化程度更高:完整的 CI 流水线、Codecov 覆盖率、官方 Docker 镜像、Jupyter magic 命令、33 次发布(对比原版 13 次)。它更像一个”正经的开源项目”,而不是”某个人的工具刚好开源了”。
快速上手
3b1b 原版(ManimGL)
# 安装(注意包名是 manimgl)
pip install manimgl
# 运行示例
manimgl example_scenes.py OpeningManimExample
注意:系统依赖:FFmpeg、OpenGL、LaTeX(可选,用公式时需要)。macOS 用 homebrew 装:
brew install ffmpeg mactex
# ARM Mac 还需要装 Cairo
arch -arm64 brew install pkg-config cairo
社区版(ManimCE)
# 安装(注意包名是 manim)
pip install manim
# 运行示例
manim -p -ql example.py SquareToCircle
社区版的文档更完善,安装指南在 docs.manim.community。还支持 Docker 一键启动:
docker run -it -v "$PWD":/ manimcommunity/manim manim -p -ql example.py SquareToCircle
也支持 Jupyter Notebook 里直接用 %%manim magic 命令。
代码对比
两个版本的 API 有差异。同一个”正方形变圆”的动画:
3b1b 版本:
from manimlib import *
class SquareToCircle(Scene):
def construct(self):
circle = Circle()
square = Square()
square.flip(RIGHT)
square.rotate(-3 * TAU / 8)
circle.set_fill(PINK, opacity=0.5)
self.play(ShowCreation(square))
self.play(Transform(square, circle))
self.play(FadeOut(square))
社区版:
from manim import *
class SquareToCircle(Scene):
def construct(self):
circle = Circle()
square = Square()
square.flip(RIGHT)
square.rotate(-3 * TAU / 8)
circle.set_fill(PINK, opacity=0.5)
self.play(Create(square))
self.play(Transform(square, circle))
self.play(FadeOut(square))
注意区别:from manimlib import * vs from manim import *,ShowCreation vs Create。两个版本的类名和方法名有差异,代码不能直接互换。
亮点代码
3b1b/videos 仓库里有所有 3Blue1Brown 视频的源代码。举个例子,《线性代数的本质》系列里,矩阵变换是这样实现的:
# 矩阵作用于平面的动画(简化版)
class MatrixTransformation(Scene):
def construct(self):
# 创建坐标平面
plane = NumberPlane()
# 创建一个向量
vector = Arrow(ORIGIN, [2, 1, 0], color=YELLOW)
# 矩阵变换:shear
matrix = [[1, 1], [0, 1]]
# 先显示平面和向量
self.play(ShowCreation(plane))
self.play(ShowCreation(vector))
# 应用矩阵变换,整个平面跟着变
self.play(plane.animate.apply_matrix(matrix))
self.play(vector.animate.apply_matrix(matrix))
self.wait()
这段代码做了什么:先显示一个坐标平面和一个向量,然后一个 shear 变换同时作用于平面和向量——观众能直观看到”矩阵就是空间的变换”。
更复杂的场景,比如《傅里叶变换》里的旋转矢量叠加,在 3b1b/videos 仓库里都有完整源码。那些视频里每一帧的数学精度、颜色搭配、镜头运动,全都是代码控制的。
两个版本怎么选
选 3b1b/manim 的情况
- 你要做 3D 场景——OpenGL 渲染管线对 3D 支持更好
- 你想复刻 3Blue1Brown 的风格——这就是原版,API 和视频源码完全对应
- 你需要实时预览——写代码时直接弹窗看效果,不用等渲染
- 你要写自定义 GLSL 着色器——项目本身就有 3.6% 的 GLSL 代码
- 你愿意自己啃文档和源码——社区版的文档更全,但原版更灵活
选 ManimCommunity/manim 的情况
- 你是新手——文档完善、安装简单、社区活跃
- 你要稳定生产——33 次发布、完整 CI、Codecov 覆盖
- 你需要Docker 部署——官方镜像开箱即用
- 你要在Jupyter Notebook 里用——%%manim magic 命令直接跑
- 你做2D 数学动画——Cairo 渲染足够,兼容性更好
- 你想贡献代码——社区版的贡献流程更规范
不能混装
两个版本的 pip 包名不同(manimgl vs manim),import 路径不同(from manimlib import * vs from manim import *),部分 API 方法名不同(ShowCreation vs Create)。不要在同一环境里同时装两个版本,会冲突。
社区资源
- 社区版官网:manim.community
- 社区版文档:docs.manim.community
- 原版文档:3b1b.github.io/manim
- 中文文档:docs.manim.org.cn(manim-kindergarten 维护)
- manim_sandbox:额外的工具类和示例代码
- Reddit r/manim 和 Discord 社区活跃
适用场景与局限
适合用的场景:
- 数学/物理教学视频——这是它的本职工作
- 数据可视化的动画版本——比静态图表更有表现力
- 科技媒体内容——YouTube/B 站的数学科普视频
- 学术演示——用动画解释论文中的数学概念
不适合的场景:
- 快速做个 GIF 发社交媒体——杀鸡用牛刀,用 ffmpeg + PIL 更快
- 商业广告动画——Manim 的视觉风格偏学术,不适合商业审美
- 实时交互应用——它是离线渲染引擎,不是游戏引擎
- 非数学内容——为数学动画设计的 API,做其他事情会很别扭
踩坑提醒:
- pip 包名是
manimgl,不是manim。装错包会和社区版冲突 - macOS ARM 需要额外装 Cairo,否则会报错
- 3b1b 版本的文档不如社区版完善,遇到问题多看源码和 3b1b/videos 的示例
- 代码从旧版本迁移到新版本可能有 breaking changes——3b1b/videos 仓库的 README 里提到了这一点
结论
Manim 不是”另一个动画库”。它是”用代码描述数学对象在时间中的行为”这个理念的最纯粹实现。87.8k + 39.1k 的双仓库 star 说明了一件事:数学可视化动画的需求是真实的,而且两个版本各自满足了不同的用户群体。
如果你想做 3Blue1Brown 风格的 3D 动画,愿意啃文档,选 manimgl。如果你是新手、做 2D 动画、看重稳定性和文档,选 manim(社区版)。
不管选哪个,第一步都是装好、跑一个 example scene,感受一下代码控制动画是什么体验。
仓库(原版):https://github.com/3b1b/manim 仓库(社区版):https://github.com/ManimCommunity/manim