dA-tools.com

HOME > AfterFx > expression > 実例 > ランダムシート

 ランダム・シート

Sample:random( ) / posterizeTime( )/ Math.floor( )

  • アニメではエフェクトなどでパカパカっと数枚の動画を繰り返しランダムに表示させたいことがあります。そんな時はエクスプレッションの出番です。
  • 例として4枚の動画をランダムに表示するケースを考えます。
  • まず連番動画のレイヤーにタイムリマップを適用します。
  • 動画No.1のタイムリマップ値は[0:00:00:00]で、動画No.4は[0:00:00:03]ですから、0~3をランダムに発生させます。

random(4)

  • このメソッドは0から4未満の浮動小数を返します。
  • これを整数にするために小数点以下を切り捨てます。

Math.floor(random(4)) ;

  • このエクスプレッションを書き込みます。
  • これで良さそうなのですが残念ながら予想外の結果になります。ずっと動画No.4が表示されて、たまに動画No.1が表示されるのです。
  • 値をチェックして見るとほとんど[0:00:00:04]になっています。
  • そこで試しにこのエクスプレッションをテキストレイヤーのソーステキストに書いてみると0から3の値をランダムに表示します。ですから式に問題はなさそうです。

タイムリマップの単位

  • タイムリマップをエクスプレッションで指定する場合は時間の単位を「」で扱う必要があります。
  • エクスプレッションの値が[1]の時、タイムリマップの値は[0:00:01:00]になります。
  • つまり2枚目の動画は[ 1/24 =0.0416666666666...]で、3枚目は[2/24]と指定しなくてはならないのです。(24fps)

remap1.jpg

  • それを考慮するとエクスプレッションはこうなります。

Math.floor(random(4))/24 ;

  • または

Math.floor(random(4)) * thisComp.frameDuration;

  • これで目的の値を得ることが出来ます。
  • なお、タイムコード開始番号が1でも0でもエクスプレッションのスタートタイムは0で変わりありません。

2コマ打ち

  • ランダムメソッドは1コマごとに変化するので、これを秒12コマにするにはposterizeTime()を使います。このメソッドはランダムメソッドの前に書かないと効果がありません。

posterizeTime(12);
Math.floor(random(4))/24 ;

  • 下図がそのグラフです。

remap2.jpg

  • ランダムなので同じ動画番号が続くことがあり、一瞬止まったように見えてしまうことがあります。
  • これを回避したい場合はエクスプレッションをキーフレームに変換して、連続するところだけ、キー値を変更するのが手っ取り早いと思います。LinkIconキーフレームに変換

レンジのシフト

  • 動画の途中番号10~13をランダムに表示するには上のエクスプレッションにちょっと手を加えます。
  • 先ほどのMath.floor(random(4))が0~3をランダムに発生させるので、
  • これに9を足すだけです。

Math.floor(random(4)+9)/24

  • 最大値と最小値を指定できるメソッドrandom(min,max)を使うと

Math.floor(random(9,13))/24

おまけ

  • Math.floor( )を使わないと下図のように多段階のグラフになります。しかしこれでもエラーにはなりません。

remap4.jpg