これまで 数回に渡って VEX の初歩的な利用方法について学んできました。
VOP は VEX の関数をノードとして実装できるものです。
さっそく試してみましょう。
grid ノードを作成しましょう。パラメータはデフォルトのままで良いでしょう。
さらに Subdivide ノードを接続します。
Subdivide ノードは接続したジオメトリのウェースを細かく割りなおして高解像度のモデルに変換してくれます。
Depth パラメータを大きくするほど解像度を高めることができます。ここでは 6 にしておきます。
更に Attribute VOP ノードを接続します。
これは VOP ネットワークを作成するためのノードです。
影がついているノードなのでダブルクリックで中に入ることができます。
中に入ると これまでのノードとは違った形のノードが表示されています。
これまでは ノードを 上から下に接続していましたが VOP では左から右に接続します。
左のノードは Geometry VOP Global Parameter ノードです。
元のジオメトリが持っている情報を取得できます。
右のノードは Geometry VOP Output ノードです。
このノードから VOP 階層での編集結果を上の階層に返すことが出来ます。
ここでは Geometry VOP Global Parameter ノードで受け取れるアトリビュートの一部を紹介しておきます。
P : Position (位置) アトリビュートです。
v : Velocity (速度) アトリビュートです。
Cd : Color Diffuse (カラーディフューズ) アトリビュートです。
N : Normal (法線) アトリビュートです。
ptnum : ポイント番号です。
また、これらのコネクタはよく見ると色が違っています。これは受け取るアトリビュートの型を表しています。
例えば P や v などは XYZ の 3 軸の情報が必要なので 緑 = Vector 3 になっています。
ptnum はポイント番号なので、整数で扱いますから 青 = Integer になっています。
Worley Noise ノードを作成します。これはノイズ模様を生成するためのノードの一つです。
コネクタがいくつかありますが Geometry VOP Global Parameter ノードの P から Worley Noise ノードの Pos に接続します。
さらに dist1 から Geometry VOP Output の Cd に接続すると 平面上にノイズ模様が浮かび上がります。
Worley Noise ノードの Frequency はノイズの細かさ, Offset はノイズの位置を操作するパラメータです。
freq コネクタが Frequency に、 offset コネクタが Offset にそれぞれ対応していて ノードを接続して外から操作することもできます。
VOP では様々なノイズを生成することが出来るノードがあります。一部を紹介しておきます。
Curl Noise
Flow Noise
Turblent Noise
Voronoi Noise
さて、このノイズは白黒のグラデーションで塗られています。
これは ポイントごとに 0 ~ 1 の間でランダムな値を割り当てたことになります。
ですから「白いところは押し出す 黒いところは押し出さない」というような仕組みを組むことが出来そうです。
Displace along Normal ノードを使うと簡単に実装できます。
Worley Noise のdist 1 と Displace along Normal の amount を, Displace along Normal の dispP を Geometry VOP Output の P に接続します。
白い部分が押し出され、黒い部分がそのまま残っているのが確認できます。
ノイズの諧調に応じて 位置アトリビュートを変形させているわけですから、複雑なノイズを作ることが出来れば形状も複雑化できます。
別のノイズを組みあわせてみましょう。
Turbulent Noise ノードを作成して Geometry VOP Global Parameter ノードの P と pos を接続します。
更に Add ノードを作成します。これは足し算を行うノードです。
Worley Noise の dist1 と Turbulent Noise の noise から Add ノードの Input1, Input2 に接続します。
これにより 2 つのノイズの結果を足し算することが出来ます。
Add ノードの sum に足し算の結果が入っているので Displace along Normal の amount に接続すると 形状が複雑になったのが確認できます。
これらのノイズで生成する グレースケールは黒 ( 0 ) ~ 白 ( 1 ) の値が割り当てられています。
したがって(今回は複数のノイズの値を足し算しているので例外はありますが)ポイントの高さはおおむね、 0 ~ 1 の間でばらついています。
この幅を調整するためにはどうしたらいいでしょうか。
定数を掛けて 振れ幅を調整する方法が考えられます。 例えば 0.5 を掛けると 0 ~ 0.5 の間で、3 をかけると 0 ~ 3 の間で分散するようになります。
Addノードと Displace Along Normal の間に Multiply ノードを作成します。Add ノードは Input した数値同士を掛け算をするノードです。
さらに Constant ノードを作成して Multiply ノード の Input2 に接続します。
Constant ノードは 定数を作成するノードです。 デフォルト値は 0 なので ( 0 倍してしまうので ) 凹凸がなくなります。
Constant ノード の 1 Float Default の値を調整すると 波の幅が上下するのが確認できます。
上記の方法でもノイズの調整は可能なのですが VOP 階層で操作しなければいけないのは少々面倒です。
SOP 階層から値を調整するための方法として Promote Parameter があります。
multiply に繋がっている Input2 を中ボタンクリックして Promote Parameter を選択します。
すると Input2 の形状が変わり、 パラメータエディタで パラメータ名や初期値、レンジなどを調整できるようになります。
Name が内部的なパラメータ名, Label が表示用のパラメータ名, Type がデータ型, Default がデフォルト値, Range がレンジです。
画像を参考にパラメータを書き換えてください。
すると SOP 階層の Attribute VOP のパラメータエディタから数値を調整できるようになっています。
今回パラメータの名前を自分で設定する、ということをしましたが、内部的なパラメータ名(=変数名)をつけるときにはいくつか作法があります。
単語の頭文字を大文字にするキャメルケースと言います。
特に、最初の単語の頭文字だけ小文字のままにしておく方法をローワーキャメルケース、すべて大文字にする方法をアッパーキャメルケースと言います。
例)camelCase / CamelCase
単語の間を "_" で繋ぐ方法をスネークケースと言います。
例) sneak_Case
単語の間を "-" で繋ぐ方法をケバブケースと言います。
例) kebab-case
プログラミング言語にはコード規約というものがあり、このお作法をみんなで守って読みやすいコードにしよう、ということになっています。
VEXには特に規約はなさそうなのですが、私はこの記事に倣ってローワーキャメルケースで変数名を付けるようにしています。