Manim 視頻
使用 Manim 社區版製作數學和技術動畫的生產流水線。創建類似 3Blue1Brown 風格的講解視頻、算法可視化、公式推導、架構圖和數據故事。當用戶請求以下內容時使用:動畫講解、數學動畫、概念可視化、算法演示、技術解釋器、3Blue1Brown 風格視頻,或任何帶有幾何/數學內容的程序化動畫。
技能元數據
| 來源 | 捆綁(默認安裝) |
| 路徑 | skills/creative/manim-video |
| 版本 | 1.0.0 |
參考:完整 SKILL.md
以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理看到的指令。
Manim 視頻生產流水線
創意標準
這是教育電影。每一幀都在教學。每一個動畫都揭示結構。
在編寫第一行代碼之前,闡明敘事弧線。這糾正了什麼誤解?什麼是“頓悟時刻”?什麼樣的視覺故事能帶領觀眾從困惑走向理解?用戶的提示只是一個起點——要以教學雄心來詮釋它。
幾何先於代數。 先展示形狀,再展示方程。視覺記憶比符號記憶編碼更快。當觀眾在看到公式之前先看到幾何模式時,方程會顯得水到渠成。
首次渲染卓越是強制性的。 輸出必須在無需修訂輪次的情況下視覺清晰且美學協調。如果某些內容看起來雜亂、時機不當或像“AI 生成的幻燈片”,那就是錯誤的。
不透明度分層引導注意力。 切勿以全亮度顯示所有內容。主要元素為 1.0,上下文元素為 0.4,結構元素(座標軸、網格)為 0.15。大腦分層處理視覺顯著性。
呼吸空間。 每個動畫之後都需要 self.wait()。觀眾需要時間來吸收剛剛出現的內容。切勿從一個動畫匆忙跳轉到下一個動畫。關鍵揭示後的 2 秒停頓絕非浪費。
** cohesive 視覺語言。** 所有場景共享調色板、一致的排版大小、匹配的動畫速度。如果一個技術上正確的視頻中每個場景使用隨機不同的顏色,那就是美學上的失敗。
前提條件
運行 scripts/setup.sh 以驗證所有依賴項。要求:Python 3.10+、Manim 社區版 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 社區版 | 場景渲染、動畫引擎 |
| 數學 | LaTeX (texlive/MiKTeX) | 通過 MathTex 渲染方程 |
| 視頻 I/O | ffmpeg | 場景拼接、格式轉換、音頻混流 |
| TTS | ElevenLabs / Qwen3-TTS(可選) | 旁白配音 |
流水線
PLAN --> CODE --> RENDER --> STITCH --> AUDIO (optional) --> REVIEW
- 計劃 (PLAN) — 編寫
plan.md,包含敘事弧線、場景列表、視覺元素、調色板、旁白腳本 - 編碼 (CODE) — 編寫
script.py,每個場景一個類,每個類均可獨立渲染 - 渲染 (RENDER) — 使用
manim -ql script.py Scene1 Scene2 ...進行草稿渲染,使用-qh進行生產渲染 - 拼接 (STITCH) — 使用 ffmpeg 將場景片段 concat 拼接為
final.mp4 - 音頻 (AUDIO)(可選)— 通過 ffmpeg 添加旁白和/或背景音樂。參見
references/rendering.md - 審查 (REVIEW) — 渲染預覽靜幀,根據計劃進行驗證,調整
項目結構
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 (藍色) | #83C167 (綠色) | #FFFF00 (黃色) | 通用數學/計算機科學 |
| Warm academic | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | 親和力強 |
| Neon tech | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | 系統、架構 |
| Monochrome | #1A1A2E | #EAEAEA | #888888 | #FFFFFF | 極簡主義 |
動畫速度
| 上下文 | run_time | 之後的 self.wait() |
|---|---|---|
| 標題/引言出現 | 1.5s | 1.0s |
| 關鍵公式揭示 | 2.0s | 2.0s |
| 變換/變形 | 1.5s | 1.5s |
| 輔助標籤 | 0.8s | 0.5s |
| FadeOut 清理 | 0.5s | 0.3s |
| “頓悟時刻”揭示 | 2.5s | 3.0s |
字體大小比例
| 角色 | 字體大小 | 用途 |
|---|---|---|
| 標題 | 48 | 場景標題、開場文本 |
| heading | 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。 comprehensive 模板請參閱 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 - 乾淨退出——在場景結束時 FadeOut 所有 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
切勿對未添加的 Mobjects 進行動畫處理
self.play(Create(circle)) # must add first
self.play(circle.animate.set_color(RED)) # then animate
性能目標
| 質量 | 分辨率 | FPS | 速度 |
|---|---|---|---|
-ql (草稿) | 854x480 | 15 | 5-15秒/場景 |
-qm (中等) | 1280x720 | 30 | 15-60秒/場景 |
-qh (生產) | 1920x1080 | 60 | 30-120秒/場景 |
始終在 -ql 模式下迭代。僅在最終輸出時渲染 -qh。
參考資料
| 文件 | 內容 |
|---|---|
references/animations.md | 核心動畫、速率函數、組合、.animate 語法、計時模式 |
references/mobjects.md | 文本、形狀、VGroup/Group、定位、樣式、自定義 mobjects |
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 | 何時製作動畫 vs 顯示靜態圖像、分解、節奏、敘述同步 |
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 變換
選取一個標準的數學/技術可視化方案並進行變換:
- 替代 (Substitute):替換標準的視覺隱喻(數軸 → 蜿蜒路徑,矩陣 → 城市網格)
- 合併 (Combine):融合兩種解釋方法(同時結合代數與幾何)
- 逆向 (Reverse):反向推導——從結果出發,逐步解構至公理
- 修改 (Modify):誇大某個參數以展示其重要性(將學習率提高 10 倍,將樣本量提高 1000 倍)
- 消除 (Eliminate):移除所有符號——僅通過動畫和空間關係進行解釋
假設逆向
- 列出該主題可視化中的“標準”特徵(從左到右、2D、離散步驟、形式化符號)
- 挑選最基本的假設
- 將其逆向(從右到左推導、2D 概念的 3D 嵌入、連續變形而非離散步驟、零符號)
- 探索這種逆向揭示了哪些標準方法所隱藏的內容