dA-tools.com

HOME > AfterFx > expression > 実践 > ウィグル

ウィグル : Wiggle

ウィグルは値を不規則に変化、変動させます。

  • ランダムと違い連続性があるので、くねくね、ゆらゆらとした表現ができます。
  • この例ではパーティクルの発生、角度、速度、明度にwiggleを適用しています。

wiggle ( freq, amp, octaves, ampMult, t )

戻り値はNumber / array

waveAdd.gif引数が多いので制御しにくいようですが、2つの波の合成であるということが判ると理解しやすいでしょう。

  1. freq , amp が基本の波のパラメーター(右図・上)
  2. octaves , ampMult が加算する波のパラメーター(右図・中)
  3. timeは位相
  • 始めの2つのパラメータは必須です。
  • 後半のパラメータを省略すると以下の値がデフォルト値として適用されます。
    • octaves=1 : ampMult=0.5 : t=time

パラメーター

freq:周波数

  • wiggleFreq.gif1秒あたりの変化数です。
  • 0以上の値が使用できますがフレームレート以上では[random]とほとんど結果が変わりません。
  • 値が低いほど変化が緩やかです。

amp:振幅

  • wiggleAmp.gif値の変化幅、つまりベースの波高を決めます。
  • freqの値に乗算した結果を返します。

octaves:オクターブ

  • wiggleOct.gifベースの波に加算するノイズの周波数です。
  • 音楽で使うオクターブと同じ意味ですから、1オクターブはfreqの2倍の周波数を意味します。
  • 値が大きくなるほどのこぎりの歯のような波形になります。

ampMult:振幅

  • wiggleAmpMult.gif加算するノイズの振幅を決めます。
  • 加算する波ですから大きな値ではfreqで決めた波のうねりを殺してしまいます。

t:時刻

  • wiggleTime.gif標準ではt=time(現在の時間)で使います。
  • 波の位相をずらす、つまりグラフを左右に移動させたいときに使えます。
  • 例:time+0.5 でグラフを左に0.5秒分移動できます。
  • 移動幅を大きくするとパターンを変える目的に使えます。
    なお、seedRandom(seed)でwiggleの初期値を制御することもできます。

次元

  • ウィグルは適用したパラメーターの次元全てに適用されます。
  • 例:位置プロパティであれば[X,Y]両方に適用されます。それを一方向だけにするには、次のように配列のインデックスを書き加えます。

newY=wiggle(4, 10)[0];
[thisProperty[0],newY]

  • wiggle( )の後に[ ]で括った数字を加えると、1次元のウィグル値を返します。
  • 位置のプロパティは2次元なので0か1を入れます。どちらでもかまいません。

temporalWiggle

temporalWiggle(freq, amp, octaves=1, amp_mult=.5, t=time)

戻り値はNymber / array

  • パラメーターはwiggle( )と同じです。
  • 2つの違いは、サンプリング対象となるプロパティが時間変化(アニメート)しているかどうかです。

wiggle と temporalWiggleの比較

  • 下のムービーは静止している平面にtemporalWiggle(上)とwiggle(下) を適用したものです。
  • 次のエクスプレッションを回転と位置[x]に記述しています。

effect("スライダ制御")("スライダ").temporalWiggle(5,1);
effect("スライダ制御")("スライダ").wiggle(5,5);

  • tempWigl.jpgこの例ではスライダーの値をサンプル対象としています。
  • スライダ値は1.5秒までは「0」で、その後「180」まで増加しています。
  • スライダ値の変化がない1.5秒まで、temporalWiggleはまったく値が変動していませんが、wiggleは終始同じ量の揺れが加わっています。

  • サンプル値の変化量に応じてウィグル量をコントロールできるので、早く走っている車は大きいブレで、スピードを落とすとゆれが小さくなり、止まるとブレが無くなる、というようなことができます。

WiggleをLoop

Wiggleはランダムな値を返してくるのでリピートさせるとオレンジの矢印のように動きが飛んでしまいます。これをグリーンの矢印のようにスムーズにつなげてみましょう。

オレンジの矢印を次のエクスプレッションでゆらゆらと動くようにしてみました。
図はそのグラフです。

freq = 1;
amp = 70;
wiggle1 = wiggle(freq, amp, 1, 0.5, time);

wigLoop01.jpgfig.01

グラフをシフトしてつなぐ

この映像は3秒なので繰り返すときに値がジャンプして動きがつながっていないのが判ります。これを何とか回避してループさせてみましょう。そのためにはループの最後と次のループの最初の値を同じにする必要があります。

wiggle( ) のパラメーターをチェック

wiggleのパラメータを見ていくと第5引数に[time]があります。これを使うとグラフを右に3秒ずらす、つまりtime - 3の値にすることが出来ます。

めどが付いたので書き始めましょう。まず秒数timeが常に0から3秒までのリピートになるように変換します。それにはtimeを3で割った余りを使います。

loopSec= 3;
t = time % loopSec;

次に3秒目でtimeが[-3]になるようにしましょう。

t - loopSec;

ここまでの各値をwiggle( )に渡すと

wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopSec);

図2はそのグラフで、最後の値がwiggle1の0フレームの値になっているのが判ります。

wigLoop02.jpgfig2

大体つながっているように見えますね。でもこれは偶然です。よく見るとリピート部分でグラフがずれています。これではやはり駄目です。

値のリマップ

wigLoop05.jpgfig3図の水色がwiggle1,オレンジがwiggle2のグラフです。
0から3秒で徐々にwiggle1からwiggle2にシフトさせて緑色のグラフにしていきましょう。
それには補間のメソッドlinear( )を使います。LinkIconlinear
timeが0から3まで変化する間に、wiggle1からwiggle2に徐々に値を変換します。

linear(t, 0, loopSec, wiggle1, wiggle2)

図4がその結果です。なかなかいい感じです。

wigLoop03.jpgfig4

でも繰り返しの部分をよく見るとカーブがスムーズにつながっていません。
そこでlinear をease に変更します。

freq = 1;
amp = 70;
loopSec= 3;
t = time % loopSec;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopSec);
ease(t, 0, loopSec, wiggle1, wiggle2)

図5がその結果です。

wigLoop04.jpgfig5

結果としてループしていますが最初のグラフとは違う物になっているので改めて引数を調整する必要があるかもしれません。