Communitygithub.com

jindratilk/ae-motion-graphics

After Effectsでネイティブかつ編集可能なモーショングラフィックスを作成・再現するためのスクリプト駆動型スキル。アニメーション、製品動画、UIアニメーション、プロモーション、リファレンス動画の再現に使用。

ae-motion-graphics とは?

このスキルは、Adobe After Effects上でプロフェッショナル品質のモーショングラフィックスを、完全にスクリプト駆動で作成・再現するためのものです。ユーザーはPython DSL(`kit.py`)でモーションをデータとして記述し、`build.py`などのビルドツールを通じてAEScript(JSX)に変換することで、テキスト、シェイプ、カメラ、ライト、3Dモデルなどを含む完全にネイティブで編集可能なAfter Effectsプロジェクトを生成できます。 対応するモードは「RECREATE」(リファレンス動画を1:1で再現)と「CREATE」(オリジナル作品を制作)の2つ。各モードに応じた設計プロセス(分析、コンセプト、ストーリーボードなど)を経て、モーション制作の品質と編集可能性を両立します。 重要なルールとして、キーフレーム数を最小限に抑え(1つのプロパティあたり7~12個以下)、速度グラフで滑らかな弧を描くカーブ設計を行い、すべての要素をネイティブ(テキスト、シェイプ、エフェクトなど)で構成します。また、複数のエージェントが同時にAEを操作する場合の競合を避けるため、PIDベースの通信やプロジェクトIDガードなどの配慮が組み込まれています。 最終的には、`aerender_job.py`による高品質レンダリング、連絡票生成、スチル書き出しなどを通じて、プロダクションレディな成果物を提供します。

対応~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/jindratilk/claude-skill-ae-motion-graphics/tree/HEAD

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

After Effectsで世界クラスのモーショングラフィックス:プロセス

以下の共通基盤を踏まえ、該当するモードに従い、最後にQAと納品で締めくくります:

  1. パートA – After Effectsに接続する。 自身のAEインスタンスを確実に制御できるようにします。
  2. パートB – 常に適用されるルール。 制作に入る前に、共有のアニメーションおよび編集可能性ルールを読みます。
  3. パートC – RECREATEプロセス。 分析、計測、比較を通じてリファレンスに合わせます。
  4. パートD – CREATEプロセス。 リサーチ、コンセプト、ストーリー、制作を通じてオリジナル作品を開発します。
  5. パートE – 仕上げ。 最終レンダリングを確認し、要求された納品物をパッケージングします。

作業モード

モード目標開始方法
RECREATEリファレンス動画と1:1でタイミング、レイアウト、動き、見た目を合わせ、ネイティブで再構築。リファレンスを分析・計測。それがストーリーを定義します。
CREATEブランドや製品向けにオリジナルの動画を制作。リサーチ、コンセプト、ストーリー、ムードボードの後、制作。

パートA – After Effectsに接続する

目標は、他のエージェントに邪魔されず、GUIを触らずに操作できる、プライベートで信頼性が高くスクリプト可能なAfter Effectsインスタンスを確保することです。

A1. 自身のインスタンスを起動する

  1. 実行中のAEのPIDを記録:pgrep -f "Contents/MacOS/After Effects"。
  2. 新しいインスタンスを起動:
    open -n "/Applications/Adobe After Effects 2026/Adobe After Effects 2026.app" --args -m
    
    小さなSwiftランチャー(NSWorkspace.openApplication を createsNewApplicationInstance=true および引数 -m -ApplePersistenceIgnoreState YES で使用)でも同じことができ、PIDを直接返します。
    • 生のバイナリを subprocess.Popen で起動しないでください。 そのプロセスはバンドル登録されておらず、AppleEventを受信できません。
  3. PIDリストの差分を取り、新しいPIDを以降のコマンド用に保持します。
    • AEは起動後に新しいPIDで再生成される場合があります。「Adobe After Effects」メインウィンドウを所有するPIDを取得します(Quartz CGWindowListCopyWindowInfo)。
    • バンドルIDは com.adobe.AfterEffects.application です。
  4. スタートアップダイアログをクリアします(クラッシュ修復→続行)。これらのインスタンスのAdobeサインインウィンドウは既知の表示グリッチです:無視し、決して認証情報を入力せず、ユーザーにエスカレーションしないでください。
  5. ensure_ae.py がこれをすべて自動化します:PIDが死んだときに再起動し、小さなダイアログを確認し、再生成されたPIDを検出し、プロジェクトを再オープンします。

A2. PIDのみで通信する

  • tell application "Adobe After Effects 2026" は任意のインスタンス(他のエージェントのインスタンスも含む)にヒットします。絶対に使用しないでください。
  • aedo(Swift)はAppleEvent misc/dosc(DoScript)を1つのPIDに送信します。
  • ae.py script.jsx または ae.py -e "code" はすべてのスクリプトをラップします:
    • ES3 JSON polyfill(json.jsx)を含む;
    • app.beginSuppressDialogs() を呼び出す;
    • try/catch内で $.evalFile を実行する;
    • 結果ファイルに {ok, value, error, line, file, ms} を書き込む。AppleEventの戻り値は信頼できないため、常にファイルを読み取ります。
  • プロジェクトIDガード: 変更を加えるスクリプトの前に、対象のPIDと app.project.file が編集中のプロジェクトと一致することを確認します。確認していないインスタンスを閉じたり終了したりしないでください。
  • 一度に1つのAEスクリプトを実行します。スクリプトは多くの場合べき等ではないため、一括変更の前にバックアップするか「名前を付けて保存」します。

A3. 実際の作業前のヘルスチェック

1つのスクリプトで、以下を読み取ります:

  • app.version とプロジェクトが自分のものかどうか;
  • コンポジションレンダラー(ADBE Advanced 3d は3Dモデルレイヤーと環境ライトに必要);
  • フォント:app.fonts.getFontsByPostScriptName(name).length が使用予定のすべてのフォントで0より大きいこと;
  • テストとして saveFrameToPng がディスクに現れること。

また、スクリプトがファイルを書き込み、ネットワークにアクセスできるようにする環境設定(Pref_SCRIPTING_FILE_NETWORK_SECURITY)を設定します。

A4. ビルドパイプライン:データ → ネイティブプロジェクト

利用可能なビルドヘルパーを使用するか、同等のものを実装します。以下のヘルパー名はその役割を説明しています。

  1. Pythonが動画をデータとして記述する。 kit.py DSLが提供するもの:

    • K() 疎キーと名前付きイージング;
    • shape、text、precomp、null、camera、model、L(レイヤー);
    • matchNameによるエフェクト、マスク、トラックマット、エクスプレッション、マーカー、ノート、ラベル。

    シーン仕様を組み合わせて1つのビルド仕様にします。

  2. kit.jsx が仕様からネイティブレイヤーを構築する。

    • レイヤーを下から上に作成するため、最終的な順序になります。moveTo による大量の並べ替えは避けてください。AEが停止する可能性があります。
    • その後、ペアレント化、エフェクト、マスク、トランスフォーム、イージング、マット、環境ライトの配線を適用します。
  3. build.py spec.json --new --only "A|B" --stills "Comp:t1,t2" --save output.aep

    • --new は現在のプロジェクトを保存せずに閉じます(CloseOptions.DO_NOT_SAVE_CHANGES)。そうしないと newProject() が「名前を付けて保存」ダイアログを開いてハングします。
  4. スチル: stills.py "Comp" t1,t2 prefix。

    • saveFrameToPng は非同期(ファイルが存在するまでポーリング)であり、16ビット PNGを書き込みます(8ビット表示の前に257で割ります)。
  5. 対象を絞ったモーションレンダリング: render.py "Comp" start end out.mp4 [--half] [--hq]、または -s/-e を使用したaerender。

  6. フルレンダリング: aerender_job.py "Comp" out.mp4 [--half] [--hq]。

    • ジョブのコピーを保存し、別プロセスで aerender -project job.aep -rqindex 1 -sound ON を実行します。
    • アプリ内キューよりも高速であり、クラッシュしても作業中のインスタンスはダウンしません。
  7. 連絡票: contact.py(動画からのフレーム)および sheet.py(スチル、アスペクト比維持)。表示前に必ず画像を縮小します。

A5. ExtendScriptのルール(ES3)

  • JSON や Array.indexOf はなし:polyfillまたはループを使用します。eval('('+text+')') でJSONを読み取ります。
  • 三項演算子の連鎖は絶対に使用しない(a?x:b?y:z は誤って評価される)。if/elseを使用します。
  • プロパティはmatchNameで指定します。表示名のルックアップは39バイトの制限があり、ローカライズされています。
  • カメラは threeDLayer ではありません:matchName==='ADBE Camera Layer' でテストします。
  • 値の次元を正規化します:分離次元にはスカラーを、3Dプロパティには3要素の配列を渡します。
  • shutterPhase は整数でなければなりません。
  • テキストの塗りつぶし色を設定する前に applyFill=true を設定します。
  • レイヤーごとに新しい TextDocument を作成します。スタイリング前に resetCharStyle()/resetParagraphStyle() を呼び出します。
  • 「プロパティまたは親が非表示」エラーは、プロパティがその場所に適用されないことを意味します。例:環境ライトのY回転は設定できません。代わりにそのソースマップをアニメーション化します。
  • シェイプのグラデーション塗りつぶしの色はスクリプトで設定できません。代わりにグラデーションランプエフェクトまたはレイヤー化されたライトグループを使用します。

A6. 他のエージェントとの共存

  • 他のエージェントは「名前で」AEを終了する場合があり、それがあなたのインスタンスにも影響します。頻繁に保存し、ensure_ae.py を準備しておきます。
  • 終了トリガーによる「保存しますか?」ダイアログでEscapeを押すと、AEが終了します。
  • コンピューター使用およびアクセシビリティツールは、他のインスタンスのウィンドウしか見えない場合があります。PIDでフィルタリングしたQuartzウィンドウリストと screencapture -l <windowId> を使用して、自分のウィンドウを診断します。自分の PIDのSystem Eventsを介してそれらを閉じます(キーコード36=Return、53=Escape)。
  • 他のAEインスタンスへの偶発的な干渉は開示してください。

パートB – 常に適用されるルール

両方のモードでこれらのルールを適用し、モーションをスムーズに保ち、プロジェクトを編集可能にします。

B1. キーフレーム:可能な限り少なく

  • スムーズなモーションを得るために、可能な限り少ないキーフレームを使用します。 カーブを持つ10個のキーは、1000個のフラットなキーよりも優れています。
  • 1つのジェスチャーには2〜4個のキーが必要です:開始、終了、および実際のホールドまたは実際の極値(ピーク、谷、位相変化)。
  • 各プロパティは約7〜12個のキーに抑えます。それ以上のキーは通常、モーションが設計されていないことを意味します。
  • モーションを1フレームごと(または2フレームごと)のリニアキーとしてベイクしないでください。エディターが編集できず、機械的に見えます。
  • モーションが測定値やレガシーデータから得られた場合は、フィットさせてください(B3を参照)。サンプルをペーストしないでください。

B2. カーブ:速度グラフでの滑らかな弧

  • アニメーション化されたすべてのプロパティの速度グラフを開きます。

    • 滑らかなベル型または弧はスムーズなモーションを意味します。
    • 角張った、階段状のグラフ(すべてのキーがイージーイーズでゼロになっている)は、モーションがカクつくことを意味します。
    • スパイクはジャークを意味します。意図的なアクセントでない限り。
  • 1つの連続したジェスチャーの内部キーは停止してはいけません。

    • 連続ベジェキーを使用します。
    • 内部速度は隣接するスロープの調和平均、2ab/(a+b)(両方が同じ符号の場合、そうでない場合は0)に設定し、影響は約33.3とします。
    • 連続したジェスチャーにグローバルイージーイーズを適用しないでください:階段状になります。
  • イージング用語(前のキーのアウト影響 / このキーのイン影響):

    名前影響
    ease33/33
    smooth70/70
    inout82/82
    out12/88
    expo6/94
    snap3/97
    in88/12
    soft45/75

    カスタムイージングは {'o':[speed,inf],'i':[speed,inf]} です。ソフトプルバックの例:{'o':[0,55],'i':[0,92]}。

  • 空間接線はデフォルトでゼロになり、パスのオーバーシュートを回避します。意図的にのみ弧を使用します。

  • 厳しいexpo開始で短すぎる動きはジャークとして認識されます。長くし(0.5→0.8秒)、イージングをソフトにします。キーを追加しないでください。

  • サブムーブを1つのジェスチャーに重ねます。 折りたたみ、次に反転、次にプッシュを別々に行うと、ストップアンドゴーのモーションになります。前の動きが終わる前に次の動きを開始します。

B3. データからのカーブフィッティング

再現モード、または高密度データを変換する場合:

  1. valueAtTime または測定から、ターゲットのモーションを高密度に(50〜200 Hz)サンプリングします。

  2. 開始と終了、正確なホールド(速度ゼロ)、および重要な極値(その軸上の傾きゼロ)にノットを固定します。

  3. サンプルに対する最小二乗法で速度と影響を解決します:速度は符号制約、影響は0.04〜0.94に制限。

  4. エラーが許容値を超える場合にのみノットを追加します:

    プロパティ許容値
    位置2–3 px(カメラ 3 px)
    スケール0.4–0.65
    不透明度0.5–2.5
    ブラー~1
    回転0.4
  5. ベクトルプロパティの場合、ベジェを分割(de Casteljau)して軸間でノット時間を統合します。すべての内部キーで、入ってくる速度と出ていく速度が等しいことを主張します。

  6. 以下の場合はそのまま保持し、理由を文書化します:エクスプレッション、タイムリマップ、タイピングリズム、意図的なホールドスイッチ、1フレームの表示/非表示フリップ。

B4. シーンごとに1つの3Dカメラ

  • すべてのシーンには1つの CAMERA • scene(1ノード、NO_AUTO_ORIENT、X/Y/Z分離)があります。カメラがフレーミング、パン、ドリー、ズームを担います。

  • カメラムーブを偽装するために、すべての要素の位置/スケールをアニメーション化しないでください。

  • 記録されたUIモーション(メインレイヤーの位置 P、スケール s、コンポジションセンター C、ズーム Z0)からカメラを導出するには:

    • カメラXY = C + (C − P)/s
    • カメラZ = −Z0/s

    その後、単独で動くすべてのものをローカルな用語で表現し直します。

  • カメラがストーリーを語ります:到着→アクション→加速→読み取り可能な落ち着き、そしてマクロディテール→プルバックの開示。

  • ローカルアニメーションはローカルに留めます:カーソルパス、クリックプレス、スクロール、カードフリップ。クリックパルスはコンポーネント内部でペアレント化されるため、パースペクティブ下でもそれに追従します。

  • 見出しは3Dワールドの上の安定した2D平面に配置し、カメラプッシュがそれらをクリップしないようにします。投影テキスト境界チェックで確認します。

B5. モーションブラー、シャープネス、深度

  • コンポジションのモーションブラーはオン(シャッター135〜180°、12〜16サンプル)。
    • 非常に高速なプルバックやUIのスミアの場合は、シャッターを45〜90°に下げます。
    • テキストが二重になるレイヤーではモーションブラーをオフにします。
  • UIの大きなズームはシャープに保ちます:編集可能なベクターUIを保持する2〜4倍スーパーサンプリングされたレンダープレーンプレコンポを使用し、カメラシーンでは折りたたみを解除します。
  • Advanced 3Dレンダラー:平行な平面間は**≥4ユニット**に保ちます。そうしないとZファイトが発生し、継ぎ目が表示されます。
  • ヌルの不透明度は子に影響しません。すべての子孫に不透明度を伝播します。
  • ブラーがかったグローはRepeat Edge Pixels OFFにする必要があります。そうしないと長方形の境界が表示されます。フルフレームのラジアルランプが最適なライトフィールドを作成します。

B6. トランジション:エフェクトではなく連続性

  • トランジションは動機付けされるべきです:

    • マッチカット: Aの最後のフレームがBの最初のフレームと等しい。レンダリングでポーズを測定します。
    • モーフ: 1つのシェイプがサイズ、丸み、色、位置をアニメーション化して次の要素に変わります。
    • オブジェクトハンドオフ: 要素が抽出され、次のシーンの主役になります。
    • カメラダイブを暗い要素に、次のシーンが黒から現れるようにします。
    • トラックマットを介した製品背後での明るいまたは暗いディスクの開示。
  • 禁止:

    • フルフレームの白またはグレーのフラッシュ;
    • 暗いシーンと明るいシーンの間のクロスフェード(中間グレーのフレームを生成);
    • すべてのカットで同じワイプ;
    • グレーの背景「スイープ」ストライプ。

    フラッシュは物理的に属する場所に配置します:ディスプレイ上で、オブジェクトの背後に色付きのブルームを伴って。

  • フィルム全体で、フルフレームの遮蔽ワイプは最大2〜3回までにします。

B7. ネイティブのみ、常に編集可能

  • アセットのダウンロード: ロゴ、アイコン、フォント、3Dモデル、テクスチャ、画像、ビデオリファレンス、音楽、効果音を含め、タスクに必要なアセットをユーザーに事前に確認せずにダウンロードします。公式または信頼できるソースを優先し、必要なライセンス表示を保持し、AEでアセットを使用する際に以下のネイティブプロジェクトルールを適用します。
  • ネイティブとは、テキスト、シェイプ、マスク、エフェクト、プリコンポーズ、カメラ、ライト、およびネイティブ3Dモデルレイヤー(GLB/OBJ)を意味します。オーディオはインポート可能です。
    • スクリーンショット、リファレンスの切り抜き、プリレンダー、ウェブカムループ、またはネイティブレイヤーのラスター代替をインポートしないでください。
    • 「ネイティブ」と主張する前に、すべてのフッテージアイテムを監査します。
  • 編集可能とは、ライブテキスト、コントロール用のスライダー、明確なレイヤー名、および使用されている場所に変更を伝播する再利用可能なコンポーネントプリコンポーズを意味します。
  • sourceRectAtTime からのアンカーポイント式を使用して、編集後もテキストを中央に保ちます。

B8. タイポグラフィ

  • 実際のブランドフォントを使用したライブテキストのみ。getFontsByPostScriptName で確認し、必要に応じて一意のファミリー名で静的インスタンスをインストールします。
  • 見出しは短く、太字、文頭大文字、ピリオドで終わります。トラッキング −20〜−40。
  • 文字または単語ごとのリビール:不透明度0、ブラー20〜24、y +14〜26、0.45〜0.55秒のイーズアウト。終了は開始をミラーリング:0.25〜0.35秒、上方向にブラー。
  • 実際のTTF(PILで4倍スーパーサンプリング)に対して幅を測定し、下線、ピル、その他の装飾がラスターフォールバックを必要としないようにします。

B9. 3Dモデルとマテリアル

  • ADBE Advanced 3D レンダラーのみを使用します。Classic 3Dでは3Dモデルレイヤーが機能しません。
  • GLB/OBJファイルをインポートしてモデルを作成します。PBRマテリアル(ベースカラー、ラフネス、メタリック、法線、アンビエントオクルージョン)は、AEのビューポートと互換性のある方法で内部でサポートされています。
  • 環境ライト(ADBE Environment Light Layer)とポイントライトを使用してシーンを照らします。ポイントライトはモデルの影とハイライトを作成します。
  • 影:3Dモデルレイヤーの影(acceptsShadows/castsShadows)は、コンポジション設定(Composition Settings > Advanced > 3D Renderer > Shadows)で有効にする必要があります。
  • マテリアルプロパティ(ラフネス、メタリックなど)はレイヤーのエフェクトとして公開されます。「頂点エフェクト」を使用すると、モデル全体に影響を与えずに特定のマテリアルチャンネルを変更できます。

パートC – RECREATEプロセス

リファレンス動画を1:1で再現するためのプロセス。

C1. リファレンスの分析と測定

  1. リファレンス動画のフレームレート、解像度、長さを測定します。
  2. キーポーズを抽出します:開始、終了、変曲点。スペースバーでスクラブしながら stills.py でスチルをキャプチャします。
  3. 各キーポーズでレイアウトを測定します:要素の位置(P)、スケール(s)、回転(R)、不透明度(T)。
  4. トランジションのタイミングを測定します:各アニメーションの開始フレームと終了フレーム。
  5. ベジェカーブをフィットさせます(B3を参照)。高密度サンプリング → ノットの抽出 → エラー許容値内でのフィッティング。

C2. ネイティブプロジェクトの構築

  1. kit.py DSLでコンポーネントを記述します:テキスト、シェイプ、マスク、イージング。
  2. kit.jsx を使用してAEで構築します。
  3. リファレンスと比較します:contact.py でレンダリングをキャプチャし、目視で確認します。不一致がある場合はB3のフィッティングを調整します。
  4. カメラの動きを測定し、対応するAEカメラを作成します。

C3. 品質チェック

  • すべてのプロパティが正確に一致していることを確認します。
  • テキストがライブであり、正しいフォントが使用されていることを確認します。
  • リファレンスにないアーティファクト(不要なブラー、Zファイト、ラスターの粗さ)がないことを確認します。
  • レンダリング速度が適切であることを確認します(遅すぎない、速すぎない)。

パートD – CREATEプロセス

オリジナル動画を制作するためのプロセス。

D1. リサーチとコンセプト

  1. ブランドガイドライン(ロゴ、色、フォント、トーン)を収集します。
  2. 製品またはサービスの主要な価値提案を特定します。
  3. ムードボードを作成します(ビジュアルスタイル、カラーパレット、アニメーションの参考)。
  4. ストーリーボードを作成します:シーケンス、キーポーズ、トランジション。
  5. スクリプトを書き、タイミングを割り当てます(各シーン/要素の継続時間)。

D2. デザインと構築

  1. kit.py DSLでシーンを記述します。
  2. kit.jsx を使用してAEで構築します。
  3. パートBのルールを適用します:最小限のキーフレーム、滑らかなカーブ、ネイティブ要素。
  4. カメラワークを設計します:シーンへの導入、動き、落ち着き。B4のカメラルールに従います。
  5. サウンドデザインを追加します(該当する場合):音楽、効果音、アンビエンス。

D3. レビューと反復

  1. レンダリングをエクスポートします(render.py 使用)。
  2. ユーザーとレビューします。
  3. フィードバックに基づいて調整します。
  4. タイムライン上で変更が伝播されるように、コンポーネントプリコンポーズを使用します。

パートE – 仕上げ

E1. 最終レンダリング

  • aerender_job.py を使用して最終レンダリングを行います。
  • レンダリング設定が要求を満たしていることを確認します(解像度、コーデック、フレームレート)。
  • レンダリングが完了したら結果を確認します。

E2. 納品物のパッケージング

  • .aep ソースプロジェクトファイルを含めます。
  • 使用したフォントとアセットを(可能な場合)含めます。
  • contact.py または sheet.py を使用して連絡票を作成します。
  • 必要に応じて、使用手順を含むテキストファイルを提供します。

付録:よくある問題のトラブルシューティング

問題原因と解決策
AEが起動しないmacOSのプライバシー設定が妨げている可能性があります。「システム環境設定 > プライバシーとセキュリティ > アクセシビリティ」でターミナル/IDEが有効になっていることを確認します。
スクリプトがエラーを返すAEのバージョンを確認します(app.version)。特定のmatchNameはバージョン間で変更されている可能性があります。app.effects から有効なmatchNameを確認します。
フォントが利用できないgetFontsByPostScriptName で確認し、open -a Font Book を使用して手動でインストールするか、利用可能な代替フォントを使用します。
レンダリングが遅い--half フラグを使用して解像度を下げるか、--hq(品質を上げる)と組み合わせます。aerender_job.py は別プロセスで実行されるため、通常は高速です。
モデルが表示されないADBE Advanced 3d レンダラーがコンポジションで有効になっていることを確認します。GLB/OBJファイルが正しくインポートされているか確認します。

関連スキル