今回は、エクスプレッションを利用してバウンドするアニメを作成する手順を紹介します。
コンポジションを作成し、要素を配置します。今回はキャラクターの画像を配置しました。
タイムラインのパネルで、要素の[トランスフォーム]の[位置]の項目でキーフレームを作成し、
上から下に移動するアニメを作成します。
[位置]の項目で右クリックします。ポップアップメニューが表示されますので、[エクスプレッションを編集]の項目をクリックします。
キーフレームが表示されているタイムラインの下部にエクスプレッションの入力ボックスが表示されます。
エクスプレッションのコードを入力します。
入力するコードは以下です。
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time){n--;}
}
if (n == 0){t = 0;}
else{t = time - key(n).time;}
if (n > 0){
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
amp = .05;
freq = 6.0;
decay = 4.0;
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{
value;
}
プロパティに設定されたキーフレームの総数を取得し、キーフレームが無ければバウンス処理はしません。
現在の再生時間 time に最も近いキーフレームを取得し、そのインデックスをnに代入します。
未来のキーであった場合は、1を引き現在時刻より前にある最後のキーをn
に設定します。
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time){n--;}
}
キーが1つもない場合は、経過時間 t
を0に設定します。
キーがある場合は、最後のキーフレーム時刻からの「経過秒数」を計算して、t
に代入します。
if (n == 0){t = 0;}
else{t = time - key(n).time;}
現在時刻より前にキーがある場合にバウンス処理をします。
velocityAtTime
関数はその時刻の速度ベクトルを求めます。
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
により、本来の位置に速度ベクトルと振幅を掛け合わせた値を加算してバウンスの効果を適用した座標を計算します。
if (n > 0){
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
amp = .05;
freq = 6.0;
decay = 4.0;
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{
value;
}
変数の値は以下の意味です。
amp
- 振幅の倍率
freq
- 振動数
decay
- 減衰率
オブジェクトの動画が斜めの場合は、進行方向に対してバウンスします。
最初のキーフレームから2番目のキーフレームの場合は n=0となるので振動しないです。
2番目のキーフレームから3番目のキーフレームへアニメーションする場合は振動するのですが、減衰されるためアニメーション中の影響はほとんどなくなります。
再生して実行結果を確認します。バウンドするアニメが再生できます。