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 の座標を足して2で割る。

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っていれると4つくらいできる。ポイントができる。(lengh1のとき)

  • CreateUvでPointのUv拾える。

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

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

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)

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(配列から任意のアイテムを消す)
removeindex(&array[], int index)
int removevalue(&array[], 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)
最後が1ならpointを消す。 0なら残す。、

sort
sort Compornent がある

Vex配列機能
void append(&array[], value)
void push(&array[], value)
void insert(string &str, int index, string value)
int len(array[])
int [] sort(int values[])
int find(array[], target)
removeindex(&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を作る場合

!

Group by attribute vex Ver
!

  

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 ノードを使う

math系

Radom
float x = fit(rand(seed),0,1,2,3);
で 2-3の乱数作れる.

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のアトリビュートを3D表示する。

forearchとの組み合わせ

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

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

Geometry Spred Sheet見たほうが良い。

Attribiute

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

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

Detailのアトリビュートを参照する。
type detail(0,"アトリビュート名",0)

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

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

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

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

Group

Pointをグループに追加する。

int setpointgroup(int geohandle, string name, int point_num, int value, string mode="set")

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 ノードを使う。

WeaberBird

ETC

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

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

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

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

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