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 渲染方程式 |
| 視訊 I/O | ffmpeg | 場景拼接、格式轉換、音訊混流 |
| TTS | ElevenLabs / Qwen3-TTS(可選) | 旁白配音 |
流程
規劃 --> 編碼 --> 渲染 --> 拼接 --> 音訊(可選)--> 審查
- 規劃 — 撰寫
plan.md,包含敘事弧線、場景列表、視覺元素、調色盤、旁白腳本 - 編碼 — 撰寫
script.py,每個場景對應一個類別,每個類別可獨立渲染 - 渲染 — 草稿使用
manim -ql script.py Scene1 Scene2 ...,正式版使用-qh - 拼接 — 使用 ffmpeg 將場景片段串接成
final.mp4 - 音訊(可選)— 透過 ffmpeg 加入旁白及/或背景音樂。請參閱
references/rendering.md - 審查 — 渲染預覽靜態圖,對照規劃檢查,進行調整
專案結構
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("Fourier Series", 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("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 # 草稿
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)) # 而不是直接在 note2 上使用 Write
切勿對未加入的 Mobject 進行動畫
self.play(Create(circle)) # 必須先加入
self.play(circle.animate.set_color(RED)) # 然後才能動畫
效能目標
| 品質 | 解析度 | 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、定位、樣式、自訂 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 | 何時使用動畫 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 轉換
對標準的數學/技術視覺化進行轉換:
- 替代:替換標準的視覺隱喻(數線 → 蜿蜒路徑,矩陣 → 城市網格)
- 結合:合併兩種解說方法(代數 + 幾何同時進行)
- 反向:逆向推導——從結果開始,解構回公理
- 修改:誇大某個參數以顯示其重要性(10 倍的學習率、1000 倍的樣本數)
- 消除:移除所有符號——僅透過動畫和空間關係進行解釋
假設反轉
- 列出關於這個主題通常如何被視覺化的「標準」做法(從左到右、2D、離散步驟、正式符號)
- 選取最根本的假設
- 反轉它(從右到左推導、將 2D 概念嵌入 3D、以連續變形取代步驟、完全零符號)
- 探索這個反轉揭示了哪些標準做法所隱藏的東西