dA-tools.com

HOME > AfterFx > expression > 実践 > KeyFrame

キー・フレームの判断

キーフレームの有無やインデックス番号を調べる。

  • エクスプレッションでキーフレームの有無やキーインデックスを使う場合には現在のタイムマーカーの位置とキーの関係を調べる必要があります。
  • その要望に答えてくれるメソッドがnearestKey(t)です。

nearestKey(t)

  • このメソッドは引数(t)に最も近いキーオブジェクトを返します。
  • 引数が(time)の場合は現在のタイムマーカーに一番近いキーフレームの番号を取得することができます。
  • 下図(24fps)では0frから12frまでは[ 1 ]を返し、それ以降は[ 2 ]を返します。

nearKey02.jpg

  • つまりキーフレームとキーフレームの中央で値が切り替わります。

その時、キー・フレームはあるのか?

  • nearestKey( )timeとタイムマーカーの timeを比較して、2つが同じ値であればそこにキーフレームがあることがわかります。
  • 下の式は"foo"というレイヤーの「位置」のキーフレームの有無を判断する例です。

nKey = thisComp.layer("foo").position.nearestKey(time);
if (time == nKey.time) {
 //キーフレームがある場合の処理
}

前後のキー・フレームをGet

  • タイムマーカーの前後のキー・フレームを取得するには大小を比較します。
  • 現在のtimeとnearestKey( ) のtimeを比較して、タイムマーカーのtimeの方が大きければ前のキーで、小さければ次のキーです。
  • 下の例では次のキーフレームになるまでは前のキーのインデックスが変数P1に入ります。

nKey = thisComp.layer("foo").position.nearestKey(time);
(time >= nKey.time ) ? P1 = nKey.index : P1=nKey.index-1

最後のキー・フレームをGet

  • この例ではコンポの秒数を引数にして、「位置」プロパティの最後のキーを取得しています。

compDur=thisComp.duration;
position.nearestKey(compDur).index;

  • 注意:コンポの秒数外にキーがある場合はそのキーを返す場合があります。
    • 例:5:00のコンポで 5:02にキーがある。

例:次のキー・フレームの「位置」を指す矢印

  • この例では矢印レイヤーの「回転」プロパティに次の式を記述しています。

nKey = position.nearestKey(time);
(time >= nKey.time) ? P1=nKey.index+1: P1=nKey.index;
target = position.key(P1).value - position;
angle = Math.atan2(target[1],target[0]);
radiansToDegrees(angle);

  • 2行目までで次のキーフレームインデックスを取得
  • 3行目で現在の位置から次のキーフレームの「位置」へのベクトルを取得
  • 4行目でそのベクトルから角度(弧度)を算出
  • 5行目で弧度を度数に変換しています。
    • 3~5行目についてはatan2( )を参照して下さい。LinkIcon逆正接