Jeff Wagner氏によるWebinarのメモ。録画されたvimeoはGo Procedural on Vimeoにアップされています。VEXによる三項演算子や便利なヘルプの説明。VEXの初歩としては秀逸な内容でした。
得にfetching input attributes, setattribtypeinfo(),chv(),ch(),pcfind(), pgfind(), pcfind_radius(),smooth()
Useful Help Pages :
http://houdinifx.jp/aup/houdini15.5/vex/cookbook
http://houdinifx.jp/aup/houdini15.5/vex/lang
http://houdinifx.jp/aup/houdini15.5/vex/statement
http://houdinifx.jp/aup/houdini15.5/vex/arrays
http://houdinifx.jp/aup/houdini15.5/vex/snippets
http://houdinifx.jp/aup/houdini15.5/vex/geometry
http://houdinifx.jp/aup/houdini15.5/vex/halfedges
http://houdinifx.jp/aup/houdini15.5/vex/random
http://houdinifx.jp/aup/houdini15.5/vex/strings
⓪ POP Drag : Use Vexpressions : Scale Drag By Normalized Ageを改定
airresist *= @P.y;
windvelocity *= {0, 1. 0};
① 三項演算子
int condition = (@P.x > 0) ? 1: 0;
@Cd = set( condition, 0, 0);
float condition = (@P.x > -1) ? 0.85 : 0.25;
@Cd = set(condition, 0, 0);
③ヘルプの紹介
見出しに上げ
④ Fetching input attributes
Fetching Vector P
@P : fetch first input P
@opinput1_P : fetch second input P
@opinput?_P : fetch ?th input
Fetching float foo : フロートのfooという関数を引っ張りたい場合の例として。
f@foo : fetch first input foo
f@opinput1_foo : fetch first input foo
f@opinput?_foo : fetch ?th input foo
⓹ @N = @N; を使用した法線の初期化
⑥ measure SOP : curvatureアトリビュートを$CURVATUREというローカル変数に。
atribcreate SOPの使用
Point SOPなどに$CURVATUREを入れようとするとAttrib create SOP, Point SOPを使用する流れ。Attribute Wrangleを使用すると@curvatureを直接使用する事の利点とその説明。
⑧ @opinput?_P と point 関数の比較 (45:00前後)
point :
type point(string geometry, string attribute_name, int pointnumber)
type point(int opinput, string attribute_name, int pointnumber)
@P = v@opinput1_P;
@P = point( 1, "P", @ptnum);
どちらの結果も同じとなる。
@v = @opinput1_v;
@Cd = @opinput2_P - @opinput1_P;
⑨ lengthを使用したpoint colorの応用。
vector pos = point(1, "P", 0);
@Cd = length(@P - pos);
⑩ getbboxを使用した径の割り出し。@sizeに割りあて。
vector bbox_min, bbox_max;
getbbox(0, bbox_min, bbox_max);
v@size = bbox_max - bbox_min;
⑪ detailを使用してdetailに入ったattributeを入力
f@maxc = detail(1, "curvature_max", 0);
⑫ setattribtypeinfo()の使用 http://houdinifx.jp/aup/houdini15.5/vex/functions/setattribtypeinfo
setattribtypeinfo(int geohandle, string attribtype, string name, string typeinfo)
setattribtypeinfo(O, "point", "myattrib", "point");
⑬ isbound()の使用 http://houdinifx.jp/aup/houdini15.5/vex/functions/isbound
int isbound(string variable_name)
⑭ @group_?の使用 (1:25:00前後) Sphereの中に入ったmygroupというポイントグループを使用。
int in_group = ( @group_mygroup == 1 ) ? 1 : 0;
@Cd = set(in_group, 0, 0);
int in_group = @group_mygroup;
@Cd = set(in_group, 0, 0);
@Cd = {0,0,0};
@Cd.x = ( @group_mygroup == 1) ? 1 : 0;
全て同様の結果。
if (@group_mygroup == 1) {
@Cd = {1,1,0};
}
else {
@Cd = {0,0,1};
}
⑮ stringsの説明 http://houdinifx.jp/aup/houdini15.5/vex/stringsを参照。
⑯ @group_?の使用②
vector pos = {1,0,0};
float rad = 0.8;
float distance = length(pos - @P);
if (distance <= rad){
f@group_ingroup = 0.75;
}
@Cd = set(@group_ingroup, 0, 0);
⑰ chv(), ch()の使用 chvだとvector,chだとfloatのパラメーターを作成してその値を入力する。
vector pos = chv("center");
float rad = ch("rad");
float distance = length(pos - @P);
if (distance <= rad){
f@group_ingroup = 0.75;
}
@Cd = set(@group_ingroup, 0, 0);
⑱ @group_?とnoise,anoise,snoise
@group_ingroup = (rand(@ptnum + 1.001) > 0.6 ) ? 1 : 0;
@Cd = @group_ingroup;
@group_ingroup = (noise(@P + 1.01) > 0.5) ? 1 : 0;
@Cd = set(@group_ingroup, 0, 0);
@group_ingroup = (anoise(@P*ch("scale")+ch("seed")) > ch("range")) ? 1 : 0;
@Cd = set(@group_ingroup, 0,0);
float mynoise = snoise(@P*5);
if ( mynoise < 0.1 || mynoise > 0.9 ) {
@Cd = {1,1,0};
}
else{
@Cd = {0,0,1};
}
⑲ PointCloud : pcfind(), pgfind(), pcfind_radius(), ファイルから最近接ポイントのリストを返す。
pcfind()
int [] pcfind(string filename, string Pchannel, vector P, float radius, int maxpoints)
int [] pcfind(int inputnum, string Pchannel, vector P, float radius, int maxpoints)
int [] pcfind(string filename, string ptgroup, string Pchannel, vector P, float radius, int maxpoints)
int [] pcfind(int inputnum, string ptgroup, string Pchannel, vector P, float radius, int maxpoints)
int [] pcfind_radius(string filename, string Pchannel, string RadChannel, float radscale, vector P, float radius, int maxpoints)
int [] pcfind_radius(int inputnum, string Pchannel, string RadChannel, float radscale, vector P, float radius, int maxpoints)
int [] pcfind_radius(string filename, string ptgroup, string Pchannel, string RadChannel, float radscale, vector P, float radius, int maxpoints)
int [] pcfind_radius(int inputnum, string ptgroup, string Pchannel, string RadChannel, float radscale, vector P, float radius, int maxpoints)
//initalize local variables
float maxdist = 0.25;
int maxpts = 1;
@Cd = {0,0,0};
//use pcfind_radius to find second input point cloud nearest to current point
int closept[] = pcfind_radius( 1, "P", "pscale", 1.0, @P, maxdist, maxpts);
i[]@closepoints = closept; //add attribute to see in geometry spredsheet
foreach(int pt; closept) {
vector pc_pos = point(1, "P", pt); //look up second input by found pc pt found
f@weight += length(pc_pos - @P); //distance between geo point and found pc point
}
@Cd = @weight;
@weight += 1-smooth(0, maxdist, @weight); // これを入れてスムーズかかるっぽい。
色々調整したりするだけで表情変わる感じでよい。
float amt = 0.5;
@N = @N;
@P += @N*@weight * amt;
おお。これはいい。
⑳ Enforce Prototypesの利用
複雑なVEXを書いてくとErrorを見つけにくいので、必要とする関数を宣言してあげてからEnforce Prototypesをチェックすることで、Errorを表示しやすくするテクニック。
㉑ Bindings の利用
既存のAttributeを指定した別名で読み込んだり。既存のグループを指定した別名で読み込んだり。
㉒ Run Over : Number , @elemnumの使用。
いやー。かなり勉強になりました!すげー時間かかった。
No comments:
Post a Comment