Communitygithub.com

manim-video

使用 Manim Community Edition 製作 3Blue1Brown 風格的數學/演算法動畫影片。

manim-video 是什麼?

此技能專注於使用 Manim Community Edition 建立高品質的教育動畫影片,涵蓋數學動畫、概念視覺化、演算法逐步解說以及技術解說等場景。它提供了一套完整的創作流程,從規劃故事情節、撰寫 Python 腳本、渲染場景到最終的影片拼接和音訊處理。該技能強調「教育即電影」的創作理念,要求每個畫面都具有教學意義,並內建了色彩搭配、動畫速度、字體排版等設計準則,以確保輸出的影片視覺風格統一且具有專業水準。它能支援多種創作模式,包括概念解說、方程式推導、演算法視覺化、資料故事、架構圖、論文解說和 3D 視覺化,是開發者將技術概念轉化為生動教育內容的強大工具。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/David2024patton/custom-skills-public/tree/main/skills/creative/manim-video

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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場景拼接、格式轉換、音訊合成
語音合成ElevenLabs / Qwen3-TTS (選擇性)旁白配音

流程

規劃 --> 編碼 --> 渲染 --> 拼接 --> 音訊 (選擇性) --> 審查
  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                # 敘事弧線、場景分解
  script.py              # 所有場景在同一個檔案中
  concat.txt             # ffmpeg 場景列表
  final.mp4              # 拼接後的輸出
  media/                 # 由 Manim 自動生成
    videos/script/480p15/

創意方向

色彩配置

配置背景主要次要強調適用場景
經典 3B1B#1C1C1C#58C4DD (藍)#83C167 (綠)#FFFF00 (黃)一般數學/計算機科學
溫暖學術#2D2B55#FF6B6B#FFD93D#6BCB77平易近人
霓虹科技#0A0A0A#00F5FF#FF00FF#39FF14系統、架構
單色#1A1A2E#EAEAEA#888888#FFFFFF極簡主義

動畫速度

情境run_time之後的 self.wait()
標題/開場出現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"  # 在檔案頂部定義一次

Text("傅立葉級數", font_size=48, font=MONO, weight=BOLD)  # 標題
Text("n=1: sin(x)", font_size=20, font=MONO)                  # 標籤
MathTex(r"\nabla L")                                            # 數學(使用 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("為什麼這有效?", font_size=48, color=PRIMARY, weight=BOLD, font=MONO)
        self.add_subcaption("為什麼這有效?", 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
  • 乾淨的結束 — 在場景結尾淡出所有物體:self.play(FadeOut(Group(*self.mobjects)))

步驟 3:渲染

manim -ql script.py Scene1_Introduction Scene2_CoreConcept  # 草稿
manim -qh script.py Scene1_Introduction Scene2_CoreConcept  # 最終成品

步驟 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  # 預覽靜態圖

關鍵實作注意事項

LaTeX 使用原始字串

# 錯誤:MathTex("\frac{1}{2}")
# 正確:
MathTex(r"\frac{1}{2}")

邊緣文字的 buff 必須大於等於 0.5

label.to_edge(DOWN, buff=0.5)  # 永遠不要小於 0.5

在取代文字前先淡出

self.play(ReplacementTransform(note1, note2))  # 不要直接 Write(note2) 疊在上面

永遠不要動畫尚未添加的物件

self.play(Create(circle))  # 必須先 add
self.play(circle.animate.set_color(RED))  # 然後再動畫

效能目標

品質解析度FPS速度
-ql (草稿)854x48015每個場景 5-15 秒
-qm (中等)1280x72030每個場景 15-60 秒
-qh (最終成品)1920x108060每個場景 30-120 秒

始終使用 -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何時動畫化 vs 顯示靜態、分解、節奏、旁白同步
references/updaters-and-trackers.mdValueTracker、add_updater、always_redraw、基於時間的更新器、模式
references/paper-explainer.md將研究論文轉化為動畫 — 流程、範本、領域模式
references/decorations.mdSurroundingRectangle、Brace、箭頭、DashedLine、角度、註釋的生命週期
references/production-quality.md編碼前、渲染前、渲染後的檢查清單、空間佈局、色彩、節奏

創意發散(僅在使用者要求實驗性/創意性/獨特輸出時使用)

如果使用者要求創意性、實驗性或非傳統的解說方法,請在設計動畫之前選擇一個策略並進行推理。

  • SCAMPER — 當使用者想要對標準解說方式進行全新詮釋時
  • 假設反轉 — 當使用者想要挑戰某事物的傳統教學方式時

SCAMPER 轉換

對標準的數學/技術視覺化進行轉換:

  • 替代 (Substitute):替換標準的視覺隱喻(數線 → 蜿蜒路徑,矩陣 → 城市網格)
  • 組合 (Combine):合併兩種解說方法(同時進行代數 + 幾何解說)
  • 反向 (Reverse):反向推導 — 從結果開始,逆向拆解到公理
  • 修改 (Modify):誇大某個參數以顯示其重要性(10 倍的學習率,1000 倍的樣本量)
  • 刪除 (Eliminate):移除所有符號 — 僅透過動畫和空間關係進行解說

假設反轉

  1. 列出該主題的「標準」視覺化方式(從左到右、2D、離散步驟、正式符號)
  2. 選擇最基本的一個假設
  3. 將其反轉(從右到左推導、將 2D 概念嵌入 3D、使用連續形變代替步驟、零符號)
  4. 探索這個反轉揭示了哪些標準方式所隱藏的面向

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能