CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
POSTS / P-165 · 教程

Manim 入门:把数学画成动画的造物快乐

Manim 入门:把数学画成动画的造物快乐

看过 3Blue1Brown 的视频吗?向量在空间中旋转、傅里叶级数逐项叠加逼近方波——那种”数学活起来”的观感,背后是一个叫 Manim 的 Python 动画引擎。这篇讲怎么入门它:从安装到做出你的第一个数学动画。

Manim 是什么

一句话:用代码写动画,专精数学可视化

你写 Python 脚本描述场景——一个坐标系、一条曲线、一个公式——然后 Manim 把它渲染成视频或 GIF。它的杀手锏:

  • 数学原生:LaTeX 公式、坐标系、函数曲线、几何变换都是一等公民
  • 精确可控:每一帧都由代码决定,可复现、可版本管理
  • Transform 是灵魂:公式 A 变形为公式 B、圆展开成直线,这种”连续变形”的叙事是普通动画工具做不到的

两个版本要分清:

版本说明
ManimCE(Community Edition)社区维护,文档全、安装顺,新手选这个pip install manim
ManimGLGrant 本人维护的 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:万物皆对象

CircleSquareMathTexAxes……都继承自 Mobject(Mathematical Object)。它们有位置、颜色、缩放,可以被排列(next_toalign_to)、变换(TransformRotate)。

常用几何: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淡入淡出
TransformA 连续变形为 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 的组合 = 参数式动画。掌握这个,你就从”摆图形”进入”做叙事”了。

上手路径建议

  1. 抄一遍官方示例docs.manim.community 的 Example Gallery 全部跑通
  2. 复刻一个 3b1b 片段:比如”圆的定义”或”勾股定理的图形证明”,做完你对 Transform 的理解会质变
  3. 做一个小作品:把最近文章里的一个概念(K8s 的伸缩?状态机的流转?)做成 30 秒动画——给技术博客配 Manim 动图是我见过最惊艳的用法
  4. 进阶再看:AnimationGroup 编排时序、Updaters 帧级回调、ThreeDScene 三维场景

值不值得学

诚实的成本收益:

  • 成本:环境折腾半天、每个动画渲染几分钟、学一套特有的思维模型(一切皆 Mobject + 动画动词)
  • 收益:表达能力的天花板极高。PPT 做不出公式变形,录屏做不出精确的几何叙事。一旦学会,你的数学/算法/技术讲解内容会和其他人拉开代差

我的建议:如果你的输出里有”讲解”这个场景——技术博客、课程、论文答辩——Manim 值得一周的入门时间。它不是效率工具,是表达工具

结语

从四行代码的正方形变圆开始,到参数驱动的动态系统——Manim 给的不是一个工具,是一种”让思想可见”的能力。

pip install manim
manim -pql my_first_scene.py SquareToCircle

跑通这一行命令,你就已经入门了。剩下的,交给好奇心。

← 返回文章列表