よく使うVEX集-基本編

#はじめに
まずはじめに、どんなプログラム言語でも「int」「float」「vector」「if」「for」の書き方を覚えて、最後に「;」を忘れなければ80％は書けます。
なので難しく考えないで気楽に行きましょう。

今回、要望があったので自分が良く使うVEXを書こうとと思います。
サンプル的に使ってほしいですが、ぜひとも丸パクリだけはやめて、処理内容も書くので覚えて応用できるようにしてください。
コピペプログラマは悲惨だぞ。
#VEXとは
vex、それは希望の光。

まぁ冗談はさておき、vexはHoudiniで使うプログラム言語の事です。
https://www.sidefx.com/ja/docs/houdini/vex/functions/index.html
公式はこのように仰っております。
このVEXを書くにはwrangleを使います。
#Wrangleとは
VEXを書いて実行できるノードです。
Houdini18.0.348(2020/02/08)では、

Attribute Wrangle
Deformation Wrangle
Volume Wrangle

がありAttribute WrangleのRun Overを変更する事でpoint、primitiv、vertex、detail、numbersのアトリビュートを変更することができます。
![Desktop Screenshot 2020.02.08 - 14.44.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545265/6c2e35e0-429b-41cf-a6b1-7d17a0dcd41c.png)
今回、Deformation Wrangle、Volume Wrangleは使わないで、このAttribute Wrangleを使います。記事内でwrangleと言ったら基本このAttribute Wrangleです。
#変数の型について
変数とは、プログラム内では箱のような働きをします。
決められた型の数値を持っていて、アクセスすればその内容が分かります。
この型を決めないと処理が出来ません。
よく使うのは最初に上げた

int
float
vector

の３つですね。
ではこの３つの変数について詳しく書きます。
##int
intは、整数を取り扱うデータ型で、整数、つまり「0,1,2,3,4,5,6,7,8,9」のような整数しか入れる事が出来ません。
限度があり、-2,147,483,648~2,147,483,647の間しか使えません。まぁHoudiniではあんまりそんな桁数使いませんので気にしなくて大丈夫です。
Houdini内では主にポイント番号、処理回数等の番号を格納します。

書き方は

int num=1;

意味は
整数型　名前はnum その値は1
です。

VEXでint型のアトリビュートを作ろうと思ったら

i@num=1;

と書きます。
こう書くことでデータをwrangle内から持ち出すことができます。
##float
floatはintと違い、小数点以下の数値、ちょっと難しい言い方をすると浮動小数点数を入れる事が出来ます。
要は0.12や114.514等ですね。
Houdini内では主にtrans、rotate、scale等、もうあらゆるところで使います。多分一番使います。
書き方は

float num=0.1;

意味は
浮動小数点数型　名前はnum　その値は0.1
です。

VEXでfloat型のアトリビュートを作ろうと思ったら

f@num=0.1;

と書きます。
##vector
vevtorは3つのfloat情報を持っています。
これは情報が３つある物、つまり色(r,g,b)、３次元の位置(x,y,z)等です。
色と位置、つまり3DCGの基本中の基本はvector型で出来ています。
Houdini内では先に上げた色、位置の他にN、つまり法線でよく使います。
書き方は

vector pos=set(0,1,0);

意味は
ベクトル　名前はpos　その値はx=0、y=1、Z=0
です。

VEXでvector型のアトリビュートを作ろうと思ったら

v@pos=set(0,1,0);

と書きます。
#制御文
制御文とは最初に上げた中の「if」「for」の事です。
詳しく書きます。
##if
ifは「もしも～」という意味です。
例えば

if(@P.y>0){
i@up=1;
}

なら、「もしyの位置が0よりも上なら、整数型のupの中に1を入れる」
という感じです。
まぁその中に書かれている条件を満たせばその下が実行できるという感じですね。

しかし、条件を満たしたものだけ実行して、それ以外の物にも別の処理をしたい事がありますよね？
例えばさっきの例だと、yが１以上だとupに１が入りますが、それ以外、つまりyが０以下の方にunderを作って１を入れたい場合等です。
まぁもう一回if分を書いてもいいですが、ここで便利なのが　else　です。
elseは、ifの内容に合っていない物です。
書き方は

if(@P.y>0){
i@up=1;
}else{
i@under=1;
}

意味は
「もしyの位置が０以上ならupに１を入れる、それ以外ならunderに１を入れる」

という意味です。
もうこいつは本当に使います。使わない事が無い。

しかし、そのelseだけでは終わらない事もあります。「yが０以下の中で、xが０以下のポイントが欲しい！！」と言った時です。
その場合、else if　を使います。(まぁ||とか&&とかもあるけど)
else ifは「上の条件に合わない中で、この条件を満たすななら～」といった感じですね。
書き方は

if(@P.y>0){
i@up=1;
}else if(@P.x<0){
i@select=1;
}else{
i@under=1;
}

って感じです。
これは本当に使うので色々見て勉強してください。

#for
forは、繰り返しです。
ですが、自分はあんまりVEXでforを使わないので省きます。
調べれば永遠に出てくるのでそちらで。

#Houdiniに最初からある変数
Houdiniは最初から使えたり、元々持っている変数があります。
代表例では@P,@N,@v,@w,@pscale,@ptnum,@primnum,@numpt,@numprim等です。
今回はよく使うのを紹介します。
#@P
@Pは、ポイントの位置情報です。
型はvector
まぁ３次元空間にあるポイントの位置だからx,y,zの３つですね。
これは@P.xでxの位置情報(float)を、@P.yでyの位置情報(float)を、@P.zでzの位置情報(float)を持ってこれます。
#@N
@Nは法線方向です。
法線がどの方向を向いているのか示します。
基本的に全ての値が-1~1の範囲内です。
ちなみにcopy to pointを使用する時にcopy元のポイントに@Nを持たせると向く向きが変わります。
@Nも@Pと同様に@N.xや@N.y等でそれぞれの情報を持ってこれます。
#@v
@vはvelocity、つまり速度です。
SOPだけだとほっとんど使わないのですが、DOPに行くとこれでもかと使います。
これは-1~1の範囲ではなく、無制限です。
#@w
@wは@vと同じようにDOPで使うのですが、@vが速度で@wは回転です。
まぁ、基本的には@vと変わりません。
#@pscale
@pscaleは、ポイントの持つ大きさです。
基本的にHoudiniのポイントは縦横に大きさを持たないのですが、copy to point等をするときに@pscaleを持っているとその値だけ拡大縮小してくれます。
結構使う。
#@ptnum
@ptnumは、ポイントの番号です。
これはHoudiniでポイントを使うとかならずあり、sortノードで変更することができます。
VEXでクソ使う。
#@primnum
@primnumは、プリミティブの番号です。
プリミティブって何？って人はもうちょっと勉強してから来ましょう。要は面です。
こっちはあんまり使わないかな。lineを使ったアニメーションだと使う。
#@numpt
@numptは、ポイントの総数です。
@ptnumがポイント番号、@numptがポイント総数。逆にすりゃええねん。
#@numprim
@numprimは、察しが付くかと思いますがプリミティブの総数です。
#ここまでが基本です。
さぁ、ここまで書いたことを覚えましょう。
今頑張って応用というかよく使うコードを書いているので待ってて。