---
title: "Manim Video — Manim CE のアニメーション: 3Blue1Brown 風の数学・アルゴリズム動画"
description: "Manim CE のアニメーション: 3Blue1Brown 風の数学・アルゴリズム動画"
upstream_path: user-guide/skills/bundled/creative/creative-manim-video.md
upstream_blob: f22a7005d822b5d3be22fa74a882fbce5073e364
sources:
  - https://hermes-agent.nousresearch.com/docs/user-guide/skills/bundled/creative/creative-manim-video
---

# Manim Video {#manim-video}

Manim CE のアニメーションで、3Blue1Brown 風の数学・アルゴリズム動画を作ります。

## skill の情報 {#skill-metadata}

| | |
|---|---|
| 提供元 | 最初から入っています |
| パス | `skills/creative/manim-video` |
| バージョン | `1.0.0` |
| 作者 | SHL0MS, Hermes Agent |
| ライセンス | MIT |
| 対応プラットフォーム | linux, macos, windows |
| タグ | `Manim`, `Animation`, `Math`, `Video` |

## 参考: SKILL.md 全文 {#reference-full-skillmd}

:::info
以下は、この skill が呼び出されたときに Hermes が読み込む定義の全文です。skill が有効なあいだ、エージェントはこれを指示として見ています。
:::

# Manim による動画制作の流れ {#manim-video-production-pipeline}

## 使う場面 {#when-to-use}

利用者から次のような依頼があったときに使います。アニメーションによる解説、数学のアニメーション、概念の可視化、アルゴリズムの手順の追跡、技術解説、3Blue1Brown 風の動画、あるいは幾何学的・数学的な中身をプログラムで動かすもの全般です。Manim Community Edition を使って、3Blue1Brown 風の解説動画、アルゴリズムの可視化、数式の導出、構成図、データの物語を作ります。

## 目指す水準 {#creative-standard}

これは教育のための映像作品です。どのコマも何かを教え、どのアニメーションも構造を見せます。

**コードを一行も書く前に**、話の流れを言葉にしてください。どんな思い違いを正すのか。「なるほど」と腑に落ちる瞬間はどこか。見る人を混乱から理解へ運ぶ視覚的な物語は何か。利用者の依頼文は出発点です。教える意欲をもって読み取ってください。

**代数より先に図形を。** まず形を見せ、式はそのあとです。視覚の記憶は記号の記憶より早く定着します。式より先に幾何学的なパターンを見た人にとって、その式は納得のいくものになります。

**一度目のレンダリングで仕上がっていることが必須です。** 作り直しを重ねなくても、見て分かりやすく、全体の見た目がそろっていなければなりません。ごちゃついている、間の取り方が悪い、「AI が作ったスライド」に見える。そのどれかに当たるなら、それは失敗です。

**不透明度の重ね方で視線を導きます。** すべてを最大の明るさで出してはいけません。主役の要素は 1.0、文脈を補う要素は 0.4、骨組み（軸やグリッド）は 0.15 にします。人の脳は視覚的な目立ちを層として処理します。

**間を置く。** どのアニメーションのあとにも `self.wait()` が要ります。見る人には、いま現れたものを飲み込む時間が必要です。次のアニメーションへ駆け足で移らないでください。大事な場面のあとの 2 秒の間が無駄になることはありません。

**見た目の言語をそろえる。** すべてのシーンで配色をそろえ、文字の大きさの体系をそろえ、アニメーションの速さをそろえます。技術的には正しくても、シーンごとにばらばらの色を使った動画は、見た目として失敗しています。

## 事前に必要なもの {#prerequisites}

`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 で動作を確認しています。

## モード {#modes}

| モード | 入力 | 出力 | 参考 |
|------|-------|--------|-----------|
| **概念の解説** | 題材・概念 | 幾何学的な直観を伴うアニメーション解説 | `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` |

## 構成 {#stack}

プロジェクトごとに Python スクリプト 1 本だけです。ブラウザも Node.js も GPU も要りません。

| 層 | ツール | 役割 |
|-------|------|---------|
| 中核 | Manim Community Edition | シーンの描画、アニメーションの実行 |
| 数式 | LaTeX (texlive/MiKTeX) | `MathTex` による数式の描画 |
| 動画の入出力 | ffmpeg | シーンの連結、形式の変換、音声の多重化 |
| TTS | ElevenLabs / Qwen3-TTS（任意） | ナレーションの吹き込み |

## 全体の流れ {#pipeline}

```
PLAN --> CODE --> RENDER --> STITCH --> AUDIO (optional) --> REVIEW
```

1. **PLAN** — `plan.md` に話の流れ、シーンの一覧、使う要素、配色、ナレーション原稿を書きます
2. **CODE** — `script.py` を書きます。シーンごとに 1 クラスとし、それぞれ単独で描画できるようにします
3. **RENDER** — 下描きは `manim -ql script.py Scene1 Scene2 ...`、本番は `-qh` を使います
4. **STITCH** — ffmpeg の concat で各シーンをつなぎ、`final.mp4` にします
5. **AUDIO**（任意）— ffmpeg でナレーションや背景音楽を足します。`references/rendering.md` を見てください
6. **REVIEW** — 静止画のプレビューを出し、計画と突き合わせて手を入れます

## プロジェクトの構成 {#project-structure}

```
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/
```

## 見た目の作り方 {#creative-direction}

### 配色 {#color-palettes}

| 配色 | 背景 | 主役 | 脇役 | 差し色 | 向いている題材 |
|---------|-----------|---------|-----------|--------|----------|
| **Classic 3B1B** | `#1C1C1C` | `#58C4DD` (BLUE) | `#83C167` (GREEN) | `#FFFF00` (YELLOW) | 数学・情報科学全般 |
| **Warm academic** | `#2D2B55` | `#FF6B6B` | `#FFD93D` | `#6BCB77` | 親しみやすく |
| **Neon tech** | `#0A0A0A` | `#00F5FF` | `#FF00FF` | `#39FF14` | システム、構成 |
| **Monochrome** | `#1A1A2E` | `#EAEAEA` | `#888888` | `#FFFFFF` | 最小限に |

### アニメーションの速さ {#animation-speed}

| 場面 | 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 |

### 文字の大きさの体系 {#typography-scale}

| 役割 | 文字サイズ | 使いどころ |
|------|-----------|-------|
| タイトル | 48 | シーンの表題、冒頭の文字 |
| 見出し | 36 | シーン内の区切り |
| 本文 | 30 | 説明の文 |
| ラベル | 24 | 注記、軸のラベル |
| キャプション | 20 | 字幕、小さな注記 |

### フォント {#fonts}

**すべての文字に等幅フォントを使ってください。** Manim の Pango レンダラーは、プロポーショナルフォントだとどの大きさでも字間が崩れます。おすすめの一覧は `references/visual-design.md` にあります。

```python
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` を下限にします。

### シーンごとの変化 {#per-scene-variation}

すべてのシーンで同じ設定を使ってはいけません。シーンごとに次を変えます。

- 配色の中の**主役の色を変える**
- **配置を変える** — 何でも中央に置かない
- **登場の仕方を変える** — Write、FadeIn、GrowFromCenter、Create を使い分ける
- **画面の密度を変える** — 詰まったシーンもあれば、すかしたシーンもある

## 進め方 {#workflow}

### 手順 1: 計画する（plan.md） {#step-1-plan-planmd}

コードを書く前に `plan.md` を書きます。詳しいひな形は `references/scene-planning.md` にあります。

### 手順 2: コードを書く（script.py） {#step-2-code-scriptpy}

シーンごとに 1 クラスです。どのシーンも単独で描画できるようにします。

```python
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: 描画する {#step-3-render}

```bash
manim -ql script.py Scene1_Introduction Scene2_CoreConcept  # draft
manim -qh script.py Scene1_Introduction Scene2_CoreConcept  # production
```

### 手順 4: つなぐ {#step-4-stitch}

```bash
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: 見直す {#step-5-review}

```bash
manim -ql --format=png -s script.py Scene2_CoreConcept  # preview still
```

## 実装で外せない注意点 {#critical-implementation-notes}

### LaTeX には raw 文字列を使う {#raw-strings-for-latex}
```python
# WRONG: MathTex("\frac{1}{2}")
# RIGHT:
MathTex(r"\frac{1}{2}")
```

### 画面端の文字は buff を 0.5 以上に {#buff-05-for-edge-text}
```python
label.to_edge(DOWN, buff=0.5)  # never < 0.5
```

### 文字を差し替える前に FadeOut する {#fadeout-before-replacing-text}
```python
self.play(ReplacementTransform(note1, note2))  # not Write(note2) on top
```

### 追加していない mobject を動かさない {#never-animate-non-added-mobjects}
```python
self.play(Create(circle))  # must add first
self.play(circle.animate.set_color(RED))  # then animate
```

## 処理時間の目安 {#performance-targets}

| 品質 | 解像度 | FPS | 速さ |
|---------|-----------|-----|-------|
| `-ql`（下描き） | 854x480 | 15 | 1 シーンあたり 5〜15 秒 |
| `-qm`（中） | 1280x720 | 30 | 1 シーンあたり 15〜60 秒 |
| `-qh`（本番） | 1920x1080 | 60 | 1 シーンあたり 30〜120 秒 |

作り込みは必ず `-ql` で回します。`-qh` は最終出力のときだけ使ってください。

## 参考ドキュメント {#references}

| ファイル | 内容 |
|------|----------|
| `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` | 動かすか静止画にするかの判断、分解、間の取り方、ナレーションとの同期 |
| `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` | コードを書く前・描画の前・描画のあとの確認事項、配置、色、テンポ |

---

## 型を外す（利用者が実験的・独創的なものを求めたときだけ） {#creative-divergence-use-only-when-user-requests-experimentalcreativeunique-output}

利用者が独創的な、実験的な、あるいは型にはまらない説明の仕方を求めた場合は、アニメーションを設計する前に方針を選び、それを筋道立てて考えてください。

- **SCAMPER** — 定番の説明に新しい切り口がほしいとき
- **前提の反転** — その題材が普通どう教えられているかに揺さぶりをかけたいとき

### SCAMPER による変換 {#scamper-transformation}
定番の数学的・技術的な可視化を、次のように変換します。

- **置き換える**: 定番の視覚的な比喩を差し替える（数直線 → 曲がりくねった道、行列 → 街区の地図）
- **組み合わせる**: 二つの説明の仕方を重ねる（代数と幾何を同時に）
- **逆にする**: 逆向きに導く。結果から出発して公理まで分解する
- **変形する**: 効き目を見せるためにパラメータを誇張する（学習率を 10 倍、標本数を 1000 倍）
- **取り除く**: 記号をすべて消し、動きと空間の関係だけで説明する

### 前提の反転 {#assumption-reversal}
1. この題材の可視化で「当たり前」とされていることを挙げます（左から右へ、2D、離散的な段階、形式的な記法）
2. その中でいちばん根っこにある前提を選びます
3. それを反転させます（右から左へ導く、2D の概念を 3D に埋め込む、段階ではなく連続的に変形する、記法をいっさい使わない）
4. 反転によって、定番のやり方では隠れていた何が見えるようになるかを探ります
