mcpField
M
manim-explainer-animation

manim-explainer-animation

github.com/calesthioクリエイティブ・メディア219119 回インストール15 週間前に更新
リポジトリ

manim-explainer-animation について

Manim Explainer Animationは、数学・グラフ・図の正確な動きを説明に活用する、コードベースの解説アニメーション制作スキルです。技術・教育動画の企画、シーン構成、タイミング調整、レビューを支援します。

主な機能

  1. 01説明を視覚的なビートに分解
  2. 02Manimコードによるシーン構築
  3. 03記号とレイアウトの一貫性維持
  4. 04アニメーションとナレーションの同期
  5. 05アクセシビリティと映像の確認

活用シーン

  1. 01数学的な導出のアニメーション化
  2. 02アルゴリズムの段階的な解説
  3. 03データや技術図の可視化
  4. 04教育向け解説動画の制作

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/calesthio/generative-media-skills --skill manim-explainer-animation

インストール後、Claude Code で/manim-explainer-animationを入力して読み込まれたか確認します。

同梱ファイルEVAL.md

詳細

Manim による解説アニメーション

このスキルは、説明が正確な記号、幾何学、グラフ、アルゴリズム、または図の動きに依存する解説アニメーションの制作に使用します。Manim は汎用的な動画レンダラーではなく、プログラム可能な説明ツールとして扱ってください。

根拠のラベル

  • 文書化された事実とは、「Sources」に記載された公式ドキュメントや規格に基づく動作や要件を指します。
  • 制作上のヒューリスティックとは、信頼性の高い解説を制作するための実践的なルールです。依頼内容に応じて調整してください。
  • エスカレーションのきっかけとは、作業を止め、先にユーザー、対象分野の専門家、法務担当者、またはプラットフォームの責任者に確認することです。
  • 変動しやすい情報とは、パッケージのバージョン、CLI フラグ、プラットフォームへの納品ルール、API の動作、料金、モデルやプロバイダーの提供状況を指します。制作時に再確認してください。

Manim を意図的に選ぶ

次のいずれかが成果物の中心となる場合は、Manim を選びます。

  • 数式、変換、証明、幾何学、ベクトル場、グラフ、数直線、座標系、アルゴリズム、状態機械、データグラフィックス、または技術図を、正確な位置と再現可能な動きで表現する必要がある。
  • 視覚的な論旨をコードから再現でき、専門家のフィードバックを受けて簡単に修正できることが望ましい。
  • シンボルの一貫性が必要で、同じ変数、色、軸、オブジェクト、または状態が時間経過後も同じ意味を保つ必要がある。
  • レンダリングを繰り返しながら、コード作成、レンダリング、確認、修正、再レンダリングのサイクルを回すと効果的である。

次の場合は、別のコンポジターや動画ツールを優先します。

  • 主な表現が実写、映画的なカメラワーク、質感のあるブランドモーション、キャラクターの演技、UI のキャプチャ、またはソーシャルメディア向けのキネティックタイポグラフィである。
  • フォトリアル、またはデザイン性の高いモーショングラフィックスをユーザーが求めており、After Effects、Remotion、HyperFrames/GSAP、Blender、または動画モデルを使うほうが早い。
  • 説明は静的な図とナレーションで伝えられ、時間軸に沿った正確な構成を必要としない。

必要に応じて、Manim のシーンを透過または全画面のセグメントとしてレンダリングし、その後コンポジターで音楽、字幕、ブランドのローワーサード、実写映像、またはプラットフォーム固有のパッケージングを仕上げるハイブリッド構成にします。

コードではなく、説明から始める

Manim のコードを書く前に、簡潔な制作ブリーフを作成します。

  1. 対象視聴者と前提知識。
  2. 1 文で表した学習目標。
  3. 中心となる誤解や問題意識。
  4. 専門家または情報源による確認が必要な正確な事実、数式、データセット、または分野に関する主張。
  5. 再生時間、アスペクト比、想定するナレーションのスタイル、納品先プラットフォーム。
  6. 制約事項:ブランドパレット、フォント、字幕、ローカライズ、アクセシビリティ、出典表記、音声なしでの視聴への対応。

次に、コンセプトを分解します。

  • **オブジェクト:**意味を持つすべての視覚オブジェクトと、それぞれが表すもの。
  • **シンボル:**変数、色、ラベル、単位、座標系とその意味。
  • **動作:**時間とともに何が変化し、各変化が何を教えるか。
  • **認知負荷:**各場面で表示、強調、非表示、またはフェードアウトする要素。
  • **検証:**レビュー担当者が視覚的、数学的に確認できる内容。

台本に、正確性が見た目以上に重要となる医療、法律、金融、安全、工学、科学、または教育上の主張が含まれる場合は、制作前にエスカレーションしてください。

教えやすいビートとしてのストーリーボード

ストーリーボードは、次の項目を含む表または構造化されたリストとして作成します。

  • time:予定している開始秒数と終了秒数。
  • narration:確定稿、または確定稿に近いセリフ。
  • visual_state:ビートの開始時に画面に表示されているもの。
  • animation:具体的な Manim のアクション、変形、カメラ移動、グラフの表示、または図の更新。
  • learning_purpose:この視覚的なアクションが学習にどう役立つか。
  • assets_or_data:数式、データファイル、SVG、画像、フォント、または引用元。
  • qa_checks:レンダリング、数学、コントラスト、レイアウト、字幕、点滅に関するチェック。

制作のヒューリスティクス:

  • 1つのビートにつき、概念の変化は1つにします。ナレーションで2つのことを述べる場合は、ビートを分割するか、明確な視覚的階層を使います。
  • 置き換えより変形を優先します。a が a^2 になる、点が曲線上を移動する、ノードが消えずに状態を変える、といった連続性を示すと、視聴者の理解につながります。
  • 表示順を教材として活用します。まず問いを示し、次に対象、ルール、その結果の順で提示します。
  • 常に見える基準となる要素を用意します。詳細が変化しても、数式、軸、図の骨格、凡例などは固定しておきます。
  • 間を意図的に使います。難しい変形のあとに短い wait() を入れるほうが、別のアニメーションを追加するより学習効果が高いことがあります。

シーン構成

確認されている仕様:Manim のスクリプトでは通常、Scene を継承するクラスを定義し、construct() にアニメーションコードを記述し、視覚オブジェクトを mobject として管理し、Scene.play() でアニメーションを再生します。

シーンは本番用コードとして構築します。

  • 動画全体を対象とする1つの巨大なシーンは、動画が非常に短い場合を除き避け、論理的な章またはレンダリング区間ごとにクラスを1つ作成します。
  • 配色、フォント、寸法、再生時間、記号の色は、名前付き定数にまとめます。
  • 軸、数式の行、コールアウトボックス、グラフのラベル、アルゴリズムのノードなど、繰り返し使う構成要素にはヘルパー関数を作成します。
  • ファイルの先頭近くに記号の一覧を置きます。例:x = yellow、rate = blue、area = green など。
  • 座標が画面上の位置ではなく概念上の位置を表す場合は、コードコメントで単位を明示します。
  • マジックナンバーの座標は避けます。名前付きアンカー、next_to、align_to、to_edge、arrange、VGroup、および必要に応じて c2p()/coords_to_point() などの軸変換メソッドを使います。
  • 小さなシーンメソッドを使います。introduce_problem()、build_axes()、show_invariant()、compare_cases()、conclude() などです。
  • 決定的な入力を使います。Python パッケージの構成を固定し、Manim のバージョンを記録し、ソースデータをローカルに保持し、乱数を使う場合は明示的な乱数シードを設定します。

プロジェクトの基本構成例:

project/
  pyproject.toml or requirements.txt
  scenes/
    main.py
    theme.py
    data/
      measurements.csv
    assets/
      logo.svg
  renders/
  captions/
  README-production-notes.md  # outside this skill; for the user's project handoff

theme.py のパターン例:

from manim import *

BG = "#0B1020"
FG = "#F6F7FB"
MUTED = "#8A93A6"
ACCENT = "#FFD166"
BLUE = "#4CC9F0"
GREEN = "#80ED99"
RED = "#FF5C8A"

TITLE_SIZE = 46
BODY_SIZE = 30
FORMULA_SIZE = 42

def title(text: str) -> Text:
    return Text(text, font="Inter", color=FG, font_size=TITLE_SIZE)

def caption(text: str) -> Text:
    return Text(text, font="Inter", color=MUTED, font_size=24)

座標系とレイアウト

確認されている仕様:Manim には Axes や NumberPlane などの座標系用 mobject があり、Axes には座標から点への変換、グラフのラベル付け、折れ線グラフの描画などのメソッドが用意されています。

制作ルール:

  • シーン座標と数学座標を区別します。シーン上の点 (2, 2, 0) は、平面がデフォルトのフレームでない場合や、軸オブジェクトを通して変換しない場合、概念上の軸における点 (2, 2) と同じとは限りません。
  • グラフ上のすべての点は、グラフオブジェクトを通して作成します。axes.c2p(x, y)、axes.plot(...)、axes.get_lines_to_point(...) などを使います。
  • 字幕、プラットフォームの UI、モバイルでのトリミングに備えて、安全な余白を確保します。
  • 安定した配置エリアを設けます。数式は上部/左側、視覚化は中央、説明ラベルはオブジェクトの近く、字幕は下部3分の1を基本とします。ただし、焼き込み字幕で別のレイアウトが必要な場合は除きます。
  • 3D を使う場合は、まず 3D が本当に必要か検討します。3D は曲面やベクトル幾何の理解に役立ちますが、関係性を見えにくくすることもあります。向きを把握する手がかりや軸ラベルを用意し、カメラ移動は追跡できるようゆっくり行います。
  • 縦型動画では、同時に表示するオブジェクトを減らし、変形を縦に積み重ねます。16:9 の座標平面を単純に切り抜くだけにしないでください。

タイポグラフィ、数式、記号の一貫性

確認済みの事実:Manim は通常のテキストモブジェクトと、LaTeX ベースの Tex/MathTex をサポートしています。追加の LaTeX パッケージは TexTemplate を通じて追加でき、MathTex では部分文字列を分離して、特定の部分を確実に色付けしたり変形したりできます。

制作ルール:

  • 通常の言語ラベルには Text を、数学的な表記には MathTex/Tex を使用します。
  • 数式は大きく表示します。数式が複数行になる場合は、詰め込んだ段落ではなく、導出の流れとしてアニメーション化します。
  • 強調表示や変形が必要な記号には、substrings_to_isolate、二重波括弧による分割、または別々の文字列引数を使用します。
  • 変更を説明せずに、記号の色を一貫性なく変えることは避けます。
  • 数式台帳を用意します。記号、意味、色、初出箇所、単位を記録します。
  • アクセシビリティのため、数式の意味を説明するナレーションを作成します。視聴者が視覚的な数式を読むことだけに頼ってはいけません。
  • 納品を約束する前に、LaTeX をローカルでテストします。TeX パッケージやフォントの不足、OS の違いは、制作を妨げる一般的な要因です。

数式変換のパターン:

start = MathTex(r"A", r"=", r"\pi", r"r^2", font_size=56)
expanded = MathTex(r"A", r"=", r"\pi", r"\cdot", r"3^2", font_size=56)
for mob in (start, expanded):
    mob.set_color_by_tex("A", YELLOW)
    mob.set_color_by_tex("r", BLUE)
self.play(Write(start))
self.play(TransformMatchingTex(start, expanded))

グラフ、データ、図、アルゴリズムのアニメーション

グラフの場合:

  • プロットする前に、軸の範囲と単位を定義します。
  • スタイライズした解説でも、軸と単位にラベルを付けます。
  • まず定義域をアニメーション化し、次に関数またはデータ、その後に注釈を表示します。
  • 時間経過による変化を伝えるには、移動する点、接線、塗りつぶした領域、しきい値線などを使用します。
  • データセットの場合は、データソース、タイムスタンプ、変換処理、平滑化の有無を記録します。データが重大な主張を裏付ける場合は、エスカレーションします。

図の場合:

  • 論理モデルと視覚的なスタイルを分けます。まずノード、エッジ、状態、遷移を定義し、その後に色や動きを決めます。
  • 空間的なメタファーは一貫させます。時間は左から右、階層は上から下、包含は同心円、関係性はネットワークで表します。
  • 因果関係を示すにはエッジのアニメーションを、状態を示すには色や状態の変化を使用します。
  • 図が公式のアーキテクチャ、システム、またはプロトコルに似ている場合は、情報源または SME に確認します。

アルゴリズムの場合:

  • 入力、不変条件、状態、操作、出力を示します。
  • 問題全体ではなく、小さな実例を用いて説明します。
  • 現在のインデックスや状態を示すポインター/カーソルのモブジェクトを使用します。
  • アルゴリズムが保存された値に依存する場合は、メモリ/状態を表示するためにテーブルまたは VGroup を使用します。
  • 実行中の疑似コードの行だけでなく、操作がなぜ有効なのかをナレーションで説明します。

ナレーションとタイミングの同期

確認済みの事実:Manim Voiceover は、ナレーションのテキストをシーンのコードに関連付け、アニメーションとの同期に使える再生時間の追跡機能を提供する、公式の Manim Community プラグインの利用方法です。

次の 3 つのタイミングモードのいずれかを使用します。

  1. 無音/ビジュアル優先: ナレーションは使用せず、すべての意味をビジュアル、タイトル、ラベル、キャプションから読み取れるようにします。
  2. ナレーション主導: 先に録音または音声合成を行い、その後、音声に合わせてアニメーションのタイミングを調整します。
  3. コード主導とナレーションプラグイン: Manim Voiceover などのワークフローを使って、ナレーションのテキストをシーンのブロックに紐付け、トラッカーの再生時間を利用します。

制作上の目安:

  • ユーザーから別のスタイルを求められない限り、技術的な内容ではナレーションの速度を 1 分あたり約 120~160 語に保ちます。
  • 難しいビジュアルには十分な時間を与えます。数式が変形している間に、新しい概念を話し始めることは避けます。
  • 視覚的な強調を、話し言葉での強調と一致させます。ナレーションで「傾き」と言う瞬間に、傾きを強調表示します。
  • キャプションは、初期の草稿ではなく、最終的なタイミング調整済みスクリプトから書き出すか作成します。
  • TTS を使用する場合は、プロバイダー、モデル/音声、パラメーター、ライセンス上の制約、生成ファイルのパスを記録します。制作時にプロバイダーの規約と提供状況を再確認します。

ナレーションのタイミングのパターン:

from manim import *
from manim_voiceover import VoiceoverScene
from manim_voiceover.services.recorder import RecorderService

class SlopeIntro(VoiceoverScene):
    def construct(self):
        self.set_speech_service(RecorderService())
        axes = Axes(x_range=[0, 4], y_range=[0, 4]).add_coordinates()
        line = axes.plot(lambda x: x, x_range=[0, 3], color=YELLOW)

        with self.voiceover(text="A line's slope tells us how fast y rises as x moves right.") as tracker:
            self.play(Create(axes), run_time=tracker.duration * 0.35)
            self.play(Create(line), run_time=tracker.duration * 0.65)

アクセシビリティと安全性

文書化された事実:WCAG 2.2 では、メディアがテキストの代替メディアとして明確にラベル付けされている場合を除き、同期メディア内の収録済み音声にはレベル A で字幕が求められています。WCAG 2.2 にはレベル A の点滅に関する基準もあり、定められたしきい値を下回る場合を除き、コンテンツは 1 秒間に 3 回を超えて点滅してはなりません。

制作要件:

  • ユーザーが動画はテキストの代替メディアとしてラベル付けされていると明示した場合を除き、ナレーション付きの書き出しには字幕を付けてください。
  • 理解に影響する場合は、意味のある非音声の音も字幕に含めてください。
  • 教育、コンプライアンス、または音声のない状況では、トランスクリプトを用意してください。映像に、音声では伝えられない重要な意味が含まれる場合は、映像の説明も含めてください。
  • 全画面の急な点滅、コントラストの強い点滅、赤色の繰り返しの点滅は避けてください。視覚的な警告が必要な場合は、ゆっくりしたパルス、輪郭線、矢印、またはラベルを使用してください。
  • テキストや重要なラベルの色のコントラストを確認してください。色だけで意味を伝えず、ラベル、形状、位置、またはパターンを組み合わせてください。
  • モバイルでは小さすぎる数式を避けてください。縦向きのプレビューを表示するか、想定されるデバイスサイズで確認してください。
  • 動きに敏感な人に配慮し、不要なカメラの回転、速いズーム、揺れを避けてください。情報量の多い技術コンテンツでは、直接カットまたはゆっくりしたトランジションを使用してください。

クライアントが正式なアクセシビリティ適合、規制対象の教育コンプライアンス、医療・安全に関する指導、または公共部門への納品を求める場合は、エスカレーションしてください。制作上の根拠資料を提示しますが、法的助言は行わないでください。

アセットの管理と来歴

外部から取り込んだすべての素材について、アセット台帳を維持してください。

  • ソース URL またはローカルパス;
  • 判明している場合は作成者/所有者;
  • ライセンスまたは許可の状況;
  • アクセスした日付;
  • 実施した変換;
  • 最終的なレンダリングに素材が含まれているかどうか;
  • プライバシー、同意、ブランド、またはデータ利用に関する懸念の有無。

文書化された事実:C2PA Content Credentials は、C2PA マニフェストに来歴データを保存します。仕様では、来歴データをコンテンツの良し悪しに関する価値判断として扱うべきではないと明示的に警告しています。

制作ルール:

  • ソースコード、データセット、レンダリングしたフレーム/動画、音声、字幕、来歴に関するメモを、プロジェクトの引き継ぎ資料にまとめて保管してください。
  • プラットフォームまたはクライアントが Content Credentials/C2PA を求める場合は、互換性のある署名ワークフローを使用し、後処理後に最終的な書き出しファイルを検証してください。納品時に、対象フォーマットへの対応状況を再確認してください。
  • C2PA が真実を証明すると主張しないでください。正しく実装されていれば、出所、編集内容、改ざんを検知できるメタデータを伝えられます。
  • AI 生成のナレーション、音楽、画像、またはコード支援については、ツール、モデル名、該当する場合はプロンプト、日付、権利/利用条件に関するメモを記録してください。

著作権のある教科書の図、独自のデータセット、許可のないブランド素材、生徒・医療・個人データ、または来歴メタデータが法的拘束力を持つことを求める要件については、エスカレーションしてください。

レンダリング設定と納品

文書に記載されている情報:Manim はファイルからシーンクラスをレンダリングし、既定では media ディレクトリ内に出力を書き込みます。品質に応じて出力フォルダーが分かれます。Manim v0.19.0 のドキュメントによると、Manim のコアインストールでは外部の FFmpeg が PyAV に置き換えられましたが、後処理や納品用のトランスコードには引き続き FFmpeg が便利です。

開発ワークフロー:

  • まず低品質で単一シーンをレンダリングし、高速なプレビューを作成します。
  • レイアウトやタイミングのデバッグ時は、該当箇所だけをレンダリングします。
  • 最終版は、目標とするアスペクト比、フレームレート、解像度でレンダリングします。
  • Manim の出力だけでなく、後処理後にも最終動画を確認します。

現在のドキュメントを確認してから調整する、Manim の一般的なコマンド:

manim -pql scenes/main.py SceneName      # quick local preview
manim -pqm scenes/main.py SceneName      # medium review
manim -pqh scenes/main.py SceneName      # high-quality review
manim -p --format=png scenes/main.py SceneName  # spot-check stills if supported in current version

FFmpeg を使った一般的な仕上げ作業:

  • 個別にレンダリングしたシーンファイルを結合する;
  • 音声を追加または多重化する;
  • 幅広い互換性を確保できるよう、H.264/AAC MP4 にトランスコードする;
  • サムネイルやレビュー用静止画を作成する;
  • 必要に応じてラウドネスをノーマライズする;
  • プラットフォームまたはクライアントがオープンキャプションを必要とする場合に限り、字幕を映像に焼き込む。

制作時に、プラットフォームの納品仕様を再確認してください。ソーシャルメディア、LMS、放送、カンファレンス、広告の各プラットフォームでは、受け入れ可能なコーデック、アスペクト比、字幕形式、ファイルサイズ制限、安全領域のオーバーレイが変更されることがあります。

再現性パッケージ

本格的な Manim の解説動画では、以下をすべて引き渡します:

  • ソースコードと正確なレンダリングコマンド;
  • 依存関係ファイル(requirements.txt、pyproject.toml、ロックファイル、または環境のエクスポート);
  • Manim のバージョンとレンダラーに関する注記;
  • 該当する場合は、OS またはコンテナの詳細;
  • ソースアセットとデータ;
  • 最終スクリプトと字幕ファイル;
  • レンダリング済みの出力とサムネイル;
  • アセット/来歴の台帳;
  • 既知の制限事項とレビュー記録;
  • 単一シーンと最終コンポジションを再レンダリングする手順。

プロジェクトで生成音声、生成音楽、または外部 API を使用する場合は、アセットを再現または置き換えるのに十分なメタデータを含めてください。プロバイダーが保証し、シードや設定が記録されている場合を除き、API の出力が完全に再現できると想定しないでください。

QA ワークフロー

次の段階に分けて QA を実施します:

  1. コード QA: インポートが正常に完了すること、シーンクラス名が正しいこと、ファイルが欠落していないこと、意図的な場合を除き絶対パスがハードコードされていないこと、依存関係が記録されていることを確認します。
  2. レンダリング QA: プレビューと最終版のレンダリングが完了すること、ラベルの切り抜き、字幕の重なり、テキストの不可視化、グリフの欠落、SVG の破損、カクつきがないことを確認します。
  3. 教育内容 QA: 各ビートで「視聴者はここで何を学ぶべきか?」に答えられること、説明のない記号がないこと、ナレーションと矛盾するビジュアルがないことを確認します。
  4. 技術的正確性 QA: 必要に応じて、数式、単位、グラフのスケール、アルゴリズム、データ変換を情報源/分野専門家がレビューします。
  5. アクセシビリティ QA: 字幕/トランスクリプト、コントラスト、色に依存しない表現、モバイルでの読みやすさ、点滅のリスク、動きの快適さを確認します。
  6. 納品 QA: 最終ファイルを開けること、音声が正しく同期していること、尺/アスペクト比/コーデックが目標仕様を満たしていること、字幕が指定形式であることを確認します。
  7. 来歴 QA: 情報源と生成アセットが記録されていること、必要な許可と Content Credentials のワークフローが処理済み、またはエスカレーション済みであることを確認します。

レンダリングを繰り返しながら修正してください。レンダリングに失敗したら、最初のトレースバックを確認し、最小のシーンを切り分けて原因を修正し、全動画のレンダリングを試みる前にそのシーンを再レンダリングします。

よくある失敗と修正方法:

  • 数式をコンパイルできない: LaTeX を簡略化し、必要なパッケージを TexTemplate に追加し、エスケープを確認して、最小限のテストシーンをレンダリングします。
  • 記号をハイライトできない: 部分文字列を切り分けるか、数式を複数の引数に分割します。
  • オブジェクトがずれたり重なったりする: 固定座標ではなく、レイアウトコンテナとアンカーを使用します。
  • グラフ上の点の位置がずれている: シーン座標ではなく、axes.c2p() で変換します。
  • ナレーションが早口に感じられる: ビートを分割し、間を加えるか、同時に動く要素を減らします。
  • 最終出力がプレビューと異なる: レンダリング品質、フレームレート、アスペクト比、フォントの利用可否、後処理コマンドを確認します。

例:微積分のミニ解説

意図の例:高校生向けに、「瞬間的な変化率としての導関数」を説明する、ナレーション付き45秒アニメーションを作成します。

絵コンテの抜粋:

時間ナレーションビジュアルアニメーションQA
0-5s「平均速度は、距離を時間で割ったものです。」曲線上の2点2点の間に割線を描くラベルが読みやすい
5-15s「時間の幅を縮めます。」同じ曲線と割線2つ目の点を1つ目の点に近づける点が曲線に沿って動く。軸にずれがない
15-28s「割線が接線になります。」点における接線割線を接線に変形する数式とビジュアルが一致している
28-40s「この極限の傾きが導関数です。」f'(x) の数式\Delta x \to 0 を強調し、その後 f'(x) を強調する数式の色の対応表
40-45sまとめ曲線、接線、簡潔なキャプション不要なラベルをフェードアウトするキャプションのセーフエリア

Manim シーンの例:

from manim import *

class DerivativeAsLimit(Scene):
    def construct(self):
        self.camera.background_color = "#0B1020"
        axes = Axes(
            x_range=[0, 4, 1],
            y_range=[0, 5, 1],
            x_length=7,
            y_length=4.5,
            axis_config={"color": "#8A93A6", "include_numbers": True},
        ).to_edge(DOWN)
        labels = axes.get_axis_labels(MathTex("t"), MathTex("s(t)"))

        curve = axes.plot(lambda x: 0.45 * (x - 1) ** 2 + 1, x_range=[0.2, 3.8], color="#4CC9F0")

        x0 = 1.35
        dx_tracker = ValueTracker(1.8)

        p0 = always_redraw(lambda: Dot(axes.c2p(x0, 0.45 * (x0 - 1) ** 2 + 1), color="#FFD166"))
        p1 = always_redraw(lambda: Dot(
            axes.c2p(x0 + dx_tracker.get_value(), 0.45 * (x0 + dx_tracker.get_value() - 1) ** 2 + 1),
            color="#80ED99",
        ))

        secant = always_redraw(lambda: Line(
            p0.get_center(),
            p1.get_center(),
            color="#FFD166",
        ).set_stroke(width=5))

        formula = MathTex(
            r"\text{slope}", r"=", r"\frac{\Delta s}{\Delta t}",
            font_size=48,
        ).to_edge(UP)
        formula.set_color_by_tex(r"\Delta", "#FFD166")

        limit_formula = MathTex(
            r"f'(t)", r"=", r"\lim_{\Delta t \to 0}", r"\frac{\Delta s}{\Delta t}",
            font_size=48,
        ).to_edge(UP)
        limit_formula.set_color_by_tex(r"\Delta", "#FFD166")
        limit_formula.set_color_by_tex(r"f'", "#80ED99")

        self.play(Create(axes), Write(labels))
        self.play(Create(curve))
        self.play(FadeIn(p0), FadeIn(p1), Create(secant), Write(formula))
        self.wait(0.5)
        self.play(dx_tracker.animate.set_value(0.18), run_time=4, rate_func=smooth)
        self.play(TransformMatchingTex(formula, limit_formula))
        self.play(Circumscribe(limit_formula[0], color="#80ED99"))
        self.wait(1)

この構成が効果的な理由:

  • 2つの点と割線は、axes.c2p() を通じて同じ座標軸に結び付いています。
  • 縮小する区間は、説明文だけでなく動きとして見せています。
  • 視聴者が幾何学的な極限を見てから、数式を変形しています。
  • 色の意味は一貫しています。有限の変化には黄色、導関数の結果には緑を使います。

想定される修正:

  • Manim Voiceover でナレーションのタイミングを追加します。
  • 画面下部のテロップ領域と書き起こしを追加します。
  • 視聴者に具体的な背景知識が必要な場合は、実際の速度の例を使った2つ目のシーンを追加します。

例:アルゴリズムの解説

意図の例:初心者向けに二分探索を説明する60秒のアニメーションです。

制作計画:

  • 配列を、並べ替え済みのボックスの列で表示します。
  • 3つのポインター low、mid、high を常に表示します。
  • 破棄した範囲はグレー表示にします。すぐに消さないでください。
  • 不変条件を表示します:「ターゲットが存在する場合、それは引き続き探索範囲内にあります。」
  • ターゲット値を1つ使い、3回の反復を表示します。

ビジュアルの状態構造の例:

values = [2, 5, 8, 12, 16, 23, 38]
boxes = VGroup(*[
    VGroup(Square(side_length=0.7), Text(str(v), font_size=24)).arrange(ORIGIN)
    for v in values
]).arrange(RIGHT, buff=0.12)

low_arrow = Arrow(DOWN, UP, color=BLUE).scale(0.45)
mid_arrow = Arrow(DOWN, UP, color=YELLOW).scale(0.45)
high_arrow = Arrow(DOWN, UP, color=GREEN).scale(0.45)

QA チェック:

  • 列の並び順が維持され、読みやすいこと。
  • ポインターのラベルが重ならないこと。
  • 破棄した範囲を無視してよい理由を、ナレーションで説明していること。
  • 最後に、見つかったか見つからなかったかが明示されていること。

例:データの解説

意図の例:移動平均がノイズを平滑化する様子を、小さなデータセットを使ってアニメーションで示します。

制作計画:

  • まず元のデータ点を表示します。
  • 軸に単位と出典を記載します。
  • x 軸上を移動するウィンドウを括弧で示し、アニメーションさせます。
  • ウィンドウでルールを示してから、移動平均の線を描きます。
  • 「平滑化によって傾向が見えやすくなる一方、短期的な変動は隠れます。」という注記を残します。

QA チェック:

  • データの出典と変換を記録していること。
  • 平滑化の方法とウィンドウサイズを明記していること。
  • 台本に記載があり、手法が対応している場合を除き、アニメーションが予測を示唆しないこと。
  • グラフから導く現実世界に関する主張は、出典を確認していること。

出典と確認日

2026年7月11日にアクセスした出典:

制作時に再確認が必要な変動情報:

  • 現行の Manim Community のバージョン、CLI フラグ、レンダラーの動作、プラグインとの互換性。
  • オペレーティングシステムまたはコンテナにおける、現在の LaTeX/Pango/フォントのインストール要件。
  • Manim Voiceover が現在サポートしているサービスと API の動作。
  • FFmpeg のビルド機能とコーデックの利用可否、特に libx264/AAC のサポート。
  • 配信プラットフォーム固有の、アスペクト比、コーデック、字幕、再生時間、ビットレート、ファイルサイズ、サムネイル、来歴メタデータに関する規則。
  • クライアント、管轄区域、機関、配信プラットフォームに固有のアクセシビリティ要件または法的要件。

コメント