Manim 動画制作パイプライン
使用タイミング
ユーザーから以下のリクエストがあった場合に使用します:アニメーション解説、数学アニメーション、コンセプト可視化、アルゴリズムのステップ実行、技術説明、3Blue1Brown スタイルの動画、または幾何学的・数学的内容を含むプログラムによるアニメーション全般。Manim Community Edition を使用して、3Blue1Brown スタイルの解説動画、アルゴリズム可視化、数式導出、アーキテクチャ図、データストーリーを作成します。
クリエイティブ基準
これは教育的な映像作品です。すべてのフレームが教え、すべてのアニメーションが構造を明らかにします。
コードを一行書く前に、物語の流れを明確にしましょう。このアニメーションはどの誤解を正すのか?「aha モーメント」はどこか?視聴者を混乱から理解へ導く映像ストーリーとは?ユーザーのプロンプトは出発点です — 教育的な野心を持って解釈してください。
代数の前に幾何学を。 式の前に形を示しましょう。視覚的記憶は記号的記憶よりも速くエンコードされます。視聴者が数式の前に幾何学パターンを目にしたとき、その式は「腑に落ちた」ものになります。
初回レンダリングでの完成度は絶対条件。 出力は、修正ラウンドなしで視覚的に明快かつ美的に調和していなければなりません。ごちゃごちゃしていたり、タイミングが悪かったり、「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に、シーンごとに 1 クラス、それぞれ独立してレンダリング可能な形で記述 - レンダリング — 下書きは
manim -ql script.py Scene1 Scene2 ...、本番は-qh - 結合 — ffmpeg でシーンクリップを連結し
final.mp4を生成 - 音声(オプション) — ffmpeg でボイスオーバーや BGM を追加。詳細は
references/rendering.mdを参照 - レビュー — レンダリングプレビュー静止画を生成し、計画と照合して調整
プロジェクト構造
project-name/
plan.md # 物語の流れ、シーン内訳
script.py # すべてのシーンを 1 ファイルに
concat.txt # ffmpeg シーンリスト
final.mp4 # 結合出力
media/ # Manim による自動生成
videos/script/480p15/
クリエイティブディレクション
カラーパレット
| パレット | 背景 | 主要 | 二次 | アクセント | 使用例 |
|---|---|---|---|---|---|
| クラシック 3B1B | #1C1C1C | #58C4DD (BLUE) | #83C167 (GREEN) | #FFFF00 (YELLOW) | 一般数学・CS |
| 暖かみのある学術 | #2D2B55 | #FF6B6B | #FFD93D | #6BCB77 | 親しみやすい |
| ネオンテック | #0A0A0A | #00F5FF | #FF00FF | #39FF14 | システム、アーキテクチャ |
| モノクローム | #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 |
| 「aha モーメント」の表示 | 2.5s | 3.0s |
タイポグラフィスケール
| 役割 | フォントサイズ | 使用法 |
|---|---|---|
| タイトル | 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)
シーンごとに 1 クラス。すべてのシーンは独立してレンダリング可能です。
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 を FadeOut:
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 の Raw 文字列
# 誤り:MathTex("\frac{1}{2}")
# 正しい:
MathTex(r"\frac{1}{2}")
端部テキストには buff >= 0.5
label.to_edge(DOWN, buff=0.5) # 決して 0.5 未満にしない
テキスト置換前の FadeOut
self.play(ReplacementTransform(note1, note2)) # 上から Write(note2) しない
未追加の 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、時間ベースのアップデータ、パターン |
references/paper-explainer.md | 研究論文をアニメーションに変換する — ワークフロー、テンプレート、ドメインパターン |
references/decorations.md | SurroundingRectangle、Brace、矢印、DashedLine、Angle、注釈ライフサイクル |
references/production-quality.md | コーディング前、レンダリング前、レンダリング後のチェックリスト、空間レイアウト、色、テンポ |
クリエイティブな発散(ユーザーが実験的・創造的・ユニークな出力を要求した場合のみ使用)
ユーザーが創造的、実験的、または型にはまらない説明方法を求めてきた場合、アニメーションをデザインする前に戦略を選び、その理由を検討してください。
- SCAMPER — ユーザーが標準的な説明に新鮮な視点を求めている場合
- 前提反転 — ユーザーが何かの教え方に挑戦したい場合
SCAMPER 変換
標準的な数学的・技術的可視化を取り上げ、変換します:
- 代替:標準的な視覚メタファーを置き換える(数直線 → 曲がりくねった道、行列 → 都市グリッド)
- 結合:2 つの説明アプローチを融合する(代数的 + 幾何学的を同時に)
- 逆転:結果から逆方向に導出する — 最終結果から始めて公理へ分解する
- 修正:パラメータを誇張して、なぜそれが重要かを示す(学習率 10 倍、サンプルサイズ 1000 倍)
- 削除:すべての表記を削除する — アニメーションと空間関係だけで純粋に説明する
前提反転
- このトピックがどのように可視化されるか「標準的」な前提をリストアップする(左から右、2D、離散ステップ、形式的表記)
- 最も基本的な前提を選ぶ
- それを反転する(右から左への導出、2D 概念の 3D 埋め込み、ステップの代わりに連続モーフィング、表記ゼロ)
- 反転によって、標準的なアプローチが隠していたものが何か明らかになるかを探る