Manim Video
目次
- skill の情報
- 参考: SKILL.md 全文
- 使う場面
- 目指す水準
- 事前に必要なもの
- モード
- 構成
- 全体の流れ
- プロジェクトの構成
- 見た目の作り方
- 配色
- アニメーションの速さ
- 文字の大きさの体系
- フォント
- シーンごとの変化
- 進め方
- 手順 1: 計画する(plan.md)
- 手順 2: コードを書く(script.py)
- 手順 3: 描画する
- 手順 4: つなぐ
- 手順 5: 見直す
- 実装で外せない注意点
- LaTeX には raw 文字列を使う
- 画面端の文字は buff を 0.5 以上に
- 文字を差し替える前に FadeOut する
- 追加していない mobject を動かさない
- 処理時間の目安
- 参考ドキュメント
- 型を外す(利用者が実験的・独創的なものを求めたときだけ)
- SCAMPER による変換
- 前提の反転
Manim CE のアニメーションで、3Blue1Brown 風の数学・アルゴリズム動画を作ります。
skill の情報
| 提供元 | 最初から入っています |
| パス | skills/creative/manim-video |
| バージョン | 1.0.0 |
| 作者 | SHL0MS, Hermes Agent |
| ライセンス | MIT |
| 対応プラットフォーム | linux, macos, windows |
| タグ | Manim, Animation, Math, Video |
参考: SKILL.md 全文
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 スクリプト 1 本だけです。ブラウザも Node.js も GPU も要りません。
| 層 | ツール | 役割 |
|---|---|---|
| 中核 | Manim Community Edition | シーンの描画、アニメーションの実行 |
| 数式 | LaTeX (texlive/MiKTeX) | MathTex による数式の描画 |
| 動画の入出力 | ffmpeg | シーンの連結、形式の変換、音声の多重化 |
| TTS | ElevenLabs / Qwen3-TTS(任意) | ナレーションの吹き込み |
全体の流れ
PLAN --> CODE --> RENDER --> STITCH --> AUDIO (optional) --> REVIEW- PLAN —
plan.mdに話の流れ、シーンの一覧、使う要素、配色、ナレーション原稿を書きます - CODE —
script.pyを書きます。シーンごとに 1 クラスとし、それぞれ単独で描画できるようにします - 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 (BLUE) |
#83C167 (GREEN) |
#FFFF00 (YELLOW) |
数学・情報科学全般 |
| 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 | シーンの表題、冒頭の文字 |
| 見出し | 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 を書きます。詳しいひな形は 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 # 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 には raw 文字列を使う
# 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追加していない mobject を動かさない
self.play(Create(circle)) # must add first
self.play(circle.animate.set_color(RED)) # then animate処理時間の目安
| 品質 | 解像度 | FPS | 速さ |
|---|---|---|---|
-ql(下描き) |
854x480 | 15 | 1 シーンあたり 5〜15 秒 |
-qm(中) |
1280x720 | 30 | 1 シーンあたり 15〜60 秒 |
-qh(本番) |
1920x1080 | 60 | 1 シーンあたり 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 |
動かすか静止画にするかの判断、分解、間の取り方、ナレーションとの同期 |
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 による変換
定番の数学的・技術的な可視化を、次のように変換します。
- 置き換える: 定番の視覚的な比喩を差し替える(数直線 → 曲がりくねった道、行列 → 街区の地図)
- 組み合わせる: 二つの説明の仕方を重ねる(代数と幾何を同時に)
- 逆にする: 逆向きに導く。結果から出発して公理まで分解する
- 変形する: 効き目を見せるためにパラメータを誇張する(学習率を 10 倍、標本数を 1000 倍)
- 取り除く: 記号をすべて消し、動きと空間の関係だけで説明する
前提の反転
- この題材の可視化で「当たり前」とされていることを挙げます(左から右へ、2D、離散的な段階、形式的な記法)
- その中でいちばん根っこにある前提を選びます
- それを反転させます(右から左へ導く、2D の概念を 3D に埋め込む、段階ではなく連続的に変形する、記法をいっさい使わない)
- 反転によって、定番のやり方では隠れていた何が見えるようになるかを探ります