自由にループ
Sample:nearestKey( ) / marker.key( )
- 動きをループさせるメソッドにloopOut() loopInDuration()などがありますが、回数の指定やループ開始位置の指定はできません。
- ここでは何秒目に何回繰り返し、また何秒か後に何回繰り返す、という動きのエクスプレッションを考えてみました。
準備
- まず基本の動きを0フレームから作ります。(図の実線部)
- ループさせたいtimeにレイヤーマーカーを加えて、コメント欄に図のように繰り返す回数を入力します。
- これで準備は完了。
- レイヤーマーカーで開始時間と回数を指定するので、エクスプレッションに手を加えずに位置やループ回数を好きなだけいじることが出来ます。
- 下のエクスプレッションを実行した結果が図の破線です。(図は判りやすいようにグラフ表示を合成しています)
- マーカーの位置から指定回数動いているでしょ。
loopTime = 0;
numLoop = 0; //Loop回数
keyN = 0; //マーカーのインデックス
shiftTime=0; //loopのスタートタイム
cycleTime =key(numKeys).time; //最後のキーのタイム=繰り返しの尺
if (marker.numKeys){
keyN = marker.nearestKey(time).index;
if (marker.key(keyN).time > time) keyN--;
}
if (keyN > 0) {
numLoop = parseInt(marker.key(keyN).comment);
shiftTime = time - marker.key(keyN).time;
if (shiftTime < numLoop * cycleTime ) {
loopTime = shiftTime % cycleTime ;
}
}
valueAtTime(loopTime );
-
解説
- 「あれ?loopOut( )がないぞ」と思われたでしょう。そうなんです。リピートがずっと続く場合は便利なメソッドなんですけど、細かい指定をしようとするとかえって面倒なんです。
- 初めの5行は変数の宣言+初期化です。
- 続くIf文はマーカーのキーインデックスを設定しています。詳しくはこちら。キー・フレームの判断
- 2つ目のIf文ではマーカーのコメント欄からループ回数を取得。文字から数値に変換して変数numLoopに代入しています。
- 次にループのスタート位置をShiftしています。変数shiftTimeに はマーカーの位置が0スタートになったtimeが入ります。つまりレイヤーを左にズルズルと動かしてマーカーの位置を0秒に移動したのと同じことです。
- 3つ目のIf文はループ秒数の間だけ基本の動きを繰返すように秒数をチェックしています。
- 変数loopTime はshiftTime を1サイクルの秒数で割った余りが入るので、最後のvalueAtTimeで基本の動きを繰り返すことになります。
- マーカーの利用に関してはこちらも参照してください。トリガー