Aug 3, 2016

Side Effects Webinar | Houdini VEX and VOPS





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)
pcfind_radius() : 扱いは難しそうだけど可能性を感じた。

  • 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