title: “Manim Video — Manim CE animations: 3Blue1Brown math/algo videos” sidebar_label: “Manim Video” description: “Manim CE animations: 3Blue1Brown math/algo videos”
{/* 本页面由 website/scripts/generate-skill-docs.py 根据技能对应的 SKILL.md 文件自动生成。请直接编辑源文件 SKILL.md,而非此页面。 */}
Manim 视频
Manim CE 动画:3Blue1Brown 风格的数学/算法教学视频。
技能元数据
| 来源 | 内置(默认已安装) |
| 路径 | skills/creative\manim-video |
| 版本 | 1.0.0 |
| 开发者 | SHL0MS, Hermes Agent |
| 许可协议 | MIT |
| 支持平台 | linux、macos、windows |
| 标签 | Manim、动画、数学、视频 |
参考:完整 SKILL.md 文件
Manim 视频制作流程
适用场景
当用户需要以下内容时可使用该技能:动画化讲解、数学动画、概念可视化、算法演示、技术说明视频、3Blue1Brown 风格的视频,或是任何包含几何/数学内容的程序化动画。它能够利用 Manim Community Edition 制作出 3Blue1Brown 风格的讲解视频、算法可视化内容、方程推导过程、架构图以及数据叙事作品。
创作标准
这属于教育类电影。每一帧都承载着教学意义,每一个动画元素都在揭示事物的结构。
在编写任何一行代码之前,先明确整个内容的叙事脉络。它要纠正哪些错误观念?怎样的时刻能带来“恍然大悟”的体验?又该通过怎样的视觉故事引导观众从困惑走向理解?用户的提示只是起点——应以富有教育意义的视角来解读它。
先讲几何,再讲代数。 先展示图形,再呈现公式。视觉记忆的编码速度远快于符号记忆。当观众先看到几何图案,再接触到公式时,就会觉得这个公式是水到渠成的。
首次渲染的结果就必须完美无缺。 输出内容必须在无需多次修改的情况下就做到视觉清晰、风格统一。如果画面显得杂乱无章、时机不当,或者有“AI生成的幻灯片”的感觉,那便是失败的。
通过透明度层次引导注意力。 切勿让所有元素都以最高亮度显示。主要元素设为1.0,背景元素设为0.4,结构元素(如坐标轴、网格)则设为0.15。人脑是按层次来处理视觉突出度的。
留出缓冲时间。 每个动画之后都必须加入self.wait()。这样能让观众有时间消化刚刚呈现的内容。绝不能急于切换到下一个动画。在关键信息显现后暂停2秒,绝非浪费时间。
保持统一的视觉语言。 所有场景都应使用相同的配色方案、一致的字体大小以及匹配的动画速度。即便技术上正确,但每个场景都使用随机颜色的视频,在美学上也是失败的。
先决条件
运行 scripts/setup.sh 即可检查所有依赖项。所需环境包括:Python 3.10 及以上版本、Manim Community Edition v0.20 及以上版本(可通过 pip install manim 安装)、LaTeX 编译工具(Linux 系统需安装 texlive-full,MacOS 系统需安装 mactex)以及 ffmpeg。参考文档是基于 Manim CE v0.20.1 版本进行测试的。
模式
| 模式 | 输入内容 | 输出结果 | 参考文档 |
|---|---|---|---|
| 概念解释器 | 主题/概念 | 具有几何直观性的动画讲解 | references/scene-planning.md |
| 方程推导器 | 数学表达式 | 分步演示的动画证明过程 | references/equations.md |
| 算法可视化工具 | 算法描述 | 包含数据结构展示的分步执行过程 | references/graphs-and-data.md |
| 数据叙事工具 | 数据/指标 | 动态图表、对比分析及计数器展示 | references/graphs-and-data.md |
| 架构图生成器 | 系统描述 | 逐步构建的组件结构及连接关系 | references/mobjects.md |
| 论文解释器 | 研究论文 | 关键发现与方法的动画演示 | references/scene-planning.md |
| 3D 可视化工具 | 3D 概念 | 旋转曲面、参数曲线及空间几何结构展示 | references/camera-and-3d.md |
技术栈
每个项目仅需一个 Python 脚本,无需浏览器、Node.js 或 GPU 支持。
| 层级 | 工具 | 用途 |
|---|---|---|
| 核心层 | Manim Community Edition | 场景渲染与动画引擎 |
| 数学表达式处理 | LaTeX (texlive/MiKTeX) | 通过 MathTex 功能实现公式渲染 |
| 视频输入输出 | ffmpeg | 场景拼接、格式转换及音频混音 |
| 文本转语音 | ElevenLabs / Qwen3-TTS(可选) | 为内容提供旁白配音 |
工作流程
PLAN --> CODE --> RENDER --> STITCH --> AUDIO (optional) --> REVIEW
- 规划阶段 — 编写
plan.md文件,明确故事情节脉络、场景列表、视觉元素、配色方案以及旁白脚本。 - 编码阶段 — 编写
script.py文件,为每个场景定义一个独立可渲染的类。 - 渲染阶段 — 使用
manim -ql script.py Scene1 Scene2 ...生成初稿,使用-qh参数进行最终输出。 - 拼接阶段 — 通过 ffmpeg 将各场景片段合并为
final.mp4文件。 - 音频处理(可选) — 利用 ffmpeg 添加旁白和/或背景音乐,详情请参阅
references/rendering.md。 - 审核阶段 — 生成预览帧,与规划内容对照检查并做相应调整。
项目结构
project-name/
plan.md # Narrative arc, scene breakdown
script.py # All scenes in one file
concat.txt # ffmpeg scene list
final.mp4 # Stitched output
media/ # Auto-generated by Manim
videos/script/480p15/
创意方向
颜色方案
| 颜色方案 | 背景色 | 主色调 | 辅助色 | 强调色 | 适用场景 |
|---|---|---|---|---|---|
| 经典 3B1B | #1C1C1C | #58C4DD(蓝色) | #83C167(绿色) | #FFFF00(黄色) | 通用数学/计算机科学内容 |
| 温暖学术风 | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | 更具亲和力的呈现风格 |
| 霓虹科技风 | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | 系统设计、架构相关内容 |
| 单色风格 | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | 极简主义风格 |
动画速度
| 使用场景 | 运行时间 | 动画结束后自停时间 |
|---|---|---|
| 标题/开场画面出现 | 1.5秒 | 1.0秒 |
| 关键公式展示 | 2.0秒 | 2.0秒 |
| 变形/过渡动画 | 1.5秒 | 1.5秒 |
| 辅助标签显示 | 0.8秒 | 0.5秒 |
| 淡出收尾动画 | 0.5秒 | 0.3秒 |
| “顿悟时刻”内容展示 | 2.5秒 | 3.0秒 |
字体大小规范
| 字体角色 | 字体大小 | 用途 |
|---|---|---|
| 标题 | 48 | 场景标题、开场文字 |
| 标题级文字 | 36 | 场景内的章节标题 |
| 正文 | 30 | 解释性文字 |
| 标签 | 24 | 注释、坐标轴标签 |
| 字幕 | 20 | 字幕、细则说明 |
字体选择
所有文本均应使用等宽字体。 Manim的Pango渲染器在所有字体大小下使用比例字体时都会出现字距异常问题。详细建议请参阅 references/visual-design.md 文件。
MONO = "Menlo" # define once at top of file
Text("Fourier Series", font_size=48, font=MONO, weight=BOLD) # titles
Text("n=1: sin(x)", font_size=20, font=MONO) # labels
MathTex(r"\nabla L") # math (uses LaTeX)
为确保良好的可读性,建议将font_size的值设置为至少18。
每个场景的差异化设计
切勿为所有场景使用完全相同的配置。针对每个场景:
- 从预设色板中选择不同的主色调
- 设计不同的布局结构——不必始终将所有元素居中
- 采用不同的动画起始方式,可在“写入”、“淡入”、“从中心扩展”及“创建”之间切换
- 调整视觉层次感,让部分场景内容密集,其他场景则相对简洁
工作流程
第一步:规划(plan.md)
在编写任何代码之前,先撰写plan.md文件。详细的模板可参考references/scene-planning.md。
第二步:编码(script.py)
每个场景对应一个类。所有场景都应能够独立渲染。
from manim import *
BG = "#1C1C1C"
PRIMARY = "#58C4DD"
SECONDARY = "#83C167"
ACCENT = "#FFFF00"
MONO = "Menlo"
class Scene1_Introduction(Scene):
def construct(self):
self.camera.background_color = BG
title = Text("Why Does This Work?", font_size=48, color=PRIMARY, weight=BOLD, font=MONO)
self.add_subcaption("Why does this work?", duration=2)
self.play(Write(title), run_time=1.5)
self.wait(1.0)
self.play(FadeOut(title), run_time=0.5)
常见模式:
- 每个动画的字幕:在代码中使用
self.add_subcaption("文本内容", duration=N),或在调用self.play()时直接使用subcaption="文本内容"。 - 在文件顶部定义通用的颜色常量,以确保不同场景之间的视觉一致性。
- 在每个场景中设置
self.camera.background_color。 - 流畅的场景结束方式:在场景结束时让所有 mobject 逐渐淡出,代码实现为
self.play(FadeOut(Group(*self.mobjects)))。
第 3 步:渲染
manim -ql script.py Scene1_Introduction Scene2_CoreConcept # draft
manim -qh script.py Scene1_Introduction Scene2_CoreConcept # production
第4步:整合拼接
cat > concat.txt << 'EOF'
file 'media/videos/script/480p15/Scene1_Introduction.mp4'
file 'media/videos/script/480p15/Scene2_CoreConcept.mp4'
EOF
ffmpeg -y -f concat -safe 0 -i concat.txt -c copy final.mp4
第5步:审核
manim -ql --format=png -s script.py Scene2_CoreConcept # preview still
重要实现注意事项
用于 LaTeX 的原始字符串
# WRONG: MathTex("\frac{1}{2}")
# RIGHT:
MathTex(r"\frac{1}{2}")
边缘文本的增强系数需大于或等于 0.5
label.to_edge(DOWN, buff=0.5) # never < 0.5
在替换文本前渐隐效果
self.play(ReplacementTransform(note1, note2)) # not Write(note2) on top
绝不对未添加的M对象应用动画效果
self.play(Create(circle)) # must add first
self.play(circle.animate.set_color(RED)) # then animate
性能指标
| 质量等级 | 分辨率 | 帧率 | 处理速度 |
|---|---|---|---|
-ql(草稿级) | 854x480 | 15 | 每场景 5-15 秒 |
-qm(中等级) | 1280x720 | 30 | 每场景 15-60 秒 |
-qh(成品级) | 1920x1080 | 60 | 每场景 30-120 秒 |
建议始终从 -ql 级别开始迭代优化,最终输出时再使用 -qh 级别进行渲染。
参考资料
| File | Contents |
|---|---|
references/animations.md | Core animations, rate functions, composition, .animate syntax, timing patterns |
references/mobjects.md | Text, shapes, VGroup/Group, positioning, styling, custom mobjects |
references/visual-design.md | 12 design principles, opacity layering, layout templates, color palettes |
references/equations.md | LaTeX in Manim, TransformMatchingTex, derivation patterns |
references/graphs-and-data.md | Axes, plotting, BarChart, animated data, algorithm visualization |
references/camera-and-3d.md | MovingCameraScene, ThreeDScene, 3D surfaces, camera control |
references/scene-planning.md | Narrative arcs, layout templates, scene transitions, planning template |
references/rendering.md | CLI reference, quality presets, ffmpeg, voiceover workflow, GIF export |
references/troubleshooting.md | LaTeX errors, animation errors, common mistakes, debugging |
references/animation-design-thinking.md | When to animate vs show static, decomposition, pacing, narration sync |
references/updaters-and-trackers.md | ValueTracker, add_updater, always_redraw, time-based updaters, patterns |
references/paper-explainer.md | Turning research papers into animations — workflow, templates, domain patterns |
references/decorations.md | SurroundingRectangle, Brace, arrows, DashedLine, Angle, annotation lifecycle |
references/production-quality.md | Pre-code, pre-render, post-render checklists, spatial layout, color, tempo |
创意发散模式(仅当用户要求生成实验性、创意性或独特的输出时使用)
若用户希望采用富有创意、实验性或非传统的方式来进行解释,应在设计动画之前选定策略并明确其逻辑依据。
- SCAMPER法 —— 适用于用户希望对常规解释方式进行创新性重构的场景
- 假设反转法 —— 适用于用户希望挑战事物通常被教授的方式的场景
SCAMPER法的应用思路
对标准的数学/技术可视化内容进行改造:
- 替换:更换原有的视觉隐喻(如用蜿蜒路径替代数轴,用城市网格替代矩阵)
- 组合:融合两种不同的解释方法(同时运用代数与几何方式)
- 反转:逆向推导——从最终结果出发,逐步分解为基本原理
- 修改:夸大某个参数以凸显其重要性(如将学习率提高10倍,样本量增加1000倍)
- 消除:去除所有符号表达——完全通过动画与空间关系来进行解释
假设反转法的具体步骤
- 列出该主题在可视化呈现上的“标准特征”(从左到右的顺序、二维界面、离散步骤、正式符号等)
- 确定其中最根本的假设
- 对该假设进行反转(如从右到左推导、将二维概念以三维形式呈现、用连续过渡替代分步展示、完全不使用符号)
- 探索这种反转所带来的新发现,即常规方法所隐藏的内容