关于 manim-video
manim-video 是基于 Manim Community Edition 的教育视频制作技能,面向制作数学、算法、数据和系统讲解的创作者。它以叙事规划、分场景动画和渲染审查组织制作流程。
主要功能
- 01规划叙事弧线与场景
- 02制作数学和算法动画
- 03生成图表与架构可视化
- 04逐场景渲染并拼接
- 05可选添加旁白或音乐
适用场景
- 01将数学概念制作成动画讲解
- 02展示算法逐步执行过程
- 03把研究论文或系统架构转为视频
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ browser-use/ video-use --skill manim-video安装后在 Claude Code 中输入/manim-video确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdreferences/animation-design-thinking.mdanimations.mdcamera-and-3d.mddecorations.mdequations.mdgraphs-and-data.mdmobjects.mdpaper-explainer.mdproduction-quality.mdrendering.mdscene-planning.mdtroubleshooting.mdupdaters-and-trackers.mdvisual-design.mdscripts/setup.sh详细介绍
Manim 视频制作流水线
创作标准
这是一种教育性影片。每一帧都要有教学作用,每一段动画都要揭示结构。
在写下任何一行代码之前,先阐明叙事弧线。它要纠正什么误解?"顿悟时刻"是什么?哪一条视觉故事线能带领观众从困惑走向理解?用户的提示词只是起点,应以教学上的野心去诠释它。
先几何,后代数。 先展示图形,再展示方程。视觉记忆比符号记忆编码得更快。当观众先看到几何规律,再看到公式时,方程才显得水到渠成。
首次渲染即要达到优秀水准,这是不可妥协的。 输出必须视觉清晰、审美统一,无需反复修改。如果画面杂乱、节奏失当,或者看起来像"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 | 场景拼接、格式转换、音频合成 |
| TTS | 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/
创作方向
Color Palettes
| Palette | Background | Primary | Secondary | Accent | Use case |
|---|---|---|---|---|---|
| Classic 3B1B | #1C1C1C | #58C4DD (BLUE) | #83C167 (GREEN) | #FFFF00 (YELLOW) | 通用数学/CS |
| Warm academic | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | 亲和友好 |
| Neon tech | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | 系统、架构 |
| Monochrome | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | 极简风格 |
Animation Speed
| Context | run_time | self.wait() after |
|---|---|---|
| Title/intro appear | 1.5s | 1.0s |
| Key equation reveal | 2.0s | 2.0s |
| Transform/morph | 1.5s | 1.5s |
| Supporting label | 0.8s | 0.5s |
| FadeOut cleanup | 0.5s | 0.3s |
| "Aha moment" reveal | 2.5s | 3.0s |
Typography Scale
| Role | Font size | Usage |
|---|---|---|
| Title | 48 | 场景标题、开场文字 |
| Heading | 36 | 场景内的小节标题 |
| Body | 30 | 解释性文字 |
| Label | 24 | 注释、坐标轴标签 |
| Caption | 20 | 字幕、小字说明 |
Fonts
所有文字都使用等宽字体。 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。
Per-Scene Variation
切勿所有场景使用相同配置。对每个场景:
- 使用调色板中不同的主色调
- 采用不同布局——不要总是把所有内容居中
- 采用不同的入场动画——在 Write、FadeIn、GrowFromCenter、Create 之间变化
- 采用不同的视觉密度——有的场景内容密集,有的场景内容稀疏
Workflow
Step 1: Plan (plan.md)
在编写任何代码之前,先编写 plan.md。完整模板请参阅 references/scene-planning.md。
Step 2: Code (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("text", duration=N)或在self.play()上设置subcaption="text" - 共享颜色常量:在文件顶部定义,以保证跨场景的一致性
self.camera.background_color:每个场景都要设置- 干净的收尾:场景结束时淡出所有对象:
self.play(FadeOut(Group(*self.mobjects)))
Step 3: Render
manim -ql script.py Scene1_Introduction Scene2_CoreConcept # draft
manim -qh script.py Scene1_Introduction Scene2_CoreConcept # production
Step 4: Stitch
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
Step 5: Review
manim -ql --format=png -s script.py Scene2_CoreConcept # preview still
Critical Implementation Notes
Raw Strings for LaTeX
# WRONG: MathTex("\frac{1}{2}")
# RIGHT:
MathTex(r"\frac{1}{2}")
buff >= 0.5 for Edge Text
label.to_edge(DOWN, buff=0.5) # never < 0.5
FadeOut Before Replacing Text
self.play(ReplacementTransform(note1, note2)) # not Write(note2) on top
Never Animate Non-Added Mobjects
self.play(Create(circle)) # must add first
self.play(circle.animate.set_color(RED)) # then animate
Performance Targets
| Quality | Resolution | FPS | Speed |
|---|---|---|---|
-ql (draft) | 854x480 | 15 | 每个场景 5-15 秒 |
-qm (medium) | 1280x720 | 30 | 每个场景 15-60 秒 |
-qh (production) | 1920x1080 | 60 | 每个场景 30-120 秒 |
始终在 -ql 下迭代。仅在输出最终成品时才渲染 -qh。
参考资料
| 文件 | 内容 |
|---|---|
references/animations.md | 核心动画、速率函数、组合、.animate 语法、时间安排模式 |
references/mobjects.md | 文本、形状、VGroup/Group、定位、样式、自定义 mobject |
references/visual-design.md | 12 条设计原则、不透明度分层、布局模板、调色板 |
references/equations.md | Manim 中的 LaTeX、TransformMatchingTex、推导模式 |
references/graphs-and-data.md | 坐标轴、绘图、BarChart、动画数据、算法可视化 |
references/camera-and-3d.md | MovingCameraScene、ThreeDScene、3D 曲面、摄像机控制 |
references/scene-planning.md | 叙事弧线、布局模板、场景转场、规划模板 |
references/rendering.md | CLI 参考、质量预设、ffmpeg、旁白工作流、GIF 导出 |
references/troubleshooting.md | LaTeX 错误、动画错误、常见错误、调试 |
references/animation-design-thinking.md | 何时使用动画,何时静态展示、分解、节奏、旁白同步 |
references/updaters-and-trackers.md | ValueTracker、add_updater、always_redraw、基于时间的 updater、模式 |
references/paper-explainer.md | 将研究论文转化为动画——工作流、模板、领域模式 |
references/decorations.md | SurroundingRectangle、Brace、箭头、DashedLine、Angle、注释生命周期 |
references/production-quality.md | 编码前、渲染前、渲染后检查清单、空间布局、颜色、节奏 |
创意发散(仅在用户要求实验性、创意性或独特的输出时使用)
如果用户要求采用创意性、实验性或非传统的讲解方式,请先选择一种策略并进行推理,再设计动画。
- SCAMPER —— 用户希望以新颖方式讲解常见主题时使用
- 假设反转 —— 用户希望挑战某个主题的传统教学方式时使用
SCAMPER 转换
将常见的数学/技术可视化进行改造:
- 替代:替换常见的视觉隐喻(数轴 → 蜿蜒路径,矩阵 → 城市网格)
- 组合:融合两种讲解方式(同时采用代数和几何方法)
- 反转:反向推导——从结果出发,逐步拆解至公理
- 修改:夸大某个参数,以展示其重要性(将学习率提高 10 倍,将样本量增加 1000 倍)
- 消除:移除所有符号表示——纯粹通过动画和空间关系讲解
假设反转
- 列出该主题可视化方式中的“常见”做法(从左到右、二维、离散步骤、形式化符号)
- 选出最根本的假设
- 反转它(从右到左推导、将二维概念嵌入三维、用连续形变代替分步展示、不使用符号)
- 探索这种反转揭示了哪些常见方法所掩盖的内容