VEXの変数の使い方


この記事ではHoudini VEXにおける変数についての紹介を簡単な行います。

Houdiniで一般的に使われている「変数」という単語は、
Houdini内部で定義されている、HIPなどのグローバル変数や、OSなどのローカル変数があります。
しかし、今回紹介するVEXの変数とは、これらとは少し別の領域のものとなります。

とはいえ、本質的な考え方は同じです。まずは「変数」とはどういったものなのかという、一般的な考え方についてご紹介します。

まず、コンピュータでは、特定のデータに対して固有の名前を割り当てることができます。
その中で、割り当てた後から値を変えることができないものを「定数」と呼び、変えることができるものを「変数」と呼びます。

つまり変数とは、データの名前のようなものです。
これをもっと抽象的に説明する際に使われるのが「」の概念です。

このように、変数とは、数などのデータ「値」を入れる箱のようなものであると考えるのがわかりやすいでしょう。

Houdiniのグローバル変数HIPは、hipファイル自身のファイルパスの文字列が入った、HIPという名前の箱ですし、
ローカル変数OSは、参照しているノードの名前の文字列が入ったOSという名前の箱だと考えることができます。

同様にシステムの環境変数も、名前と実際の両方を定義して初めて成り立つものであると思います。
このように変数は、何かしらの実体を持つ「値」とそれを利用するための「名前」からなる概念となります。

そこで、次にVEXの変数がどういうものかということですが、
Houdiniの変数がHoudiniの内部で利用できる箱であるように、VEXの変数はVEXの内部で利用できる箱になります。

Houdiniの変数は基本的には既に定義されているものを、HScript等で利用するだけですが、
VEXではどのようなデータを変数として処理する必要があるでしょう。
単純や数値やベクトル、場合によっては文字列なども考えられるでしょうか。

多くのプログラミング言語では、変数には「型」という概念が存在します。
型がある言語の場合、整数型の変数には整数しか入れることができないし、文字列型の変数には文字列しか入れることができません。

変数の型はその箱が入れることのできるデータの種類を定義するものです。

逆に言えば、整数型の変数に、そのまま小数を入れようとしてしまうと、整数として認識されるので、
2.5が2になるように、数字の小数点以下の情報が切り捨てられて保存されてしまいます。

これは、型の存在しない最近のプログラミング言語では発生しない問題なのですが、
VEXはC言語ベースのプログラミング言語である為、変数に型が存在します。
因みに変数の型はPythonにも存在します。また、HScriptは変数に入力できるのが文字列のみとなりますので、型の概念はありません。
VEXで利用できる変数の型の一覧についてはSideFX社ドキュメントをご確認ください。

先ほどの画像に登場した変数をVEXで実際に作成(定義)してみると、以下のようになります。

このように整数型はint, 小数型はfloat, 文字列型はstring と書いてから半角スぺースを開けて名前を記述することで定義できます。

変数名の次に、= 値という形式で記述することで、変数に値を入力することができます。
ここでいう=は数学のイコール、等しいという意味ではなく、「左辺に右辺を代入する」という意味になります。
そのような経緯で、変数に値を入れるときは代入するといいまして、=のことは代入演算子といいます。 

 

本来であれば、次にこの変数の使い方を紹介したいのですが、VEXの場合は変数の使い方は少し特別でして、
Houdini側で事前に定義された変数と、コード内でユーザが定義した変数は少し意味が変わってきます。

例えば、前回の記事で紹介された、DOPのPOP Attractノードにおいては、
事前定義されているベクトル型の変数goalの値が最終的なパーティクルが集まる座標となります。

ただし、このgoalという変数は、Goalパラメータの値に直結している、POP Attractノード側で事前に定義された変数になります。
アトリビュートでも同様となりますが、このようにHoudiniではHoudiniやノードによって事前定義された変数に関しては、
ジオメトリなどに直接影響を与えますが、そうでないものは直接的には影響を与えません。

例えば、先ほどのVEXコードは変数を使ってこのように書くことも可能ですが、こうすることにはあまり意味はありません。

Houdiniの場合、最終的にはHoudini側で定義された変数であったりアトリビュート等に
値を代入することで、初めてジオメトリに反映されます。

ですので、その過程で変数が必要になる場合は使うし、ならない場合は使わない、HoudiniのVEXはそのような機能となります。
当然、今回のような単純なコードの場合は、あまり変数を使う意義はありません。

基本的にはHoudiniのVEXpressionにおける変数は、計算の過程で、一時的に値を保管しておく必要があるときに使う箱となります。

このようなユーザで定義する形の変数は、次の記事で紹介します、制御構文を使っていくと必要になってくる場面が出てきます。

最後に今回の記事で画像に使用したHDAを、参考までに掲載します。Attribute Wangleノードにて、変数valbbが利用されております。