关于 manim
manim 是使用 Python 制作数学、物理和计算机科学动画的技能,适用于教育视频创作者。它可排版公式、绘制动态图表和几何场景,并渲染为确定性的 MP4 或 GIF。
主要功能
- 01用矢量对象构建场景
- 02动画呈现和变换公式
- 03绘制函数并实时更新数值
- 04制作 3D 场景与镜头运动
- 05渲染 MP4、GIF 或静帧
适用场景
- 01展示公式推导过程
- 02演示点沿图像移动
- 03讲解几何或 3D 概念
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ iart-ai/ manim-skills --skill manim安装后在 Claude Code 中输入/manim确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdreferences/3d-and-camera.mdgraphs-and-updaters.mdmath-and-text.md详细介绍
Manim(程序化数学动画)
Manim(数学动画引擎,社区版)通过 Python 渲染数学、物理和计算机科学讲解视频,是 3Blue1Brown 风格动画背后的引擎。每个场景都以声明式方式构建:创建矢量对象,在对象上播放定时动画,然后通过 CLI 渲染出确定性的 MP4/GIF。它尤其擅长动态公式、公式变形、动态图表和几何直觉演示。
适用场景
- 为公式制作动画:将公式写出,逐项变换,并突出显示代换内容。
- 可视化函数或图表:坐标轴、绘制的曲线、沿曲线移动的点,以及曲线下方的面积。
- 几何或概念讲解:逐步展开的证明、向量、变换、数轴。
- 3D 数学:曲面、参数曲线、围绕形状旋转的摄像机。
- 任何“展示数学动态变化”的教育短片,渲染为 MP4/GIF。
它不适用于 UI 动效、社交媒体/营销视频或基于 CSV 数据的商业图表——这些场景请使用 Web 动画或 Remotion 视频技能。Manim 的优势在于数学排版和直觉演示。
安装与渲染
pip install manim # needs Python 3.9+, ffmpeg, and a LaTeX distribution (for Tex/MathTex)
manim -pql scene.py SquareToCircle # render one Scene class, preview at low quality
渲染标志(重要选项):
-q l|m|h|k— 质量:从低(快速迭代)到 4K。构建时使用-ql,发布时使用-qh。-p— 完成后播放;-o name— 输出文件名;--format=gif— 渲染 GIF(README 演示)。-s— 将最后一帧保存为 PNG(不编码视频——这是验证手段,见下文)。-n a,b— 仅渲染动画索引范围a..b(提前停止,以检查某个时刻)。- 输出文件位于
media/videos/<file>/<quality>/<Scene>.mp4(使用-s时,图像位于media/images/...)。
三个构建模块
所有内容都由 Scene(编排)通过 Animation(定时变化)作用于 Mobject(对象)构成。
from manim import *
class SquareToCircle(Scene):
def construct(self): # ALL animation code lives in construct()
sq = Square().set_fill(BLUE, opacity=0.5)
self.play(Create(sq)) # animate it drawing on
self.play(sq.animate.rotate(PI / 4))
self.play(Transform(sq, Circle().set_fill(PINK, opacity=0.5)))
self.wait(0.5) # hold
Mobject — 矢量对象(Circle、Square、Rectangle、Line、Dot、Polygon、Axes、Text、MathTex)。
- 位置:
.shift(UP*2)(相对位置)、.move_to(ORIGIN)(绝对位置)、.next_to(other, RIGHT, buff=0.5)、.align_to(other, LEFT)。方向为常量:UP DOWN LEFT RIGHT ORIGIN UL UR DL DR。 - 样式:
.set_fill(color, opacity)、.set_stroke(color, width)、.set_color(YELLOW)。颜色:BLUE RED GREEN YELLOW WHITE,以及BLUE_E等。 self.add(m)会立即显示(不播放动画);self.remove(m)会移除对象。后添加的对象会显示在上层。
Animation — 在 run_time 秒内对 Mobject 的状态进行插值(默认 1 秒)。
- 构建:
Create、Write(用于文本/Tex)、DrawBorderThenFill、FadeIn、FadeOut、GrowFromCenter。 - 变换:
Transform(a, b)(将 a 变形成 b,并保留 a)、ReplacementTransform(a, b)(用 b 替换 a)、Rotate、Indicate、Circumscribe、Wiggle。 .animate语法 — 为任意方法调用添加动画:self.play(sq.animate.shift(UP).set_fill(RED))。链式调用会同时应用。- 同时播放多个动画:
self.play(Create(a), FadeIn(b), run_time=2)。
时序与缓动 — run_time= 设置时长;rate_func= 设置缓动曲线(默认是 smooth,即缓入缓出;还包括 linear、rush_into、rush_from、there_and_back、ease_out_bounce)。使用 LaggedStart(*anims, lag_ratio=0.2) 错开一组动画。motion-design-skills 技能包中的动画制作原则(animation-principles:眼睛对缓慢的结束比对缓慢的开始更不宽容;仅将 linear 用于循环;错开动画组)同样适用——在 Manim 中,只需通过 rate_func + LaggedStart 表达这些原则。
数学、文本与公式
标签使用 Text/MarkupText(Pango,不使用 LaTeX);排版数学内容使用 Tex/MathTex(LaTeX,原始字符串)。使用 Write 为公式制作动画,并使用 TransformMatchingTex 在公式之间变形。完整用法示例——子串着色、{{ }} 隔离、逐项变换、LaTeX 前导区——见 references/math-and-text.md。
图表、绘图与更新器
函数可使用 Axes + ax.plot(lambda x: ...);ax.c2p(x, y) 可将数学坐标映射到屏幕坐标。使用 ValueTracker + always_redraw/add_updater 驱动实时数值,让依赖的 mobject 每帧重新计算(例如沿曲线移动的点、计数器、移动的切线)。请参阅 references/graphs-and-updaters.md。
3D 与移动摄像机
使用 ThreeDScene + set_camera_orientation(phi=, theta=)、ThreeDAxes、Surface、begin_ambient_camera_rotation();使用 MovingCameraScene + self.camera.frame.animate... 实现 2D 摄像机的推进和跟随。请参阅 references/3d-and-camera.md。
交付与验证(渲染帧 → MP4)
内置辅助脚本(
scripts/):使用scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png拼接静帧,再使用scripts/probe-mp4.sh out.mp4 [WxH] [fps]验证编码。请参阅scripts/README.md。
Manim 是确定性的——相同场景会渲染出相同帧——因此在提交完整视频前,请先渲染帧(PNG,不进行视频编码)进行验证。只要输出是数学短片 MP4/GIF,就请采用此方法。
输出要求:
- 每个短片对应一个
.py文件,其中包含一个Scene(或ThreeDScene)子类;所有动作都写在construct()中。交付内容 = 渲染后的media/videos/.../<Scene>.mp4和脚本(以便重新渲染)。 - 所有
Tex/MathTex都使用原始字符串(r"...");需安装 LaTeX。
验证流程——渲染帧 → 检查 → 编码视频:
# 1. Save the final frame as a PNG, low quality — fast, no encode
manim -sql scene.py MyScene
# 2. Inspect a MID moment: stop after animation N and save that frame
manim -sql scene.py MyScene -n 0,3 # frame after the first 3 animations
# 3. Check each PNG: fidelity (equation correct, axes/labels right, nothing
# overlapping or off the 16:9 frame) + LaTeX actually compiled (no blank/box glyphs).
# 4. Only once frames look right, encode the video:
manim -qh scene.py MyScene # full MP4 at high quality
manim -qm scene.py MyScene --format=gif # GIF for a README demo
完成前请确认:
manim -sql ... -n a,b能在开头 / 中间范围 / 结尾干净地完成渲染——没有 LaTeX 错误,也没有缺失字形方框。- 方程和标签在数学上正确,且完全位于画面内(边缘没有裁切)。
- 检查的帧中,mobject 之间没有重叠;使用
next_to/arrange,而不是凭感觉猜坐标。 - 节奏自然——有意设置
run_time/rate_func,使用self.wait()停留在关键状态,并让组内元素错开出现,而非同时出现。 - 完整 MP4 编码并能播放;(可选)为 README 渲染 GIF。
快速参考
| 需求 | 使用方式 |
|---|---|
| 新建动画 | class S(Scene): def construct(self): ... |
| 立即显示 / 动画显示 | self.add(m) / self.play(Create(m)) |
| 为方法添加动画 | self.play(m.animate.shift(UP)) |
| 变形 / 替换 | Transform(a,b) / ReplacementTransform(a,b) |
| 排版数学公式 | MathTex(r"e^{i\pi}+1=0"),使用 Write 添加动画 |
| 变形方程 | TransformMatchingTex(eq1, eq2) |
| 绘制函数图像 | ax=Axes(...); ax.plot(lambda x: x**2) |
| 实时 / 关联数值 | ValueTracker + always_redraw(...) |
| 设置相对位置 | m.next_to(other, RIGHT, buff=0.3) |
| 时长 / 缓动 | self.play(a, run_time=2, rate_func=smooth) |
| 让组内元素错开出现 | LaggedStart(*anims, lag_ratio=0.2) |
| 渲染 / 检查 / GIF | manim -qh f.py S / -sql -n a,b / --format=gif |
注意事项
Tex/MathTex需要 LaTeX(Text不需要)。出现缺失字形方框或编译错误,说明未安装 LaTeX 或 TeX 字符串有误。始终使用原始字符串r"..."。Transform(a, b)会修改a,使其外观变为b(且不会添加b);ReplacementTransform(a, b)会让b留在屏幕上——请根据之后需要继续引用哪个对象来选择。.animate会在起始状态和结束状态之间插值,因此旋转 / 某些变换可能会走奇怪的路径;路径很重要时,请使用专用动画(Rotate)。- 使用
add_updater添加的更新器会持续运行——完成后请调用mob.clear_updaters()(或remove_updater),否则后续动画会与更新器冲突。 - 不要凭感觉猜坐标;使用
next_to、arrange、VGroup(...).arrange(DOWN)和ax.c2p()进行组合,确保布局在修改后仍然合适。 construct()只运行一次,用于编排时间线;它不是实时循环——切勿使用墙上时钟时间或未设置种子的随机数。
参考文件
references/math-and-text.md— Text、MarkupText、Tex 和 MathTex 的区别、原始字符串、子字符串着色(set_color_by_tex、substrings_to_isolate、{{ }})、TransformMatchingTex项变换,以及 LaTeX 前导区和软件包。references/graphs-and-updaters.md—Axes/NumberPlane、plot、get_area、c2p/p2c、ValueTracker、always_redraw、add_updater、沿曲线描点,以及动画计数器。references/3d-and-camera.md—ThreeDScene、set_camera_orientation、ThreeDAxes、Surface/参数曲面、环境摄像机旋转,以及MovingCameraScene的推近和跟随。