After Effectsで世界クラスのモーショングラフィックス:プロセス
以下の共通基盤を踏まえ、該当するモードに従い、最後にQAと納品で締めくくります:
- パートA – After Effectsに接続する。 自身のAEインスタンスを確実に制御できるようにします。
- パートB – 常に適用されるルール。 制作に入る前に、共有のアニメーションおよび編集可能性ルールを読みます。
- パートC – RECREATEプロセス。 分析、計測、比較を通じてリファレンスに合わせます。
- パートD – CREATEプロセス。 リサーチ、コンセプト、ストーリー、制作を通じてオリジナル作品を開発します。
- パートE – 仕上げ。 最終レンダリングを確認し、要求された納品物をパッケージングします。
作業モード
| モード | 目標 | 開始方法 |
|---|---|---|
| RECREATE | リファレンス動画と1:1でタイミング、レイアウト、動き、見た目を合わせ、ネイティブで再構築。 | リファレンスを分析・計測。それがストーリーを定義します。 |
| CREATE | ブランドや製品向けにオリジナルの動画を制作。 | リサーチ、コンセプト、ストーリー、ムードボードの後、制作。 |
パートA – After Effectsに接続する
目標は、他のエージェントに邪魔されず、GUIを触らずに操作できる、プライベートで信頼性が高くスクリプト可能なAfter Effectsインスタンスを確保することです。
A1. 自身のインスタンスを起動する
- 実行中のAEのPIDを記録:
pgrep -f "Contents/MacOS/After Effects"。 - 新しいインスタンスを起動:
小さなSwiftランチャー(open -n "/Applications/Adobe After Effects 2026/Adobe After Effects 2026.app" --args -mNSWorkspace.openApplicationをcreatesNewApplicationInstance=trueおよび引数-m -ApplePersistenceIgnoreState YESで使用)でも同じことができ、PIDを直接返します。- 生のバイナリを
subprocess.Popenで起動しないでください。 そのプロセスはバンドル登録されておらず、AppleEventを受信できません。
- 生のバイナリを
- PIDリストの差分を取り、新しいPIDを以降のコマンド用に保持します。
- AEは起動後に新しいPIDで再生成される場合があります。「Adobe After Effects」メインウィンドウを所有するPIDを取得します(Quartz
CGWindowListCopyWindowInfo)。 - バンドルIDは
com.adobe.AfterEffects.applicationです。
- AEは起動後に新しいPIDで再生成される場合があります。「Adobe After Effects」メインウィンドウを所有するPIDを取得します(Quartz
- スタートアップダイアログをクリアします(クラッシュ修復→続行)。これらのインスタンスのAdobeサインインウィンドウは既知の表示グリッチです:無視し、決して認証情報を入力せず、ユーザーにエスカレーションしないでください。
ensure_ae.pyがこれをすべて自動化します:PIDが死んだときに再起動し、小さなダイアログを確認し、再生成されたPIDを検出し、プロジェクトを再オープンします。
A2. PIDのみで通信する
tell application "Adobe After Effects 2026"は任意のインスタンス(他のエージェントのインスタンスも含む)にヒットします。絶対に使用しないでください。aedo(Swift)はAppleEventmisc/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の戻り値は信頼できないため、常にファイルを読み取ります。
- ES3 JSON polyfill(
- プロジェクト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. ビルドパイプライン:データ → ネイティブプロジェクト
利用可能なビルドヘルパーを使用するか、同等のものを実装します。以下のヘルパー名はその役割を説明しています。
-
Pythonが動画をデータとして記述する。
kit.pyDSLが提供するもの:K()疎キーと名前付きイージング;shape、text、precomp、null、camera、model、L(レイヤー);- matchNameによるエフェクト、マスク、トラックマット、エクスプレッション、マーカー、ノート、ラベル。
シーン仕様を組み合わせて1つのビルド仕様にします。
-
kit.jsxが仕様からネイティブレイヤーを構築する。- レイヤーを下から上に作成するため、最終的な順序になります。
moveToによる大量の並べ替えは避けてください。AEが停止する可能性があります。 - その後、ペアレント化、エフェクト、マスク、トランスフォーム、イージング、マット、環境ライトの配線を適用します。
- レイヤーを下から上に作成するため、最終的な順序になります。
-
build.py spec.json --new --only "A|B" --stills "Comp:t1,t2" --save output.aep--newは現在のプロジェクトを保存せずに閉じます(CloseOptions.DO_NOT_SAVE_CHANGES)。そうしないとnewProject()が「名前を付けて保存」ダイアログを開いてハングします。
-
スチル:
stills.py "Comp" t1,t2 prefix。saveFrameToPngは非同期(ファイルが存在するまでポーリング)であり、16ビット PNGを書き込みます(8ビット表示の前に257で割ります)。
-
対象を絞ったモーションレンダリング:
render.py "Comp" start end out.mp4 [--half] [--hq]、または-s/-eを使用したaerender。 -
フルレンダリング:
aerender_job.py "Comp" out.mp4 [--half] [--hq]。- ジョブのコピーを保存し、別プロセスで
aerender -project job.aep -rqindex 1 -sound ONを実行します。 - アプリ内キューよりも高速であり、クラッシュしても作業中のインスタンスはダウンしません。
- ジョブのコピーを保存し、別プロセスで
-
連絡票:
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とします。 - 連続したジェスチャーにグローバルイージーイーズを適用しないでください:階段状になります。
-
イージング用語(前のキーのアウト影響 / このキーのイン影響):
名前 影響 ease 33/33 smooth 70/70 inout 82/82 out 12/88 expo 6/94 snap 3/97 in 88/12 soft 45/75 カスタムイージングは
{'o':[speed,inf],'i':[speed,inf]}です。ソフトプルバックの例:{'o':[0,55],'i':[0,92]}。 -
空間接線はデフォルトでゼロになり、パスのオーバーシュートを回避します。意図的にのみ弧を使用します。
-
厳しいexpo開始で短すぎる動きはジャークとして認識されます。長くし(0.5→0.8秒)、イージングをソフトにします。キーを追加しないでください。
-
サブムーブを1つのジェスチャーに重ねます。 折りたたみ、次に反転、次にプッシュを別々に行うと、ストップアンドゴーのモーションになります。前の動きが終わる前に次の動きを開始します。
B3. データからのカーブフィッティング
再現モード、または高密度データを変換する場合:
-
valueAtTimeまたは測定から、ターゲットのモーションを高密度に(50〜200 Hz)サンプリングします。 -
開始と終了、正確なホールド(速度ゼロ)、および重要な極値(その軸上の傾きゼロ)にノットを固定します。
-
サンプルに対する最小二乗法で速度と影響を解決します:速度は符号制約、影響は0.04〜0.94に制限。
-
エラーが許容値を超える場合にのみノットを追加します:
プロパティ 許容値 位置 2–3 px(カメラ 3 px) スケール 0.4–0.65 不透明度 0.5–2.5 ブラー ~1 回転 0.4 -
ベクトルプロパティの場合、ベジェを分割(de Casteljau)して軸間でノット時間を統合します。すべての内部キーで、入ってくる速度と出ていく速度が等しいことを主張します。
-
以下の場合はそのまま保持し、理由を文書化します:エクスプレッション、タイムリマップ、タイピングリズム、意図的なホールドスイッチ、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. リファレンスの分析と測定
- リファレンス動画のフレームレート、解像度、長さを測定します。
- キーポーズを抽出します:開始、終了、変曲点。スペースバーでスクラブしながら
stills.pyでスチルをキャプチャします。 - 各キーポーズでレイアウトを測定します:要素の位置(
P)、スケール(s)、回転(R)、不透明度(T)。 - トランジションのタイミングを測定します:各アニメーションの開始フレームと終了フレーム。
- ベジェカーブをフィットさせます(B3を参照)。高密度サンプリング → ノットの抽出 → エラー許容値内でのフィッティング。
C2. ネイティブプロジェクトの構築
kit.pyDSLでコンポーネントを記述します:テキスト、シェイプ、マスク、イージング。kit.jsxを使用してAEで構築します。- リファレンスと比較します:
contact.pyでレンダリングをキャプチャし、目視で確認します。不一致がある場合はB3のフィッティングを調整します。 - カメラの動きを測定し、対応するAEカメラを作成します。
C3. 品質チェック
- すべてのプロパティが正確に一致していることを確認します。
- テキストがライブであり、正しいフォントが使用されていることを確認します。
- リファレンスにないアーティファクト(不要なブラー、Zファイト、ラスターの粗さ)がないことを確認します。
- レンダリング速度が適切であることを確認します(遅すぎない、速すぎない)。
パートD – CREATEプロセス
オリジナル動画を制作するためのプロセス。
D1. リサーチとコンセプト
- ブランドガイドライン(ロゴ、色、フォント、トーン)を収集します。
- 製品またはサービスの主要な価値提案を特定します。
- ムードボードを作成します(ビジュアルスタイル、カラーパレット、アニメーションの参考)。
- ストーリーボードを作成します:シーケンス、キーポーズ、トランジション。
- スクリプトを書き、タイミングを割り当てます(各シーン/要素の継続時間)。
D2. デザインと構築
kit.pyDSLでシーンを記述します。kit.jsxを使用してAEで構築します。- パートBのルールを適用します:最小限のキーフレーム、滑らかなカーブ、ネイティブ要素。
- カメラワークを設計します:シーンへの導入、動き、落ち着き。B4のカメラルールに従います。
- サウンドデザインを追加します(該当する場合):音楽、効果音、アンビエンス。
D3. レビューと反復
- レンダリングをエクスポートします(
render.py使用)。 - ユーザーとレビューします。
- フィードバックに基づいて調整します。
- タイムライン上で変更が伝播されるように、コンポーネントプリコンポーズを使用します。
パート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ファイルが正しくインポートされているか確認します。 |