これまで見てきたように Houdini では様々なノードを使ってアトリビュートを操作します。
既存のブロックを繋げて何か新しいものを作っているわけですから、例えるならレゴ®のブロックのようなものです。
一方 Houdini ではプログラミングによって、ブロックを自分で作ってしまうこともできます。これが VEXです。
VEX は Houdini のほとんどの場所で使われている強力なプログラミング言語です。
場合によってはノードを使うよりも早く必要な機能を実装できるかもしれません。
さっそく試してみましょう。
Line ノードを作成し Direction を 1, 0 , 0、Length を 10 にして X軸方向に長さ 10 のラインが生成されるようにします。
更に Points を 11 にしましょう。 Points を表示して確認すると グリッドにそってポイントが配置されているのが確認できます。
ジオメトリスプレッドシートでも確認してみましょう。
X 軸方向にラインを作ったので、すべての Points の P.y (Y座標) は 0になっています。
各 Points の高さをランダムにするためにはどうすればいいでしょうか?
ここまでに知っている方法ですと Attribute Randomize を使って このように実装することができます。
Operation を Add Value ( 足し算モード )にして P.x と P.z には 0 ~ 0、つまり 0 を足して P.y には 0 ~ 1 の間でランダムな数を足す、という方法です。
これでも欲しい結果は出るのですが、ぱっと見、何をやっているのか分からないかもしれません。
今回数値を触る必要がない、X や Z の値も登場してしまっているからです。「可読性が低い」状態ともいえるかもしれません。
一方、これを VEX で書くとこうなります。
VEXを使うためには Attribute Wrangle というノードを使います。
このノードにはパラメータエディタ欄にスクリプトを書き込む場所があります。
Points のアトリビュートを操作したい場合は Run Over を Points にしてスクリプトを書き込んでいくわけです。
今回のスクリプトをもう少し詳細に見てみましょう。今回書いたコードはこの1行だけです。
多くのプログラミング言語でそうなのですが、この場合の 「 = 」は "「 = 」の左側に 右側の数値を代入する"、値を流し込むことを意味します。
この場合は Points の Y 座標に「 = 」の右側で作った値を流し込んでいます。
rand(XXX) とは 括弧の中の数字に応じて 0 ~ 1 の間でランダム ( random の略なので rand です) を生成します。
このように、特定の値を渡してあげると特定の値を返してくる命令のことを「関数」と言います。 この場合は rand 関数です。
括弧の中の @ptnum は 頂点番号を意味しています。ジオメトリスプレッドシートの一番左の列の項目です。
したがって このスクリプトを読み解くと 「頂点番号ごとに 0 ~ 1 の範囲でランダムな値を作って 各Points の Y 座標に流し込む」という意味になります。
最後の「;(セミコロン) 」を忘れないでください! VEX では指示の最後はセミコロンで終わらせなければならないというルールがあります。
スクリプトの中身と比較して 予想した結果になっているかどうか、ジオメトリスプレッドシートでも確認してみましょう。
さらに改造していきます。
rand 関数は 0 ~ 1 の間でしか値を返しません。 これを 0 ~ 5 の間で変化するようにしたいとしたらどうすればいいでしょうか。
それぞれの値に 5 倍してあげれば ちょうどそういう結果が出そうです。 rand(@ptnum)*5 のように書けば良さそうです。
しかし直に値を書いてしまうと 後から「やっぱり 0 ~ 3 の間で変化するようにしたくなってしまった」ら面倒です。
また事前に何倍にすればいいのかわからない時や、結果を見ながら値を調整したい時もあるでしょう。
そういう時に、パラメータ化すると結果を見ながら調整できるので便利です。
このように書き換えてください。
chfは Channel Float の略です。小数のパラメータを作る、という宣言です。
整数のパラメータを作りたい場合には chi になりますし、文字列のパラメータを作りたいときには chs になります。
ref : データ型について
Intensity とは「強さ」とか「強度」みたいな意味の単語です。その上でスクリプトを書き込む欄の右にある このボタンを押してください。
するとさっきまで折れ線だったグラフが平坦になります。
スクリプト欄の下の方を見ると、さきほど設定した Intensity という名前のパラメータが出来ていて、値が 0 になっているはずです。
rand 関数で乱数を作ったわけですが、それを 0 倍したことになっています。
元の値が何であっても 0 倍したら 0 になりますので、グラフが平坦になっているのです。
この値を トグルを弄ったり 値を直に入力するなどして グラフの変化を目で確認してください。
あわせてジオメトリスプレッドシートでも結果を確認してみましょう。
デフォルトだとトグルで値を操作する場合、0 ~ 1 の範囲でしか調整できません。
Edit Parameter Interface から 調整可能な範囲を修正することもできます。
Intensity の値を 3 にして改造を続けましょう。
次は 時間経過に応じて グラフが変化するように改造してみたいと思います。
このように書き換えてみてください。書き換えたところは下線部の部分だけです。
@Frame は 現在のフレーム番号を意味します。
フレームが進むたびに、rand 関数で使う値が 1 ずつずれていくので、滑らかに変化するグラフを作ることができます。
Polywire ノードでラインをポリゴン化したり Copy to Points で ポイントの場所に Cube を配置したりしてみましょう。
VEX を改造して Copy to Points で引き継ぐアトリビュートを追加しても面白いかもしれません。
ジオメトリスプレッドシートと見比べながら 実験してみましょう。
プログラミングでは、(処理はされたくない)メモを残したり、コードの一部を一時的に処理しないようにしたいことがあります。
そんな時にコメントアウトという機能が便利です。
プログラミング言語によってコメントアウトの仕方は違うのですが VEX の場合は行頭に「 // 」と書き足すことでその行の処理を無視します。
コードの修正中に古いコードを一時的に隔離するのにも使えますので覚えておきましょう。