3Blue1Brown 源码索引
Agent 参考 3b1b 风格动画时的源码指引
源码仓库
| 仓库 | 说明 | 引擎 |
|---|---|---|
| 3b1b/videos | 所有视频源码 | ManimGL |
| 3b1b/manim | 3b1b 的 Manim 分支 | ManimGL |
| manim/community | 社区维护版(本项目使用) | Manim Community |
本项目使用 Manim Community v0.20+,与 ManimGL 有 API 差异。
关键场景代码路径
线性代数的本质 (Essence of Linear Algebra)
3b1b/videos/ ├── eola/chapter3.py # 线性变换与矩阵 ├── eola/chapter4.py # 矩阵乘法 ├── eola/chapter6.py # 逆矩阵 ├── eola/chapter7.py # 列空间与零空间 ├── eola/chapter10.py # 特征向量与特征值 └── eola/chapter14.py # 抽象向量空间
微积分的本质 (Essence of Calculus)
3b1b/videos/ ├── eoc/chapter1.py # 微积分导论(面积与 π) ├── eoc/chapter2.py # 导数的本质(割线→切线) ├── eoc/chapter3.py # 用导数作图 ├── eoc/chapter7.py # 微分方程 └── eoc/chapter8.py # 积分
神经网络 (Neural Networks)
3b1b/videos/ ├── nn/activation.py # 激活函数 ├── nn/gradient_descent.py # 梯度下降 └── nn/backpropagation.py # 反向传播
3b1b 常用动画模式
1. 网格变形(线性变换)
grid = NumberPlane() matrix = [[2, 1], [1, 2]] self.play(grid.animate.apply_matrix(matrix), run_time=2)
2. 箭头表示向量
vec = Arrow(ORIGIN, [2, 1, 0], buff=0, color=YELLOW)
label = MathTex(r"\vec{v}", font_size=30, color=YELLOW).next_to(vec, UR, buff=0.1)
self.play(GrowArrow(vec), FadeIn(label))
3. 数轴上的点移动
number_line = NumberLine(x_range=[-3, 3, 1])
dot = Dot(number_line.n2p(1), color=YELLOW)
label = always_redraw(lambda: MathTex(
f"{number_line.p2n(dot.get_center()):.1f}",
font_size=24,
).next_to(dot, UP, buff=0.15))
self.add(dot, label)
self.play(dot.animate.move_to(number_line.n2p(2.5)), run_time=1.5)
4. 逐步展开公式
steps = VGroup(
MathTex(r"f(x)"),
MathTex(r"= x^2 + 2x + 1"),
MathTex(r"= (x + 1)^2"),
).arrange(RIGHT, buff=0.3)
for step in steps:
self.play(Write(step), run_time=0.8)
self.wait(0.3)
5. 高亮强调
self.play(Indicate(formula[0][5:8], color=YELLOW, scale_factor=1.5)) rect = SurroundingRectangle(key_part, color=YELLOW, buff=0.1) self.play(Create(rect))
6. 相机缩放聚焦
class ZoomDemo(MovingCameraScene):
def construct(self):
plane = NumberPlane()
self.play(Create(plane))
self.play(self.camera.frame.animate.scale(0.3).move_to([1, 1, 0]), run_time=1.5)
self.wait(1)
self.play(self.camera.frame.animate.scale(3.3), run_time=1.5)
ManimGL vs Manim Community 差异速查
| 功能 | ManimGL (3b1b) | Manim Community (本项目) |
|---|---|---|
| 安装 | pip install manimgl | pip install manim |
| 运行 | manimgl file.py | manim -ql file.py Class |
| 3D 相机 | self.camera 直接操作 | MovingCameraScene / ThreeDScene |
| Riemann | n=10 | dx=0.3 |
| 颜色常量 | BLUE, BLUE_D | BLUE_D, PURE_BLUE, ManimColor |
| 网格变换 | apply_matrix 直接用 | apply_matrix 同样可用 |
| 光线追踪 | 内置 | 不支持 |
| 着色器 | OpenGL 着色器 | Cairo 渲染 |
3b1b 风格特征
- 深色背景:默认黑色,视觉焦点集中
- 少量配色:黄、蓝、绿为主,红为强调
- 流畅动画:smooth 缓动,时间控制精准
- 数学直觉:用几何可视化代替纯符号推导
- 逐步构建:复杂概念分步出现,每步停留
- 相机运动:缩放、平移引导注意力
- 手写风格:Write 动画模拟手写过程
参考视频
| 视频 | 时长 | 核心技法 |
|---|---|---|
| 微积分的本质 | 17min | 导数几何意义、割线→切线 |
| 线性代数的本质 | 16min | 向量、线性变换 |
| 但什么是微分方程呢 | 22min | 微分方程可视化 |
| 傅里叶变换 | 25min | 频域可视化 |
| 神经网络 | 20min | 神经元可视化 |
下一步:Skills → 一键生成视频