After Effectsで重力による落下運動を表現する方法をまとめました。
2Dレイヤーの位置に、経過時間の二乗に比例する落下距離を加える例です。
2026年10月16日に、記事のスクリプトと練習ZIPのgravity-apply.jsxを、After Effects 26.5.0で動く版に差し替えました。
それより前に配布していた版は、条件どおりの2Dレイヤーの位置を選んでも「対象なし」と表示し、式を設定できませんでした。
2秒の位置を数値で確認する練習
所有の練習プロジェクトを別名保存し、640×1080・30fps・3秒のコンポジションへ小さな2D平面を置きます。
位置は[100,100]、レイヤーの開始は0秒にし、親なし・次元分離なし・位置のキーフレームなしで試します。
位置のストップウォッチをAlt/Optionを押しながらクリックし、下の重力式を貼り付けます。
この例の加速度は400px/秒²で、画面の下向きを正として位置へ0.5×加速度×経過秒²を加えます。
0・1・2秒で、計算上の位置は[100,100]・[100,300]・[100,900]になります。
レイヤーの開始時刻をずらした場合は、その開始を経過0秒として確認します。
違う結果なら、貼付先が2D位置か、次元分離・キー・親がないか、開始時刻と加速度を確認します。
物理の9.81m/秒²を画面で使うには、1mを何pxとするかの換算が別に必要です。
終了後は式をOFFにして[100,100]へ戻るか確認し、元プロジェクトを開きます。
練習ZIPのverification-log.csvに使用版と0・1・2秒の数値を記録できます。
このZIPには、ほかの記事で使う式のファイルも入っていて、2026年10月16日に差し替えたのはgravity-apply.jsxだけです。
README.txtの冒頭は2026年10月3日のままで「AE実機は未検証です」と書かれていますが、末尾にgravity-apply.jsxを差し替えて確かめたことを追記しています。
ZIPのtest-fixed.cjs(Node.jsで動かす模擬テスト)も差し替えた版に合わせて直し、2Dなのに位置が3つの値で返る場合を確かめる項目を1つ加えました。
2026年10月16日にNode.js 24で実行すると、42項目すべてが通り、以前の版のgravity-apply.jsxでは加えた1項目だけが失敗しました。
2026年10月3日にAdobeの式と配列の仕様を照合し、ローカルで計算と選択条件を検証しました。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| 0・1・2秒 | Y=100・300・900 | 開始時刻と式を確認 |
| 適用できない | 2D位置全体に貼付 | 3D・次元分離を確認 |
| 元へ戻す | Y=100の元位置 | 式OFFか元コピーを開く |
After Effectsで式を確かめた結果(2026年10月15日)
Windows 11 Pro(10.0.26200)のAdobe After Effects 26.5.0(Build 89)で、上と同じ640×1080・30fps・3秒のコンポジションに40×40pxの2D平面を置いて確かめました。
下の重力式を位置に設定すると、0・1・2秒の位置は[100,100]・[100,300]・[100,900]で、式のエラーはありませんでした。
その時点の画像を書き出しても、平面の中心は同じ位置にありました。
レイヤーの開始を0.5秒にずらすと、0.5・1.5・2.5秒の位置が[100,100]・[100,300]・[100,900]になり、開始より前は動きませんでした。

2秒の時点で、画面から式をOFFにすると、位置は[100,100]に戻りました。
コンポジションの準備と式の設定はAfter Effectsのスクリプト機能で行ったため、Alt/Optionを押しながらストップウォッチをクリックして貼り付ける操作は確認に含めていません。
macOSとほかのバージョンは確かめていません。
重力のエクスプレッション
var t = Math.max(0, time - inPoint);
var g = 400; // pixels per second squared
[value[0], value[1] + 0.5 * g * t * t];
初速0・一定の加速度では、落下距離は「y=(1/2)gt²」です。
まず一定の加速度で数値を確認してから、必要に応じて加速度をレイヤーごとに変えます。
スクリプトにした場合
練習コピーで静止した2Dレイヤーの「位置」プロパティを選び、ZIPのgravity-apply.jsxを「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
下のコードは、2026年10月16日に直した版です。
(function () {
var comp = app.project && app.project.activeItem;
if (!(comp instanceof CompItem)) {
alert("Open a composition and select 2D Position properties.");
return;
}
var props = comp.selectedProperties;
var targets = [];
for (var i = 0; i < props.length; i++) {
var prop = props[i];
var layer = prop.propertyGroup(prop.propertyDepth);
if (prop.canSetExpression && prop.matchName === "ADBE Position" &&
!layer.threeDLayer && !prop.dimensionsSeparated && prop.numKeys === 0 &&
!prop.expression) {
targets.push(prop);
}
}
if (targets.length === 0) {
alert("No eligible static 2D Position. Existing keys/expressions are preserved.");
return;
}
var expr = "var t = Math.max(0, time - inPoint);\n" +
"var g = 400;\n[value[0], value[1] + 0.5 * g * t * t];";
app.beginUndoGroup("Apply 2D gravity expression");
try {
for (var j = 0; j < targets.length; j++) {
targets[j].expression = expr;
}
} finally {
app.endUndoGroup();
}
alert("Applied: " + targets.length + ". Undo with Ctrl+Z / Command+Z.");
})();
以前の版は、2Dかどうかを位置の値の要素数(prop.value.length === 2)で判定していました。
After Effects 26.5.0では、2Dレイヤーでも位置の値が[100,100,0]のように3つの要素で返るため、条件どおりの2D位置を選んでもNo eligible static 2D Position. Existing keys/expressions are preserved.と表示され、式を設定できませんでした。
直した版は、レイヤーが3Dでないこと(threeDLayer)で判定します。
変更したのはこの判定の1か所で、変更前と変更後は次のとおりです。
// 変更前(2Dレイヤーの位置も対象外になっていた)
!prop.dimensionsSeparated && prop.value.length === 2 && prop.numKeys === 0 &&
// 変更後(レイヤーを取り出す1行を足し、3Dでないことで判定する)
var layer = prop.propertyGroup(prop.propertyDepth);
!layer.threeDLayer && !prop.dimensionsSeparated && prop.numKeys === 0 &&以前の版を保存している場合は、上のコードに置き換えるか、練習ZIPをダウンロードし直してください。
対象は2D・位置全体・キーなし・既存式なしに限ります。
3D、次元分離した位置、位置以外、キーや既存式があるプロパティは変更しません。
適用件数を確認し、直後のCtrl+Z/Command+Zか「編集」の取り消しで戻してから元コピーと比べます。
APIの条件とUndoはProperty・CompItem・Applicationの参照に基づきます。
直した版をAfter Effectsで実行した結果(2026年10月16日)
Windows 11 Pro(10.0.26200)のAdobe After Effects 26.5.0(Build 89)で、直した版を「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行しました。
640×1080・30fps・3秒のコンポジションに、40×40pxの2D平面を置きました(位置[100,100]、親なし、キー・式・次元分離なし)。
位置プロパティを1つ選んで実行すると、Applied: 1. Undo with Ctrl+Z / Command+Z.と表示されました。

Applied: 1と表示された実機画面(ウィンドウのタイトルバーのみ切り取り)。0・1・2秒の位置は[100,100]・[100,300]・[100,900]になり、式のエラーはありませんでした。
2秒の時点の位置は、タイムラインでも100.0、900.0と表示されました。
続けてCtrl+Zを1回押すと、式が外れ、2秒の時点の位置は[100,100]に戻りました。
位置の値・キー・選択の状態も、実行する前と同じでした。

対象外になる条件は、3Dレイヤーの位置、次元分離した位置、キーフレームが2つある位置、式が入っている位置の4つを同時に選んで確かめました。
直した版を実行するとNo eligible static 2D Position. Existing keys/expressions are preserved.と表示され、4つとも位置の値・キー・式は実行する前と同じでした。

4つの条件は1回の実行でまとめて確かめたもので、条件ごとに分けて実行してはいません。
コンポジションと平面の準備、プロパティの選択はAfter Effectsのスクリプト機能で行い、画面で操作したのはスクリプトの実行とCtrl+Zです。
対象になる位置とならない位置を混ぜて選んだ場合、対象を複数選んだ場合、親子付けやレイヤーの開始をずらした場合、ほかのバージョンとmacOSは確かめていません。
After Effectsのほかの操作は、まとめからご覧いただけます。

MOTOKI-LLC/cg-method-codeは以前の実装の参照先です。
ランダムな動きを作るエクスプレッションは、ほかにもあります。



よくある質問:After Effectsで重力による落下運動を式で付けるとき
重力による落下運動は、エクスプレッションで表現できますか?
できます。2Dレイヤーの位置に、経過時間の二乗に比例する落下距離を加える例です。初速0・一定の加速度では、落下距離は1/2×g×t²です。まず一定の加速度で数値を確認してから、必要に応じて加速度をレイヤーごとに変えます。
式は、どこに貼りますか?
所有の練習プロジェクトを別名保存し、640×1080・30fps・3秒のコンポジションへ小さな2D平面を置きます。位置は[100,100]、レイヤーの開始は0秒にし、親なし・次元分離なし・位置のキーフレームなしで試します。位置のストップウォッチをAlt/Optionを押しながらクリックして、式を貼ります。
加速度と、期待する位置を教えてください。
この例の加速度は400px/秒²で、画面の下向きを正として位置へ0.5×加速度×経過秒²を加えます。0・1・2秒で、計算上の位置は[100,100]・[100,300]・[100,900]になります。レイヤーの開始時刻をずらした場合は、その開始を経過0秒として確認します。
結果が違うときは、何を確認しますか?
貼付先が2D位置か、次元分離・キー・親がないか、開始時刻と加速度を確認します。適用できない場合は、2D位置全体に貼付できているか、3D・次元分離を確認してください。
実際の重力加速度(9.81m/秒²)を使えますか?
物理の9.81m/秒²を画面で使うには、1mを何pxとするかの換算が別に必要です。この例の400px/秒²は、画面上で確認しやすい値として使っています。
スクリプトでも、適用できますか?
練習コピーで静止した2Dレイヤーの「位置」プロパティを選び、ZIPのgravity-apply.jsxを「ファイル」→「スクリプト」→「スクリプトファイルを実行」から実行します。
対象は、キーも式もない静止した2D位置(次元分離なし)だけで、既存のキーや式は保持されます。
該当がなければメッセージを表示して何もしません。
2026年10月16日に、直した版で、静止した2D位置への適用、3D・次元分離・キーあり・式ありの位置が対象外になること、Ctrl+Zで戻ることを確かめました。
それより前に配布していた版は、After Effects 26.5.0では条件どおりの2D位置にも適用できなかったため、練習ZIPをダウンロードし直してください。
元に戻すには?
終了後は、式をOFFにして[100,100]へ戻るか確認し、元プロジェクトを開きます。練習ZIPのverification-log.csvに、使用版と0・1・2秒の数値を記録できます。
この式は、実機で確認済みですか?
2026年10月15日に、Windows 11 Pro(10.0.26200)のAdobe After Effects 26.5.0(Build 89)で確かめました。
0・1・2秒の位置は[100,100]・[100,300]・[100,900]で、レイヤーの開始を0.5秒にずらしても、開始からの経過時間で同じ位置になりました。
2026年10月16日には、直したスクリプトで、適用・対象外の条件・Ctrl+Zでの取り消しを確かめました。
式を手で貼り付ける操作、ほかのバージョン、macOSは確かめていません。
