Manim アニメーション — 数学・技術動画
Manim は説明用ビジュアルのための Python アニメーションエンジンです。その強みは正確性にあります。数式、グラフ、または構成物を、デザインツールでの近似ではなく、数学的に定義されたオブジェクトとしてアニメーション化できます。
パターンとコードについては references/MANIM-PLAYBOOK.md を参照してください。インストールされているバージョンに応じてフラグを確認してください: https://docs.manim.community/ja/stable/
1. Manim を選ぶタイミング
以下の場合に Manim を選びます:
- 数式、記号、または証明が主題である場合。
- 座標系、グラフ、ベクトル、幾何学的構成が正確でなければならない場合。
- アルゴリズム、データ構造、またはプロセスをステップバイステップで視覚的に説明する必要がある場合。
- ラベルを手動配置ではなく数学的オブジェクトに揃える必要がある場合。
- スタイルが控えめで図式的であり、映画的ではない場合。
以下の場合は Manim を選ばないでください: 映画的な3D、ブランド色の強いプロモーション動画、モーショングラフィックのタイポグラフィ、インタラクティブな成果物。これらは Blender、Remotion、または Web グラフィックスに適しています。
2. インストール(隔離・再現可能)
uv --version # 最初に uv をインストール
uv init --python 3.12 manim-project
cd manim-project
uv add manim
uv run manim --version
Linux では多くの場合ネイティブライブラリが必要です:
sudo apt update
sudo apt install build-essential python3-dev pkg-config libcairo2-dev libpango1.0-dev ffmpeg
sudo apt install texlive texlive-latex-extra texlive-fonts-recommended # MathTex/Tex 用
macOS: brew install cairo pango pkg-config ffmpeg および MathTex を使用する場合は MacTeX などの TeX ディストリビューション。
Windows: FFmpeg と MiKTeX/TeX Live をインストール。Cairo/Pango ホイールには Microsoft C++ Build Tools が必要な場合があります。
確認:
uv run manim --version
uv run python -c "import manim; print(manim.__version__)"
プロジェクト環境が利用可能な場合は、Manim をシステム Python にインストールしないでください。プロジェクト README にバージョンを記録してください。
3. レンダリングコマンド
# 低品質プレビュー(高速)
uv run manim -pql scenes/explain.py ExplainScene
# 中品質
uv run manim -qm scenes/explain.py ExplainScene
# 高品質 / 本番
uv run manim -qh scenes/explain.py ExplainScene
# 4K
uv run manim -qk scenes/explain.py ExplainScene
# 透明背景
uv run manim -qh -t scenes/explain.py ExplainScene
# 特定セクション
uv run manim -qh scenes/explain.py ExplainScene -n 12,20
品質プリセット: -ql 480p15, -qm 720p30, -qh 1080p60, -qk 2160p60。インストールされているバージョンで確認してください。出力先は media/videos/<ファイル>/<品質>/ です。
ffprobe -v error -show_entries stream=width,height,r_frame_rate,duration \
-of json media/videos/explain/1080p60/ExplainScene.mp4
4. シーン設計ルール
- 1シーン1アイデア。
Sceneサブクラスに分割し、長い動画は1つの巨大なシーンではなく連結によって構成します。 - パレットとフォントはモジュール(
theme.py)で1度設定し、インポートして使い回します。16進数を繰り返し記述しないでください。 - カメラを抑制します。 Manim の
MovingCameraSceneは強力ですが使いすぎやすいです。視聴者が他の方法では見られない構造を明らかにするためにのみズームします。 - 時間を尊重します。 3分で読みやすい数式の導出は、40秒では急ぎ足に感じられます。直感ではなく読む速度から滞在時間を計算します。
- ラベルは説明するオブジェクトに付けたままにします(
Tex+next_to)。後でレイアウトを変更しても、ラベルの位置がずれるのを防げます。 - 意味には
Transform/ReplacementTransformを、存在にはFadeIn/FadeOutを使います。 無関係な図形を変形させると視聴者を混乱させます。 - すべての要素を個別にアニメーション化しないでください。
VGroupでグループ化し、意図的にタイミングをずらします。
5. 構成例
from manim import *
class ExplainScene(Scene):
def construct(self):
title = Text("Why the derivative is a limit", font="Inter").scale(0.7)
self.play(Write(title), run_time=1.2)
self.wait(0.6)
self.play(title.animate.to_edge(UP).scale(0.8), run_time=0.9)
formula = MathTex(r"f'(x) = \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}")
formula.scale(1.2)
self.play(Write(formula), run_time=1.6)
self.wait(1.2)
self.play(formula.animate.set_color_by_tex(r"h \to 0", YELLOW), run_time=0.8)
self.wait(1.5)
6. 書き出しと引き渡し
-qhは高ビットレートで1080p60を生成します。中間ファイルではなく配信用に再エンコードします。- 透明背景:
-tはアルファチャンネル付き.mov(または--format=pngで PNG シーケンス)を書き出します。合成前にチェッカーボード上でアルファを確認してください。 - Manim と Remotion/Blender を組み合わせる場合: FPS と解像度を合わせ、その後 FFmpeg または Remotion でアセンブルします。Manim のデフォルトは
-qhで 60 FPS です。config.frame_rateを変更するか、意図的に変換してください。 - ブランド付きイントロ/アウトロやキャプションの場合、Manim シーンをクリーンにレンダリングし、Remotion で合成してください。ブランドレイアウトのために Manim のタイポグラフィシステムと戦わないでください。
7. 検証
- 高品質レンダリングの前に低品質レンダリングを確認してください。数式の間違いは480pでも見えます。
- フレーム端で数式がクリッピングされていないか、ラベルが重なっていないか確認します。
- LaTeX が警告なしでコンパイルされたか確認します(コンソールでの赤いテキスト警告に注意)。
ffprobeで最終的な長さとフレームレートを確認します。- 各記号を意図した数式と照らし合わせて声に出して読みます。符号の間違いはスタイルの問題ではなく、正確性のバグです。
8. よくある問題
| 症状 | 原因 | 修正 |
|---|---|---|
latex: command not found | TeX ディストリビューションなし | TeX Live/MiKTeX をインストール、または MathTex の代わりに Text を使用 |
| Cairo/Pango ビルドエラー | ネイティブライブラリ不足 | 上記の dev パッケージをインストール |
| 数式が赤いエラーテキストで表示 | LaTeX 構文またはパッケージ不足 | コンソールを確認。TexTemplate パッケージを追加 |
| すべてがぼやけて見える | 低品質プリセット | 最終出力は -qh/-qk でレンダリング |
| ギリシャ語/アラビア語のテキストが壊れる | フォントにグリフまたはシェーピングがない | シェーピング対応フォントを使用、静止画でテスト、またはテキストをラスタライズ |
| レンダリングが非常に遅い | 60 FPS + 4K + 複雑なパス | -ql でプレビュー、パスを単純化、シーンを分割 |
| 透明背景が失われる | 間違ったフォーマット | -t とアルファ対応コンテナを使用、確認 |