manim について
manimは、Pythonで数学・物理・コンピューターサイエンスのアニメーションを制作するスキルです。数式組版やグラフ、幾何、3Dシーンを扱い、教育動画向けにMP4やGIFをレンダリングできます。
主な機能
- 01ベクトルオブジェクトによるシーン構築
- 02数式のアニメーションと変形
- 03関数の描画と値のリアルタイム更新
- 043Dシーンとカメラ移動の作成
- 05MP4、GIF、静止画のレンダリング
活用シーン
- 01数式の導出過程の説明
- 02グラフ上を点が動く様子の表示
- 03幾何や3D概念の解説
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ iart-ai/ manim-skills --skill manimインストール後、Claude Code で/manimを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/3d-and-camera.mdgraphs-and-updaters.mdmath-and-text.md詳細
Manim(プログラムによる数学アニメーション)
Manim(Mathematical Animation Engine、Community Edition)は、Python から数学・物理・コンピューターサイエンスの解説動画をレンダリングします。3Blue1Brown 風のモーションを支えるエンジンです。各シーンは宣言的に構成されます。ベクターオブジェクトを作成し、その上で時間を指定したアニメーションを再生して、CLI から決定論的な MP4/GIF をレンダリングします。数式の移動、式の変形、アニメーショングラフ、幾何学的な直感を表現するのに最適です。
使用する場面
- 数式をアニメーション化する:数式を表示し、項ごとに変形させ、置換箇所を強調します。
- 関数やグラフを可視化する:座標軸、描画した曲線、曲線上をたどる点、その下の面積を表現します。
- 幾何学や概念を解説する:証明の展開、ベクトル、変換、数直線を表現します。
- 3D 数学:曲面、パラメトリック曲線、図形の周りを回転するカメラを表現します。
- 数学が動く様子を見せる教育用クリップを MP4/GIF にレンダリングする場合。
UI のモーション、ソーシャルメディア/マーケティング動画、CSV から作成するビジネス向けグラフには適していません。その場合は、ウェブアニメーションまたは Remotion の動画スキルを使用してください。Manim の強みは、数学的な組版と直感的な表現です。
セットアップとレンダリング
pip install manim # needs Python 3.9+, ffmpeg, and a LaTeX distribution (for Tex/MathTex)
manim -pql scene.py SquareToCircle # render one Scene class, preview at low quality
レンダリングフラグ(重要なもの):
-q l|m|h|k— 品質:低(高速な反復作業)から 4K まで。作成中は-ql、完成版には-qhを使用します。-p— 完了後に再生します。-o name— 出力ファイル名を指定します。--format=gif— GIF をレンダリングします(README のデモ用)。-s— 最後のフレームを PNG として保存します(動画のエンコードなし — 検証に便利です。下記参照)。-n a,b— アニメーションのインデックス範囲a..bのみをレンダリングします(途中で止めて、ある時点を確認します)。- 出力先は
media/videos/<file>/<quality>/<Scene>.mp4です(-sの場合はmedia/images/...にも出力されます)。
3 つの基本要素
すべては、Mobjects(オブジェクト)に Animations(時間を指定した変化)を適用する Scenes(オーケストレーション)で構成されます。
from manim import *
class SquareToCircle(Scene):
def construct(self): # ALL animation code lives in construct()
sq = Square().set_fill(BLUE, opacity=0.5)
self.play(Create(sq)) # animate it drawing on
self.play(sq.animate.rotate(PI / 4))
self.play(Transform(sq, Circle().set_fill(PINK, opacity=0.5)))
self.wait(0.5) # hold
Mobjects — ベクターオブジェクト(Circle、Square、Rectangle、Line、Dot、Polygon、Axes、Text、MathTex)。
- 位置:
.shift(UP*2)(相対位置)、.move_to(ORIGIN)(絶対位置)、.next_to(other, RIGHT, buff=0.5)、.align_to(other, LEFT)。方向は定数です:UP DOWN LEFT RIGHT ORIGIN UL UR DL DR。 - スタイル:
.set_fill(color, opacity)、.set_stroke(color, width)、.set_color(YELLOW)。色:BLUE RED GREEN YELLOW WHITEとBLUE_Eなど。 self.add(m)は(アニメーションなしで)即座に表示します。self.remove(m)は削除します。後から追加したオブジェクトは前面にレンダリングされます。
Animations — run_time 秒間(デフォルトは 1 秒)かけて、mobject の状態を補間します。
- 表示:
Create、Write(テキスト/Tex 用)、DrawBorderThenFill、FadeIn、FadeOut、GrowFromCenter。 - 変化:
Transform(a, b)(a を b に変形し、a を残します)、ReplacementTransform(a, b)(a を b に置き換えます)、Rotate、Indicate、Circumscribe、Wiggle。 .animate構文 — あらゆるメソッド呼び出しをアニメーション化します:self.play(sq.animate.shift(UP).set_fill(RED))。チェーンされたメソッドはまとめて適用されます。- 複数のアニメーションを同時に再生します:
self.play(Create(a), FadeIn(b), run_time=2)。
Timing & easing — run_time= で継続時間を設定し、rate_func= でイージングカーブを指定します(デフォルトは smooth — イーズイン・アウトです。ほかに linear、rush_into、rush_from、there_and_back、ease_out_bounce があります)。LaggedStart(*anims, lag_ratio=0.2) でグループの開始をずらします。motion-design-skills パックの animation-principles にあるモーション設計のルール(目は、遅い始まりよりも遅い終わりを許容しにくい、linear はループに使う、グループの開始をずらす)はここでも当てはまります。Manim では、これらを rate_func と LaggedStart で表現します。
数学、テキスト、数式
ラベルには Text/MarkupText(Pango、LaTeX なし)を、組版した数式には Tex/MathTex(LaTeX、生文字列)を使います。数式は Write でアニメーション表示し、TransformMatchingTex で数式間の変形を行います。部分文字列の色付け、{{ }} による分離、項ごとの変形、LaTeX プリアンブルなど、詳しいレシピは references/math-and-text.md を参照してください。
グラフ、プロット、アップデーター
関数には Axes と ax.plot(lambda x: ...) を使用します。ax.c2p(x, y) は数学座標を画面座標に変換します。ValueTracker と always_redraw/add_updater を使って値をリアルタイムで動かすと、依存する Mobject がフレームごとに再計算されます(曲線上を動く点、カウンター、動く接線など)。詳しくは references/graphs-and-updaters.md を参照してください。
3D とカメラ移動
ThreeDScene と set_camera_orientation(phi=, theta=)、ThreeDAxes、Surface、begin_ambient_camera_rotation() を使用します。2D カメラの押し出しや追従には、MovingCameraScene と self.camera.frame.animate... を使用します。詳しくは references/3d-and-camera.md を参照してください。
出力と検証(レンダリングしたフレーム → MP4)
同梱ヘルパー(
scripts/):scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.pngで静止画をタイル状に並べ、scripts/probe-mp4.sh out.mp4 [WxH] [fps]でエンコード結果を検証します。詳しくはscripts/README.mdを参照してください。
Manim は決定論的です。同じシーンからは常に同じフレームがレンダリングされるため、完全な動画を作成する前に、動画エンコードを行わず フレーム(PNG)をレンダリングして検証してください。出力が数学解説の MP4/GIF であれば、必ずこの方法を使ってください。
出力要件:
- クリップごとに 1 つの
Scene(またはThreeDScene)サブクラスを含む.pyファイルを用意し、すべての動きをconstruct()内に記述します。成果物は、レンダリング済みのmedia/videos/.../<Scene>.mp4と、再レンダリング用のスクリプトです。 - すべての
Tex/MathTexには生文字列(r"...")を使用します。LaTeX をインストールしてください。
検証手順 — フレームをレンダリング → 確認 → 動画をエンコード:
# 1. Save the final frame as a PNG, low quality — fast, no encode
manim -sql scene.py MyScene
# 2. Inspect a MID moment: stop after animation N and save that frame
manim -sql scene.py MyScene -n 0,3 # frame after the first 3 animations
# 3. Check each PNG: fidelity (equation correct, axes/labels right, nothing
# overlapping or off the 16:9 frame) + LaTeX actually compiled (no blank/box glyphs).
# 4. Only once frames look right, encode the video:
manim -qh scene.py MyScene # full MP4 at high quality
manim -qm scene.py MyScene --format=gif # GIF for a README demo
完了前に確認すること:
manim -sql ... -n a,bで、開始/中間/終了のフレームがエラーなくレンダリングされることを確認します。LaTeX エラーや欠落したグリフのボックスがないことも確認してください。- 数式とラベルが数学的に正しく、フレーム内に完全に収まっていることを確認します(端で切れていないこと)。
- 確認対象のフレームで Mobject が重なっていないことを確認します。座標を勘で決めるのではなく、
next_to/arrangeを使用します。 - タイミングが適切であることを確認します。
run_time/rate_funcを意図的に設定し、重要な状態ではself.wait()で表示を保ち、グループは同時ではなく順番にずらして表示します。 - MP4 全体をエンコードして再生できることを確認します。README 用の GIF をレンダリングするのは任意です。
クイックリファレンス
| 必要なこと | 使用するもの |
|---|---|
| 新しいアニメーション | class S(Scene): def construct(self): ... |
| 即座に表示/アニメーションで表示 | self.add(m) / self.play(Create(m)) |
| メソッドをアニメーション化 | self.play(m.animate.shift(UP)) |
| 変形/置き換え | Transform(a,b) / ReplacementTransform(a,b) |
| 数式を組版 | MathTex(r"e^{i\pi}+1=0")、Write でアニメーション化 |
| 数式を変形 | TransformMatchingTex(eq1, eq2) |
| 関数をプロット | ax=Axes(...); ax.plot(lambda x: x**2) |
| リアルタイム/連動する値 | ValueTracker + always_redraw(...) |
| 相対位置を指定 | m.next_to(other, RIGHT, buff=0.3) |
| 表示時間/イージング | self.play(a, run_time=2, rate_func=smooth) |
| グループをずらして表示 | LaggedStart(*anims, lag_ratio=0.2) |
| レンダリング/確認/GIF | manim -qh f.py S / -sql -n a,b / --format=gif |
注意点
Tex/MathTexには LaTeX が必要 です(Textには不要です)。欠落したグリフのボックスやコンパイルエラーが出る場合は、LaTeX がインストールされていないか、TeX 文字列に問題があります。必ず生文字列r"..."を使用してください。Transform(a, b)はaをbの見た目に変えます(bは追加されません)。ReplacementTransform(a, b)はbを画面上に残します。後続の処理でどちらのオブジェクトを参照するかに応じて選んでください。.animateは開始状態から終了状態までを補間するため、回転や一部の変形では不自然な軌道を通ることがあります。軌道が重要な場合は、専用のアニメーション(Rotate)を使用してください。add_updaterで追加したアップデーターは動き続けます。完了したらmob.clear_updaters()(またはremove_updater)で停止してください。そうしないと、その後のアニメーションとアップデーターが競合します。- 座標を勘で決めないでください。
next_to、arrange、VGroup(...).arrange(DOWN)、ax.c2p()を組み合わせると、編集後もレイアウトを維持できます。 construct()はタイムラインを スクリプト化するために 1 回だけ実行されます。リアルタイムループではないため、シードを設定せずに実時間や乱数を使用しないでください。
参考ファイル
references/math-and-text.md— Text、MarkupText、Tex、MathTex の違い、raw string、部分文字列の色付け(set_color_by_tex、substrings_to_isolate、{{ }})、TransformMatchingTexによる項の変形、LaTeX のプリアンブル/パッケージ。references/graphs-and-updaters.md—Axes/NumberPlane、plot、get_area、c2p/p2c、ValueTracker、always_redraw、add_updater、曲線をたどる点、アニメーションするカウンター。references/3d-and-camera.md—ThreeDScene、set_camera_orientation、ThreeDAxes、Surface/パラメトリック曲面、カメラの連続回転、MovingCameraSceneによる移動/追従。