Expメモ:loopのきかないプロパティをvalueAtTime()で

アマチュア・学生向けの教材を作る最中、loop関数の適用できないプロパティをループしたい場合、どのようにすれば良いか、ふとマジメに考えてみました。エクスプレッションで効率化を図れると言いながら、トーンカーブやメッシュワープで簡単に頓挫するのもブザマなので‥‥。

loop関数に頼らなくとも、現在時間をリピート区間で「%(割り算の余り)」すれば簡単にできそうだ‥‥ということで作ってみました。まあ、古典的な方法スね。

valueAtTime(time%key(numKeys).time);

これならば、メッシュワープのディストーションメッシュにも適用できます。実際、これでとりあえず、うまくできました。

loopOut("cycle"); ‥‥とほぼ似た動作になりますが、1つだけ問題があります。

上記エクスプレッションだと、レイヤー開始時間のオフセットがきかない‥‥のです。

まあ、考えてみれば、timeを何の加工なしに使うやり方なんて、コンポジション先頭からループの開始時点が始まってなければ、簡単に破綻する書き方です。使い勝手がよくありません。

レイヤーのstartTimeを使って、レイヤーをタイムライン上で右左に位置をずらしても通用する書き方だと‥‥

valueAtTime((time-startTime)%(key(numKeys).time-key(1).time)+startTime);

‥‥となります。できれば「loopOut("cycle"); 」くらいに、暗記できる短い命令文にしたかったのですが、私の知恵では無理です。1行で収めるのがやっとです。

これですと、まさにloopOut("cycle")と同じ使い方が可能です。ただ、モーションブラーではtimeが先頭に戻る瞬間に変な絵が出ちゃうかも知れません。とりあえず、私の試した範囲では大丈夫でしたが‥‥。
*注)0,10,20,30,40,50→0‥‥みたいなサイクルですと、50から0に戻る際に、モーレツなモーションブラーがかかる場合があります。これはキーフレームのコピペでも同じことではありますが。

ちなみに、key(numKeys)、つまりラストのキーフレームの値は、開始点のキーフレームと同じ値でないと、うまくいきません‥‥のは、loopOut()も同じすネ。また、キーフレームの繰り返しを実現するエクスプレッションなので当然ではありますが、適用したいプロパティにキーフレームが最低2個以上存在しないとエラーになります。

そんなこんなで、CC2015のエクスプレッション言語メニューを久々に眺めて回りましたが、‥‥あれれ、昔より要素が増えて、使いやすくなってます‥‥かね? 単に昔の私が幼稚だっただけかな‥‥。まあ、プログラムって、構造を理解するまでは迷宮みたいなものですもんネ。

注記:漠然とkeyやstartTimeなどと書いた場合、暗黙のうちに「me」「this」が対象となります。thisLayer, thisCompなんて書かなくても良いわけです。使い回しが効いて、短い文のエクスプレッションを書くには、暗黙の対象をイメージするのが良いスね。

関連する記事

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< December 2017 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM