VEXpressionを利用したノードの制御


この記事では一番簡単なVEXの用途である、VEXpressionについて単純な例を出しつつ紹介します。

VEXpressionとは、HoudiniのノードのパラメータのエクスプレッションをVEXを使って記述する方法です。
しかし、HScriptやPythonでのエクスプレッションと異なり、VEXpressionは全てのノードで利用することはできません。

ノード内にVEXpressionパラメータが存在するノードに限り、VEXpressionパラメータ内でVEXpressionを記述することが可能です。
VEXpressionが使えるノードには、例としてGroup Expressionや、Attribute Expression、Attribute Wangleなどが挙げられます。

但し、VEXpressionは通常のVEXと異なり、記述形式が複数あり、どのように記述をする必要があるかはノードによってまちまちです。
ですので、まず最初に、VEXpressionパラメータの名前の部分にカーソルを当てて、説明を確認する必要があります。

例えば、これはAttribute WangleノードにおけるVEXpressionパラメータの説明です。

スニペットを記述しろ、以外には特に記載がありません。
これは通常のVEXと同じような記法で記述が可能ということです。

次にこちら、DOPのPOP Attractノードです。

use local goal とあります。これはgoalというローカル変数を使用して記述しろ、ということになります。
このノードはパーティクルを特定の座標Goalに引き寄せるような力を与えるノードとなりますので、
そのGoalの位置を示すベクトル変数goalをVEX内で利用し、この変数goalにGoalの座標を代入する必要があります。

そしてこちらは、Attribute Expressionノードです。こちら確認すると、非常に長い記載が確認できます。

ここでは、通常のVEXの記述形式ではなく、VEXのベクトル型の変数あるいはアトリビュート名を記述するような形となっております。
任意に各コンポーネントの値をここで作成する場合は、set(x, y, z)の形式で記述することが求められています。
大事なのは、ここで記述できるのはこの形式のみなので、
通常のVEXとは異なり、行末のセミコロンは不要であることと、他の行を混ぜた複数行の記述は不可能ということです。

最後にこちら、Group Expressionノードです。

単一行のみ記述することができ、代入式は記述できず、行末のセミコロンは不要であると記載されています。

また、これらのパラメータの詳細はどれもノードのドキュメントに記載されております。
初めて使うノードのVEXpressionの項目は、一度ドキュメント上で確認をしておくことをお勧めします。

 

次に、実際にVEXpressionを記載していこうと思います。
今回は紹介した中で一番説明の記載量の多かった、Attribute Expressionノードを例に出してみます。
このノードを用いて、CdアトリビュートをVEXpressionで作成していきます。

今回のファイルはこちらです。


ネットワークは簡単です。
Gridノードを作成し、その下にMountainノードを繋げることで、グリッドに山のようなノイズを与えています。

そして、この下に2つのAttribute Expressionノードを接続しました。

ではまず、左のAttribute Expressionノードから順に、パラメータを見ていこうと思います。
左のノードはVEXpressionの項目が、 @P の2文字のみとなっております。この@はアトリビュートのことを指します。
VEXでは、VEXpressionを利用するノードが設定したいAttribute ClassやGroup Typeのパラメータの設定と
同様のクラスに存在するアトリビュートはVEXpression上で、@nameの形式で取得が可能です。

今回はノードのAttribute ClassパラメータがPointとなっているので、Point AttributeのPが@Pの形式で取得できます。
そして今回は、その値がそのままCdアトリビュートの値として入力されています。

実際にGeometry Spreadsheetを確認してみると、Pの値がそのままCdに入っていることがわかります。
Pでは各コンポーネントはx, y, z と各座標の軸となっておりますが、Cdではこれがr, g, b となっております。
この場合、どちらもコンポーネント数が3つずつなっておりますので、x, y, z の値がそのままr, g, b に代入されていることがわかります。

Pというのは各Pointの座標を示すアトリビュートです。
Top Viewで見るとよくわかりますが、Mountainノードがない状態では軸付近以外は綺麗に4色に分かれているのが確認できます。

左上はX,Y,Z共にマイナスなので、0となり黒、右上はXのみプラスなので赤、
左下はZのみプラスなので青、左下はX,Zがプラスなのでピンクになっております。

しかし、Mountainノードを入れることで、Y成分にMountainノードによるノイズが発生し、値に変化が起きるので、
ご覧のように、色にもG成分が付与されるようになることが確認できます。

 

次に、右のAttribute Expressionノードを見てみましょう。今度は少し複雑なVEXpressionが記述されております。

先ほど異なり、標高を考慮した、山に比較的合うような色合いが再現できています。
右のAttribute Expressionノードには下記のような、VEXpressionが記述されております。

set(abs(@P.y), 1, abs(@P.y)*0.3)

先ほど紹介したset()関数が使われております。こちらはベクトルなどを新規に定義する際に使う関数です。
これは今回は色の値となりますので、各コンポーネントの順番は set(Red, Green, Blue) となります。
ここでは、の値は1で固定し、の値には、以下のようなエクスプレッションが記述されています。

abs(@P.y)

HScriptの記事でも似たような関数をご紹介したかと思いますが、ここでは、VEXのabs()関数が使用されています。

abs()はその数字の絶対値を取得する関数です。今回は@P.yという記法を用いてPアトリビュートのyコンポーネント、
つまり各ポイントのY座標を取得しており、それをabs()関数に入力して、負の値を正にしております。

そして最後にの値のみ、abs()関数の結果に0.3を乗算して、色味を調整しております。

これにより、Yの値が0に近い部分はの色味が強く、
0から遠ざかるに従っても強くなるので、茶色に近づくような色合いになるようにしております。

ちなみに今回のVEXpressionは元のジオメトリの高さを考慮に入れていないので、
このようにジオメトリの大きさを大きく変えると、正常に動作してくれない場合があります。

これに対応させるには、ジオメトリの高さの値を持った別のアトリビュートを他のノードで作成したり、
Attribute Wrangleノードを利用し、複数行のVEXを記述する必要があります。

 

以上が簡単なVEXpressionの使用例となります。
次の記事以降では、VEXの構文であったり、基礎的な知識について、少し掘り下げてご紹介していこうと思います。