Grasshopper からHoudini へ

Grasshopper からHoudiniに移るにあたり、
GHと似たHoudini の機能をメモ書きしたもの。
間違えてたらご指摘ください。







##Point系

__Construct Point__

vector pos = set(0, 0, 0);
int pt = addpoint(0,pos);
  
またはAddコンポーネントでベクトルを入れて追加する。

__CenterPT__

対象のポリゴンのポイントを足していって、ポイントの数で割る。

__CenterPt1__
vector vec = set(0,0,0);
for(int i = 0; i < @numpt ; i++)
{
    vec += point(0,"P",i);
}
vec /= @numpt;
addpoint(0,vec);

__CenterPt2__
Bounding Box のセンターを拾う
vector center = getbbox_center(0);


__CenterPt3__
primWarngle にして各プリミティブのcenterPt 拾える
Grid などの各面のcenter を拾うならこれがよい。

int pt = addpoint(0, @P);
removeprim(0, @primnum, 1);`


__CenterPt4__
boundingbox のMax と　Min の座標を足して２で割る。

vector min, max;
getbbox(min,max);
vector center = (min+max)/2;

addpoint(0,center);


__CenterPt5__
Explession　を使う。
＄CEX　＄CEY　＄CEZ　
Transformノードのパラメーターにこれを打ち込み、ピボットにしたり、移動する距離を決めると便利。



__Brep Closed Point__
位置ベクトルから一番近いジオメトリまでの距離

float dist = xyzdist(0,(位置ベクトル)

__Evaluate Surface__
位置ベクトルから一番近いジオメトリーのUvとプリミティブ番号と最短距離を返す.

int primNum:
vector closedUv;
float dist = xyzdist(0,位置ベクトル,primNum,closedUv)

__Evaluate Surface のNormalを得る__

vector N = primuv(1, "N", prm, uv);

__nearPoints__
位置ベクトルから近いPointの番号を得る
int nearpoint = nearpoint(0,位置ベクトル)
int nearpoints[] = nearpoints(0,@P,(探す最大距離);


__Near Pointのuv 出力機能__
xyzdist(1, @P, prm, uv);


__RemoveDuplicate__
Fuseコンポーネントを使う。
RemoveDegenerater
Keep  Unused      にチェック入れておく。

__Point on curve__
- Resemple node
Max Lenght のところに0.25っていれると４つくらいできる。ポイントができる。（lengh１のとき）


- CreateUvでPointのUｖ拾える。

vector multi = (p0+p1)/2; で中点を拾える(直線に対して）


-  Populate Geometry
Scatterノードを使う。
PointGenerate　ノードを使えば既存のポイントからランダムに任意の数のポイントを拾える。

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/340430/5ddebb24-fd87-b8e6-0ba1-a7962ef47f7d.jpeg">


##Transform系

__move__
①ポイントの座標に任意の数を足す
@P.x += 8;
@P.y += 8;
@P.z += 8;

②Transform Compornent
`$CEX, $CEY, $CEZ
$SIZEX, $SIZEY, $SIZEZ
$XMIN, $YMIN, $ZMIN, $XMAX, $YMAX, $ZMAX `
などのExplession と一緒に使うと便利

③@P = new Vector でポイントの位置を変える


④ amplitude move
Vector move = set(x,y,z);
Normarize(move);
@P += move * Value(距離)




__Orient__
移動先のポイントを作って
CopyStampコンポーネント。



__Rotate__
Transform Node


##Vector系

__Cross Dot__
vector v = cross(Vector,Vector);

CrossDot を二回行えば、面に平行なVectorを出せる。
vector v = cross(v@N ,cross(v@D, v@N))

__Dot Product__
float  dot(vector2 a, vector2 b)


<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/340430/91dd86e2-8ceb-f9bf-7417-e0fc8977244a.jpeg">


X軸に対する10度ごとのDotProductの解。（少数第一で丸めている
符号が隠れているが第3象限はマイナス



__Distance　TwoPoints__
flaot dis = distance(vec1,vec2);


__Vector length__
vectorの長さを返す
float  length(float f)


##List系

__itemList__
point メゾットで任意のポイントからアトリビュートを拾う。Primitive も同様。


vector pos = point(0,"P",index);
(0,入力のIndex番目のポイントのベクトルを拾っている例）


__Replace Items__
AとBを入れ替えるなら
Aを指定 → 保存 →  AにBを入れる →Bに保存したAを入れる


__CullIndex(配列から任意のアイテムを消す)__
<type> removeindex(<type>&array[], int index)
int  removevalue(<type>&array[], <type>value)

int  removepoint(int geohandle, int point_number)


それかdelete ノード

__List Length(アトリビュートの数)__

int length = len(Array）;


__Cull Pattern__
消したいPointを任意のグループに追加またはアトリビュートで印をつけといてして、
Delete Compornet。

__Primitiveを消すときにポイントを残すかどうか__
removeprim(0,@primnum,0)
最後が１ならpointを消す。　0なら残す。、

__sort__
sort Compornent がある


__Vex配列機能__
void  append(<type>&array[], <type>value)
void  push(<type>&array[], <type>value)
void  insert(string &str, int index, string value)
int  len(<type>array[])
int [] sort(int values[])
int  find(<type>array[], <type>target)
removeindex(<type>&array[], int index)

__Jitter__
Point wangle   でポイントの順をランダムに並び替える.
乱数を作ってそれをインデックスにして入れ替えていく。

```
for(int i = 0; i < @numpt; i++)
{
    @index[i] = i;
}


for(int i = 0; i < @numpt; i++){
    int j = int(rand(i*`chs("../Controlloer/seed")`)*@numpt);
    int stor = @index[i]; 
    @index[i] = @index[j];
    @index[j] = stor;
}

```



##Group系
GHではあまり出番がないが、Houdiniではオブジェクトをグループに追加➡グループに対して処理　のパターンはよく使う。

__グループへの追加__
int  setpointgroup(int geohandle, string name, int point_num, int value, string mode="set")

int  setprimgroup(int geohandle, string name, int prim_num, int value, string mode="set")`

それかCreate Group ノードを使う。

___Group by attibute___
AttributeからGroupを作る場合

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340430/e566239f-eab0-b17e-32a6-89df42d622d5.jpeg">!

__Group by attribute vex Ver__
<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340430/e990a9a6-dc41-40b1-f101-71e89ecd18b4.jpeg">!

　　

##Surface系

__
__explode Surface__
FuseNode を使う。Uniqueにチェック入れるとプリミティブ同士が切れる。

__Brep WireFrame__
ConvertLine Nodeをつなぐ

__Cull Duplicate Edgths__

DivideノードのRemoveSharedEdgesにチェック入れる。

__エッジを取り出すなら__
primitive ノードのFace/FullからCloseUをUnrollにする。

__Surface Closed Point & Evaluate Surface__
xyzdist を使うことで、Vectorからの距離内のPrim番号をみつけて
primUv　でAttributeにアクセスできる

`float  xyzdist(<geometry>geometry, vector origin, int &prim, vector &uv, float maxdist)
float  xyzdist(<geometry>geometry, string primgroup, vector origin, int &prim, vector &uv)`



__EvalueateSurface__

Primiteiveの任意のUVのアトリビュートを拾える。
`
<type> primuv(<geometry>geometry, string attribute_name, int prim_num, vector uvw)
<type>[] primuv(<geometry>geometry, string attribute_name, int prim_num, vector uvw)`



## Curve系

__line from Two point__
int line = addprim(0,"polyline");
addvertex(0,line,ptnum);
addvertex(1,line,ptnum);

addvertex(追加するポイント、ターゲットのPrim);

__End Point__ 

Primpoints を使い、Primitiveを構成しているpointのインデックスの配列を拾い、その両端を取り出す。
int endPt[] = primpoints(0,0);
int start = endPt[0];
int end = len(endPt)-1;


__Explode__
Pointをグループに追加して、polyCut　ノードを使う
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/340430/5f98cea4-10dc-570e-d3eb-535d089fb769.jpeg">



##math系
__Radom__
float x = fit(rand(seed),0,1,2,3);
で　2-3の乱数作れる.
<br />

__Max & Min__
配列の中から最大、最少の値を返す。
`<type> max(<type>values[])
<type> min(<type>values[])`

__数点以下切り捨て__
floor(float)
のかたち
範囲を超えたら切り捨て
clamp(targetValue,min,max);


__Remap__
fit（FitさせるNumber,SorceMin,SourceMax,TargetMin,TargetMax）；
max< min とすれば -x〜0 にもRemap 可能。



((float)@ptnum)/(@numpt-1)
で、ポイントに0〜1の値をアトリビュートできる
ただ、ptnum をintからFloatにしないと割れないので、先頭の（float)をに注意。


__GraphMapper__
float dist = chramp("../CONTROLLER/height_ramp",dist);
distを0－1にしておけば、Rampの値になおせる。

float remapNum = (float)@ptnum/(float)(npoints(0));
@P.y = chramp('myRamp',remapNum);
の形で各ポイントをランプに対応させる。


__π__
$PI





__abs__
絶対値をとる。
abs(数値）







##Visual系

__VectorDisplay__
@N = Vector (可視化したいベクター)
で、ノーマルを表示する。

または
Visualize コンポーネントを使う・

__3D Text__

Nodeのアトリビュートを３D表示する。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340430/b1d7d7cf-64f4-a4a3-9eb5-5db6dd617f7e.jpeg">

forearchとの組み合わせ
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340430/e952aab1-cbbe-e410-b1fc-e8244d5e2ffb.jpeg">



__コンソール__
void  printf(string format, ...)



__パネル　__
printf("%f\n",変数名);

Geometry Spred Sheet見たほうが良い。


##Attribiute
GH にはないけどよく使う。



__Point にアトリビュートに値を入れる。__
int pt = setpointattribute(0,"アトリビュート名",int index,入れる値,"set");

__Detailのアトリビュートを参照する。__
type detail(0,"アトリビュート名",０）

__Detailのアトリビュートに値を入れる。__
setdetailattribute(0,"アトリビュート名",値,"set")

__Primにアトリビュートに値を入れる。__
setprimattrib(int geohandle, string name, int prim_num, <type>value[], string mode="set")

__Primのアトリビュートを参照する。__
prim(<geometry>geometry, string attribute_name, int primnumber)



__アトリビュートの平均とか最大値を出す__
AttributePromoteNode を使う
対象のアトリビュート　クラス　移した後のクラス　どういう操作をしてから移すか　を決める。



##Group

__Pointをグループに追加する。__

`int  setpointgroup(int geohandle, string name, int point_num, int value, string mode="set")`
  <br />


__Pointがグループに入っているか確認する。__
 
`int  inpointgroup(<geometry>geometry, string groupname, int pointnum)`

- d = degrees(acos(dot(normalize(@P-pos), normalize(norm))));
setpointgroup(geoself(), grpName, @ptnum, (d > 90) ? 1 : 0, "set");
のように条件で振り分けると楽。


##Plug in

__Anemone__

foreach ノードを使う。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340430/e952aab1-cbbe-e410-b1fc-e8244d5e2ffb.jpeg">

__WeaberBird__


##ETC
後にカテゴライズしていく項目

__@numptを vexで行う__
int  npoints(<geometry>geometry)

__@numprim を　vexで行う__
int  nprimitives(<geometry>geometry)


__指定したPrimitiveがもつPointを返す__
int [] primpoints(<geometry>geometry, int primnum)

__Pointの所属するPrimitiveのリストを出す__
int [] pointprims(<geometry>geometry, int ptnum)