キーフレームで止まった瞬間に、少し行き過ぎてから戻る動きを付けると、動きに勢いが出ます。
キーフレームを増やさなくても、エクスプレッションで自動的に付けられます。
- 使う場所:位置・拡大・縮小・回転など、キーフレームで動かしているプロパティ
- 揺れの大きさ(amp)・揺れの速さ(freq)・収まる速さ(decay)の3つで調整する
- 最後のキーフレームの直前の速さが大きいほど、大きく弾む
- キーフレームのあいだの動きはそのまま
この記事の式は、Adobe公式の「Expression language reference」にある関数(numKeys・nearestKey・velocityAtTime など、2026年10月3日に公式資料を確認)で組み立てたものです。
値の変化は Node.js で計算して確かめたもので、After Effectsの画面での再現は含みません。
式
弾ませたいプロパティのストップウォッチを Alt(Macは Option)を押しながらクリックし、次の式を書きます。
var amp = 0.06;
var freq = 3.0;
var decay = 5.0;
var n = 0;
if (numKeys > 0) {
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
var result = value;
if (numKeys >= 2 && n == numKeys) {
var t = time - key(n).time;
var v = velocityAtTime(key(n).time - thisComp.frameDuration / 10);
var amount = amp * Math.sin(freq * t * 2 * Math.PI) / Math.exp(decay * t);
result = add(value, mul(v, amount));
}
result;式の中でやっていること
- いまより前で、いちばん近いキーフレームの番号(n)を探す
- そのキーフレームを過ぎてからの時間(t)を求める
- キーフレームに着く直前の速さ(v)を取る
- 最後のキー以降だけ、速さに合わせた揺れ(sin)を時間とともに小さく(exp)して、元の値に足す
キーが0個または1個のときと、最後のキーより前は元の値を返します。最後のキー以降だけに揺れを足すので、途中のキー間は変えません。add と mul はAEのベクトル演算です。数値だけでなく、位置の2値・3値にも同じ式を使えます。
値の変化を確かめる
0.5秒で0から100まで直線で動かしたプロパティに、上の式をかけた場合を計算しました。
最後のキーフレームに着く直前の速さは、1秒あたり200です。
| キーフレームからの時間 | 値 |
|---|---|
| 0秒 | 100.0 |
| 0.05秒 | 107.6 |
| 0.083秒 | 107.9(最初の山付近) |
| 0.167秒 | 100.0 |
| 0.25秒 | 96.6(少し戻りすぎる) |
| 0.333秒 | 100.0 |
| 0.75秒 | 100.3 |
| 1秒 | 100.0 |
100で止まるはずの値が、一度約108まで行き過ぎ、約97まで戻ってから、1秒ほどで収まっています。
3つの数値の調整
| 数値 | 大きくすると | 小さくすると |
|---|---|---|
| amp(揺れの大きさ) | 大きく行き過ぎる | 控えめになる |
| freq(揺れの速さ) | 小刻みに揺れる | ゆったり揺れる |
| decay(収まる速さ) | すぐに止まる | 長く揺れ続ける |
まずは amp だけを変えて、行き過ぎる量を決めるのがおすすめです。
揺れの大きさは、キーフレームに着く直前の速さに比例します。
この式はキーより少し前の速度を取ります。イージーイーズで直前の速度が小さくなると揺れも小さくなるので、練習では最後のキーフレームを直線にします。
新しい版の書き方(previousKey)
今の公式リファレンスには、「その時間かそれより前のキーフレーム」を返す previousKey(time) があります。
次の式はキーからの経過秒を返す独立した説明用の式です。上の弾む式の代わりにはなりません。数値プロパティに単独で使い、previousKey が未定義になる版では使わず、上の nearestKey 版を使います。
// 現在の公式リファレンスの例。結果を数値で返す。
var elapsed = 0;
if (numKeys > 0) {
var k = thisProperty.previousKey(time);
if (k.time <= time) elapsed = time - k.time;
}
elapsed;ただし、最初のキーフレームより前では最初のキーフレームを返すので、k.time > time のときは元の値を返すようにします。
古い版でも動かしたいときは、上の nearestKey を使う書き方にしておくと安全です。
うまくいかないとき
- 弾まない:最後のキーフレームがイージーイーズになっていないか、動きの速さが0でないかを見る
- 揺れすぎる:amp を小さくするか、decay を大きくする
- 位置でエラーになる:位置を「次元に分割」している場合は、X と Y のそれぞれに式を書く
最後の勢いのまま動かし続けたいときは、After EffectsのloopOutの使い方で紹介している continue も使えます。
最後のキーだけを弾ませる練習
練習用の2Dレイヤーを複製し、位置に0秒で [0, 0]、0.5秒で [100, 0] の直線キーを置きます。
式は位置に貼り、キー間と最後のキー以降を分けて見ます。
表の値は一定速度200を入力したローカル計算で、AE画面の実測ではありません。
| 練習入力 | 期待する値 | 確認する範囲 |
|---|---|---|
| キー0個・1個 | 元の値 | 揺れを足さない |
| 0.25秒 | [50, 0] | 途中は元の補間値 |
| 0.5秒 | [100, 0] | 最後のキーの時刻 |
| 0.55秒 | 約 [107.6, 0] | 停止後に行き過ぎる |
位置を次元に分割している場合はX位置・Y位置それぞれに対応するキーが必要です。
イージーイーズなどでキー直前の速度が小さいと揺れも小さくなります。
必ず0になるとは限りません。
揺れを外すときは式を無効にし、残した2キーの動きと比較します。
READMEの貼付先を確認し、1つずつ練習用プロパティに使います。
AE本体での動作確認は含みません。
まとめ
- キーフレームのあとに、行き過ぎて戻る動きを式で足せる
- amp・freq・decay の3つで、大きさ・速さ・収まり方を決める
- 練習は直線キーで行う。キー直前の速度が小さいと揺れも小さくなる
- previousKeyの例は経過秒を返す説明用。弾む式はnearestKey版を使う
参考:Adobe「Expression language reference」(2026年10月3日に公式資料を確認)。
