mcpField
M
manim-video

manim-video

github.com/nousresearch创意与媒体258.1k457 次安装今天更新
代码仓库

关于 manim-video

这是使用 Manim Community Edition 制作教学动画和讲解视频的流程,适合可视化数学、算法、数据、系统或研究内容。流程将场景规划、渲染、片段拼接和可选音频制作组织在一起。

主要功能

  1. 01规划叙事结构和场景布局
  2. 02动画呈现公式、算法、数据和系统
  3. 03使用 Manim Community Edition 渲染场景
  4. 04使用 ffmpeg 拼接片段
  5. 05添加可选旁白或音乐
  6. 06对照计划检查预览帧

适用场景

  1. 01直观讲解数学概念
  2. 02逐步展示算法运行
  3. 03将指标制作成动态数据故事
  4. 04呈现研究发现或系统架构

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nousresearch/hermes-agent --skill manim-video

安装后在 Claude Code 中输入/manim-video确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
references/
animation-design-thinking.md
animations.md
camera-and-3d.md
decorations.md
equations.md
graphs-and-data.md
mobjects.md
paper-explainer.md
production-quality.md
rendering.md
scene-planning.md
troubleshooting.md
updaters-and-trackers.md
visual-design.md
scripts/
setup.sh

详细介绍

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 渲染方程
视频 I/Offmpeg场景拼接、格式转换、音频混流
TTSElevenLabs / Qwen3-TTS(可选)配音旁白

流程

PLAN --> CODE --> RENDER --> STITCH --> AUDIO (optional) --> REVIEW
  1. 规划 — 编写 plan.md,包含叙事弧线、场景列表、视觉元素、调色板和旁白脚本
  2. 编码 — 编写 script.py,每个场景对应一个类,并且都能独立渲染
  3. 渲染 — 草稿使用 manim -ql script.py Scene1 Scene2 ...,正式版本使用 -qh
  4. 拼接 — 使用 ffmpeg 将场景片段拼接成 final.mp4
  5. 音频(可选)— 通过 ffmpeg 添加旁白和/或背景音乐。参见 references/rendering.md
  6. 检查 — 渲染预览静帧,对照计划进行核验并调整

项目结构

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/

创作方向

调色板
调色板背景主色次色强调色用途
Classic 3B1B#1C1C1C#58C4DD (BLUE)#83C167 (GREEN)#FFFF00 (YELLOW)通用数学/计算机科学
学术暖色#2D2B55#FF6B6B#FFD93D#6BCB77亲切易懂
霓虹科技#0A0A0A#00F5FF#FF00FF#39FF14系统、架构
单色#1A1A2E#EAEAEA#888888#FFFFFF极简主义
动画速度
场景run_time之后的 self.wait()
标题/介绍出现1.5s1.0s
关键方程显示2.0s2.0s
变换/变形1.5s1.5s
辅助标签0.8s0.5s
淡出清理0.5s0.3s
“恍然大悟”时刻揭示2.5s3.0s
字体大小
角色字体大小用途
标题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 为最小值。

各场景的变化

切勿在所有场景中使用完全相同的配置。对于每个场景:

  • 使用调色板中不同的主色
  • 采用不同的布局——不要总是把所有内容放在中央
  • 使用不同的动画入场方式——在 Write、FadeIn、GrowFromCenter、Create 之间变换
  • 调整不同的视觉密度——有些场景内容密集,有些则较为简洁

工作流

步骤 1:规划(plan.md)

编写任何代码之前,先编写 plan.md。参见 references/scene-planning.md,其中提供了完整模板。

步骤 2:编码(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
  • 干净退出——在场景结尾淡出所有 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}")
边缘文本的 buff >= 0.5
label.to_edge(DOWN, buff=0.5)  # never < 0.5
替换文本前先 FadeOut
self.play(ReplacementTransform(note1, note2))  # not Write(note2) on top
切勿对尚未添加的 Mobject 设置动画
self.play(Create(circle))  # must add first
self.play(circle.animate.set_color(RED))  # then animate

性能目标

质量分辨率FPS速度
-ql(草稿)854x48015每场景 5-15s
-qm(中等)1280x72030每场景 15-60s
-qh(正式版)1920x108060每场景 30-120s

始终使用 -ql 迭代。只有最终输出才使用 -qh 渲染。

参考资料

文件内容
references/animations.md核心动画、速率函数、组合、.animate 语法、时间安排模式
references/mobjects.md文本、形状、VGroup/Group、定位、样式、自定义 mobject
references/visual-design.md12 条设计原则、不透明度分层、布局模板、调色板
references/equations.mdManim 中的 LaTeX、TransformMatchingTex、推导模式
references/graphs-and-data.md坐标轴、绘图、BarChart、动画数据、算法可视化
references/camera-and-3d.mdMovingCameraScene、ThreeDScene、3D 曲面、摄像机控制
references/scene-planning.md叙事弧线、布局模板、场景转场、规划模板
references/rendering.mdCLI 参考、质量预设、ffmpeg、旁白工作流、GIF 导出
references/troubleshooting.mdLaTeX 错误、动画错误、常见错误、调试
references/animation-design-thinking.md何时使用动画,何时静态展示、分解、节奏、旁白同步
references/updaters-and-trackers.mdValueTracker、add_updater、always_redraw、基于时间的 updater、模式
references/paper-explainer.md将研究论文转化为动画——工作流、模板、领域模式
references/decorations.mdSurroundingRectangle、Brace、箭头、DashedLine、Angle、注释生命周期
references/production-quality.md编码前、渲染前、渲染后检查清单、空间布局、颜色、节奏

创意发散(仅在用户要求实验性、创意性或独特的输出时使用)

如果用户要求采用创意性、实验性或非传统的讲解方式,请先选择一种策略并进行推理,再设计动画。

  • SCAMPER —— 用户希望以新颖方式讲解常见主题时使用
  • 假设反转 —— 用户希望挑战某个主题的传统教学方式时使用
SCAMPER 转换

将常见的数学/技术可视化进行改造:

  • 替代:替换常见的视觉隐喻(数轴 → 蜿蜒路径,矩阵 → 城市网格)
  • 组合:融合两种讲解方式(同时采用代数和几何方法)
  • 反转:反向推导——从结果出发,逐步拆解至公理
  • 修改:夸大某个参数,以展示其重要性(将学习率提高 10 倍,将样本量增加 1000 倍)
  • 消除:移除所有符号表示——纯粹通过动画和空间关系讲解
假设反转
  1. 列出该主题可视化方式中的“常见”做法(从左到右、二维、离散步骤、形式化符号)
  2. 选出最根本的假设
  3. 反转它(从右到左推导、将二维概念嵌入三维、用连续形变代替分步展示、不使用符号)
  4. 探索这种反转揭示了哪些常见方法所掩盖的内容

评论

支持 Markdown