Houdini / VEX / 基本

VEX

※この記事では、主にSOPでのVEXの使用について扱っています。

概要

公式ドキュメント
VEX
https://www.sidefx.com/ja/docs/houdini/vex/index.html
VEX言語リファレンス
https://www.sidefx.com/ja/docs/houdini/vex/lang.html

 

使用方法


ネットワークエディタでのVEXコーディングには、Attribute Wrangleノードを使用します。

変数 / variable

概要

変数は、ひとつのAtribute Wrangleノード内で一時的に使用する値です。
関数などに使用します。作成した値を外で扱いたい場合は、後述のアトリビュートとして書き出すと良いです。

値には型の種類があります。

記述ルール

//型の定義 変数の名前 = 代入する値
int namae = 1;

型の種類と記述ルール

VEXでの記述 名称 概要
int integer 整数値。個数や繰り返し数、番号など
float float 浮動小数点のスカラー値。スカラー値とは”1つ”の数値(変数)
vector vector 3つのfloat値を持つもの。xyzやrgbなど
string string 文字列。 「’」「”」どちらかで囲む。”hiho”

※他にもarrayやvector2,4など様々な型があります。

コードのサンプル

int integerVar = 1;
float x = 5.5;
float y = 4*2;
vector vecVar = {0.0 , 0.5 , 1.0};
string stringVar "aiueo";

アトリビュート / attribute

概要

VEX上でアトリビュートを扱うことができます。
既にあるアトリビュートの値を取得し編集することができます。
VEX上でアトリビュートを作成し、オブジェクトに受け渡すこともできます。

記述ルール

//型の定義@アトリビュートの名前 = 代入する値;
f@namae = 9.0;

VEXでは「attribute」を「@」と記述します。
@前に型の頭文字(i,f,v,s)を入れて型を指定します。
@の後にアトリビュート名を入れます。

型の種類と記述ルール

@の前に入れる文字
i integer
f float
v vector
s string
コードのサンプル
//float型のdepthアトリビュートに 6.0 を代入
f@depth = 6.0;
//vector型のCdアトリビュートに 0.1, 1.0, 0.5 を代入

v@Cd.r = 0.1;
v@Cd.g = 1.0;
v@Cd.b = 0.5;

//他の書き方
v@Cd = {0.1 , 1.0 , 0.5};

//他の書き方2
v@Cd = set(0.1 , 1.0 , 0.5); /*変数を使う場合は{}での書き方ではエラーが出てしまう為、set関数を使う*/

ループとフロー制御

条件分岐

if

if(条件){条件がtrueのときに実行する処理}

//if文で使う変数を作成。float型の変数名「yPos」としてポイントのy座標の値を代入した変数を作成
float yPos = v@P.y; 

if(yPos >= 1.0){ /*条件:y座標が1.0以上のときに*/
 v@Cd = set(0, 1, 0); /*実行する処理:色(@Cd)を緑色(0,1,0)に設定*/
}

if-else

if(条件){条件がtrueのときに実行する処理}else{条件がfalseのときに実行する処理}

//if文で使う変数を2つ作成
//float型の変数名「xPos」「yPos」としてポイントのx,y座標の値を代入した変数をそれぞれ作成
float xPos = v@P.x;
float yPos = v@P.y;
if(xPos < 5.4 && yPos >= 1.0){ /*条件:x座標が5.4未満かつy座標が1.0以上*/
 v@Cd = set(1, 0, 0); /*trueのときに実行する処理:色(@Cd)を赤色(1,0,0)に設定*/
}
else{
 removepoint(0, @ptnum); /*falseのときに実行する処理:ポイントを削除*/
}

ループ

forループ

for(繰り返し回数の初期値;繰り返し回数の条件;増分){条件がtrueのときに実行する処理}

//for分でループの繰り返し数として使う変数を作成。int型の変数名「num」を作成。
int num = chi("num");

for(int i = 0; i < num; i++){
 @set += 1;
}

for-eachループ

whileループ


while(条件){条件がtrueのときに実行する処理}

int stopper = 0; /*ループのストッパーを作成。int型の変数名「stopper」を作成*/
float sum = 0; /*処理の繰り返し数を作成。float型の変数名「sum」を作成*/

while(stopper == 0){ /*条件:stopperが0*/
//trueのときに実行する処理
 sum += 1; /*sumに1加算代入*/
 if(sum >= 100){ /*sumが100以上か確認。100以上だった場合*/
  stopper = 1; /*stopperに1を代入*/
 }
}
//sumが100以上になったときにループが終了する

演算子

等価比較演算子

==
!=
>
<
>=
<=

短終論理演算子

&&
||

関数 / Functions

大量の関数があるため、少しずつ覚えると良いと思います。(私も)
VEXコードの関数に文字入力カーソルをあわせて「F1」を押すと、その関数のヘルプが開けます。

チャンネル関数 / Channel Functions

調整できるパラメータを作成します。

float value = chf(“value”);
int number = chi(“number”);
v@Cd = chramp(“colorRamp”, value);

コードを書いた後、スライダーアイコンを押しspare parameterを作成します。(①)
「Edit Parameter Interface…」から、値のTypeやRangeなど、扱いやすいように編集できます。(②)

コメント