Houdini回。Wrangle(SOP)のVEX例文。メモより抜粋その3。
脈絡はないです。
あと、時々コードが文字化けしてます。すいません。
ローカル変数のマッピング
i@test = 0; addvariablename(geoself(), "test", "TEST");
自分で作ったアトリビュートをローカル変数として定義する。
ここで定義したローカル変数は、このaddvariablenameという関数をサポートしたノードで利用可能らしい。
最近の仕様では、あまりローカル変数使わないようになってるんだっけか?
プリミティブ毎に含まれるポイントにID番号をふる
int primpts[] = primpoints(geoself(), @primnum); int i =0; foreach(int ptnum; primpts){ setpointattrib(geoself(), "id", ptnum, i, "set"); i++; }
Run OverはPrimitiveで、idというポイントアトリビュートの存在を前提賭しています。
使い道は、例えば図のような沢山ある六角形の各ポイントに0~5までの番号を付けるとかね。
閾値とランダム値を使ってポイントを消す
if ( rand(@ptnum)<ch('threshold') ) { removepoint(0,@ptnum); }
Run OverはPoint。
数値の丸め込み
0.5間隔で小数点以下1桁まで。scaleの値で丸め込みの桁と数値の間隔が変わる。
float scale = ch("scale"); @P = rint(@P * scale)/scale;
一番近い整数に丸め込む、rint()。vector、float両方で使える。
他にも似た関数で以下のようなものがある。
floor()・・・入力の値以下で一番大きい整数を返す
ceil()・・・ 入力の値以上で一番小さい整数を返す
frunc()・・・ 少数点以下を切り捨てる
frac()・・・ 小数点以下を返す。よく使う。
入力からアトリビュート取得
vector Value1 = @opinput0_P; //1番めの入力からPアトリビュートを取得 vector Value2 = @opinput1_Cd; //2番めの入力からCdアトリビュートを取得
いつから、この記述がいけるようになったか知らないけど、便利!
カメラに映らない範囲のポイントを消す
vector ndc=toNDC(chs("CAM"),@P); float pad = -0.5; if(ndc[0]-pad<0 || ndc[0]+pad>1 || ndc[1]-pad<0 || ndc[1]+pad>1 || ndc[2]>0){ removepoint(geoself(),@ptnum); }
Intrinsic(組み込み)アトリビュートの取得と変更
たとえば、Intrinsicの”Transform”の取得とセットの例。
//取得 matrix3 mat = primintrinsic(@OpInput1, "transform", @primnum); //セット setprimintrinsic(geoself(), "transform", @primnum, mat, "set");
コメント