1仕組みと動作原理
数学アニメーションを宣言的Pythonに変換します。Sceneサブクラスのconstruct()内にplay/waitを順次記述し、Manimが各Mobjectの状態とAnimationをタイムラインとして評価し、CLIからフレーム単位で決定論的なMP4/GIFをレンダリングします。
Every scene is declarative: you build vector objects, play timed animations over them, and render a deterministic MP4/GIF from the CLI.
全機能は3つの要素で構成されます。Scenes(演出・構成)がMobjects(ベクターオブジェクト)に作用し、Animations(時間制御された変化)を通じて表現されます。すべてのアニメーションコードはconstruct()という単一メソッド内に記述します。
Everything is **Scenes** (orchestration) acting on **Mobjects** (objects) via **Animations** (timed change).
数式組版はLaTeX(Tex/MathTex、raw文字列 r"..." が必須)が担当し、通常テキストはPango(Text/MarkupText、LaTeX不要)が担当します。この役割分担がランタイムの前提条件(TeXディストリビューション導入の要否)を直接左右します。
**LaTeX is required** for `Tex`/`MathTex` (not for `Text`).
関数と図形のアニメーションはAxes + ax.plotで表現し、ax.c2pを用いて数学座標を画面座標にマッピングします(画面座標の手動指定は禁止)。動的な値にはValueTrackerとalways_redraw/add_updaterを組み合わせ、依存オブジェクト(曲線上の点、カウンター、接線など)をフレームごとに再計算させます。
Drive live values with `ValueTracker` + `always_redraw`/`add_updater` so dependent mobjects recompute every frame
3Dとカメラは独立したレイヤーです。ThreeDScene + set_camera_orientation / Surface / begin_ambient_camera_rotationを使用し、2DではMovingCameraSceneのself.camera.frame.animateを用いてズームイン、追従、リセットを行います。
`ThreeDScene` + `set_camera_orientation(phi=, theta=)`, `ThreeDAxes`, `Surface`, `begin_ambient_camera_rotation()`
決定論的(再現性)であることが主要な強みです。同一シーンからは同一フレームがレンダリングされるため、動画全体をエンコードする前にまず静止画フレーム(PNG)をレンダリングして数式や組版を確認し、その後に本番出力を行う検証戦略がとれます。
Manim is deterministic — the same scene renders the same frames — so verify by rendering **frames** (PNG, no video encode) before committing to the full video.
CLIは3つの品質管理レバーを提供します。-sで最終フレームをPNG保存(エンコードなし)、-n a,bで特定のアニメーションインデックス区間のみレンダリング(途中の1コマを確認)、-q lで低品質イテレーションを実施。確認後に-qhで本番出力を行い、成果物はmedia/videos|images配下に出力されます。
- `-s` — **save the last frame as a PNG** (no video encode — the verification lever, see below).
機能の境界が明確に引かれています。UIアニメーション、SNS/マーケティング動画、CSVビジネスグラフは対象外とし、数式組版と直感的な可視化に特化しています。
Not the tool for UI motion, social/marketing video, or data-from-CSV business charts
実時間(ウォールクロック)依存やシードなしの乱数は禁止されています。construct()はタイムラインをスクリプト化するために1度だけ実行され、リアルタイムループは存在しません。乱数にはシード値が必須です。
`construct()` runs once to *script* the timeline; there is no realtime loop — never use wall-clock time or randomness without a seed.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | pip install manim(安装 Manim Community Edition,含 Python 3.9+ / ffmpeg / LaTeX 三项前置说明) |
| cli | manim CLI(-q / -p / -s / -n / --format=gif 渲染与质检) |
| package | Manim Community Edition(数学动画引擎本体,官方发包) |
| package | LaTeX 发行版(TeX Live / MiKTeX):仅 Tex / MathTex 需要;Text / MarkupText 走 Pango 不需要 |
| package | numpy(Manim 的数学依赖;reference 的 3D 曲面前置直接用 np.sin/np.cos) |
| cli | ffmpeg / ffprobe(Manim 编码 MP4 的底层依赖;仓库根 contact-sheet.sh 拼图与 probe-mp4.sh 断言) |
| network | 运行时无网络调用:skill 不访问任何 API/CDN;Manim 场景是纯本地 Python + 本地 ffmpeg + 本地 LaTeX 编译 |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: manim CLI(-pql / -sql / -s / -n a,b / -qh / -qm --format=gif)によるローカルレンダリングと品質検証、シーンのフレーム単位実行
- 网络端点: 外部ネットワークアクセスの宣言: 実行時のネットワーク呼び出しゼロ: Manimシーンは完全にローカルなPython + ローカルのffmpeg + ローカルのLaTeXで動作し、API、CDN、リモートサーバーへの参照は一切なし
- 本地工作目录: ファイル読み書きおよび成果物の出力: media/videos/<file>/<quality>/<Scene>.mp4 および media/images/.../<Scene>.png(-s)
5二重目の独立検証
- [ok] 外部依赖调用点复核(pip install manim / manim CLI / ffmpeg / LaTeX / numpy) — SKILL.md Setup 节确有 `pip install manim # needs Python 3.9+, ffmpeg, and a LaTeX distribution (for Tex/MathTex)` 与 `manim -pql scene.py SquareToCircle`;verify 段确有 `manim -sql scene.py MyScene -n 0,3`;math-and-text 确有 TeX Live/MiKTeX 说明;3d-and-camera 确有 np.sin/np.cos 用法;仓库根 scripts/README.md 确有 manim 与 probe-mp4 的用法示例。全部落地,非推测。
- [ok] 「运行期零网络」反查 — 四份文档与仓库脚本中无 API endpoint、无 curl/wget、无 fetch/requests、无 CDN import;Manim 场景全部是本地 Python 对象构造。唯一网络相关表述集中在 Setup 的包安装指令。结论成立。
- [ok] 无凭证 / 无 env 读取 — 全文无 API_KEY/token/secret/.env/.netrc 读取,无浏览器 cookie 取用,无环境变量透传;与同 pack 的 Remotion 系(走 npm 远端包)和 generative-illustration(走 OPENROUTER_API_KEY)形成鲜明对比。
- [ok] 确定性主张的成立条件 — SKILL.md 明确「Manim is deterministic — the same scene renders the same frames」,并在 gotchas 收尾补上边界:「never use wall-clock time or randomness without a seed」——即确定性依赖于不引入墙钟、随机须播种。主张有边界,非无条件承诺。
- [ok] 目录资产面清点 — skills/manim/ 下仅 SKILL.md(136 行)、references/ 三份(math-and-text 70 行 / graphs-and-updaters 61 行 / 3d-and-camera 68 行)、0 字节 README.md;无 scripts/、无 .py 样例文件、无模板资产——「纯指令 + reference」结论成立(场景脚本由使用者/agent 现写)。
- [discrepancy] 跨引用可解析性 — SKILL.md 提到「the `motion-design-skills` pack (`animation-principles` ...)」——该 pack 与 animation-principles 均不在本 repo(本 repo 仅 skills/manim 一个 skill),属同作者的另一个 pack,单装本 repo 时该引用悬空。另正文引用的 `scripts/contact-sheet.sh`、`scripts/probe-mp4.sh` 位于本 repo 根,单装 skill 目录会悬空。
- [ok] 能力边界声明与正文覆盖的一致性 — SKILL.md 自述「Not the tool for UI motion, social/marketing video, or data-from-CSV business charts」,而正文与三份 reference 确实只覆盖数学排版、函数/图形、3D 与相机;未出现与自述边界冲突的内容(无 UI/营销/CSV 章节)。
- [ok] 档位判据与站内先例的一致性 — 判蓝的两条支撑:① 依赖以「安装指令」形式出现、执行的是本地 CLI(先例 gsap-react 明确不因 npm 依赖抬档;hyperframes-animation/hyperframes-audio 因官方包安装 + 本地 CLI + 本地读写判蓝);② 运行期无网络外发、无凭证、无采集(不满足黄/橙)。同时保留「有外部依赖 + 有本地写盘 + TeX 编译面」的现实,故不判绿。判据留痕如上,便于复核与跨批次口径统一。
6結論
5ebe4ae4e425d911…