前回に引き続き、今回はAnastasia が無料で公開している For the Love of Sin というビデオチュートリアルの紹介です。
今回のサンプルは以下からダウンロードすることができます。
https://gum.co/Wzyvr
今回はサイン関数を使って下図の様なパターンを作り出します。
アルゴリズム
XとY座標の値をサイン関数で表します。サイン関数が -1 ~ 1の値を返しますが、もし、XとYが同じ値を持つならば、そのグラフは直線になってしまうわけです。
しかし、もしXかYのサイン関数の周波数を変えたりして少しずらしてやると、途端に興味深い模様が出来上がります。そしてその結果にランプで強弱を付けてやると、原点からラインが伸びるアニメーションを作ることが出来ます。
VEXコード解説
Attribute Wrangle SOP を作成し、Run Over を Detail (only once) にします。以下が実際にカーブを作るコードの全てです。変数宣言部分で必要なパラメーター等を準備し、Whileループ内でポイントを作っています。
float max_time = ch(“time”); float time_step = ch(“time_step”); float freq_x = ch(“freq_x”); float freq_y = ch(“freq_y”); float offset = ch(“offset”); float time = 0; |
変数宣言
max_time | Whileループ終了用の値。timeがこの値よりも小さい場合にループ処理に入る。 |
time_step | Whileループ内の各イテレーションで増加される値 |
freq_x | X用のサイン関数の周波数 |
freq_y | Y用のサイン関数の周波数 |
offset | サイン関数の引数をオフセットする値 |
time | 初期値が0で、Whileループ内でtime_step分増加する。 |
time_mult | サイン関数の結果の乗算用の値。0 ~ max_time の値が 1 ~ 0 にマップされる。 |
x | X座標の値 |
y | Y座標の値 |
Whileループ
- Whileループは time が max_time よりも小さい限りずっと続きます。
- 変数宣言で説明したとおり、time_mult をfit() で 1~0にマップします。
- XとY座標にサイン関数の値を代入しますが、この時サイン関数の引数として time を渡し、それに周波数を掛けてて、オフセットを足しています。Xのサイン関数にfreq_yが足されているのは、XとYを均等にオフセットしたくなく、かつ余分にパラメーター作りたくない為、freq_y を足しています。サイン関数の結果に chramp() 関数で time_mult を基にしたランプを作り、サイン関数と掛け合わせます。そして下図のようなランプの設定をすると、原点から発生するようなアニメーションができます。
- addpoint() で取得したXとYの値の場所にポイントを追加します。
- time 変数に time_step だけ加算して次のイテレーションに移ります。
while(time < max_time) { time_mult = fit(time, 0, max_time, 1, 0); x = sin(time*freq_x + offset + freq_y) * chramp(“strength”, time_mult); y = sin(time*freq_y + offset) * chramp(“strength”, time_mult); addpoint(0, set(x, 0, y)); time += time_step; } |
VEXコードが書き終わったら、VEXpressionの右側にあるスライダのアイコンをクリックすると、パラメーターのUIが自動的に作られます。
線を作り、色の設定をする
ポイントを作っただけだと分かりにくいので、Add SOP を繋げて、Polygons タブから By Group を選んでポイント間にラインを引きます。次に別の Attribute Wrangle を作り、その中で色の設定をします。
色を付けるVEXコードは単純で、たったの2行です。 最初の方に作られたポイントは古いポイントで、新しいポイントほどポイント番号が大きくなります。それを利用して fit() 関数で自分のポイント番号を基に、0 ~1 にフィットしています。これでグラデーションができましたが、さらにchramp()によってランプで細かい調整もできるようにしてあります。
@Cd = fit(@ptnum, 0, @numpt-1, 0, 1); @Cd = chramp(“luminosity”, @Cd.r); |
グラデーションを付けるのと付けないのとでは見た目がかなり異なりますね。
設定例
Anastasia のおすすめの設定が、以下の二つの設定です。色々と調整して結果を確認してみましょう。
Freq X : 3.1
Freq Y : 3
Freq X : 12
Freq Y : 6.1