よく使うHScriptエクスプレッション関数


この記事ではHScriptエクスプレッションを利用する上で、利用頻度の高いであろう、基本的な関数について簡単な紹介を行います。
全てのHScriptエクスプレッションの関数のリファレンスは、SideFX社サイトのこちらのページをご参照ください。

・数値操作関連

元の数字に対して操作をするような関数です。
主に、小数点の処理や、距離を求めるような関数があります。

ceil(number) 

入力した小数値numberを小数点以下繰り上げした整数値を返します。

ceil(1.5)

floor(number) 

入力した小数値numberを小数点以下切り捨てした整数値を返します。

floor(1.5)

round(number) 

入力した小数値numberを一番近い整数に丸め込みます。
感覚としてはほぼ、四捨五入に近い挙動となります。詳細は後程、別記事にて記載予定です。

round(1.3)

frac(number) 

入力した小数値の小数部を返します。

frac(1.5)

clamp(number, min_val, max_val) 

入力したnumberの数値がmin_valより小さい場合min_valを、max_valより大きい場合max_valを返します。

clamp(1.5, 0, 1)

fit(number, old_min_old, new_max_val, new_min_val, new_max_val) 

old_min_valからold_max_valの範囲を、new_min_valからnew_max_valに拡張します。
その際に入力した数値numberの値を相対的に変化させた結果を返します。

numberの値の取りうる範囲が事前にわかっているときに利用できます。
numberの値がoldの範囲を超える際はclamp()関数と同様に、min/maxの値として処理されます。

fit(1, 0, 1, -1, 1)

length(x, y, z) 

入力したベクトルの大きさを返します。

length(0, 1, 2)

distance(x1, y1, z1, x2, y2, z2)

入力したポイント2点の座標間の距離を返します。

distance(0, 1, 2, 3, 4, 5)

primdist(surface_node1, prim1_num, surface_node2, prim2_num, return_type)

指定したノードsurface_node1のプリミティブprim_num1と、
surface_node2のプリミティブprim_num2との距離を返します。
また、return_typeの数値によって挙動が下記のように変わります。
・return_type = 0 最小距離を返します。
・return_type = 1 prim1の最小距離でのポイントのUパラメトリック値を返します。
・return_type = 2 prim1の最小距離でのポイントのVパラメトリック値を返します。
・return_type = 3 prim2の最小距離でのポイントのUパラメトリック値を返します。
・return_type = 4 prim2の最小距離でのポイントのVパラメトリック値を返します。

この関数はポリゴン、カーブ、NURBS/Bezierサーフェスでのみ動作します。
他のタイプのプリミティブに使用した場合は常に0が返されます。

primdist(“/obj/geo1/sphere1”, 0, “/obj/geo1/grid1” ,0, 0)

xyzdist(x, y, z, surface_node,  prim_num, return_type) 

座標(x,y,z)と指定したノードsurface_nodeのプリミティブprim_numとの距離を返します。
prim_numが-1の場合は、surface_node内の一番近いプリミティブとの距離を返します。
また、return_typeの数値によって挙動が下記のように変わります。
・return_type = 0 最小距離を返します。
・return_type = 1 最小距離でのポイントのUパラメトリック値を返します。
・return_type = 2 最小距離でのポイントのVパラメトリック値を返します。
・return_type = 3 最小距離のプリミティブ番号を返します。

xyzdist(0, 1, 2, “/obj/geo1/sphere1”, 0, 0)

・数値生成関連

新しく数値を作り出したり、別の個所から数値をコピーする際などに利用する関数です。

ch(path) 

入力したパスのパラメータの数値を返します。
Copy Parameter + Paste Relative Referenceを使うと自動的にこの関数がパラメータ項目に記述されます。

ch(“rady”)

chs(path) 

入力したパスのパラメータの文字列を返します。
Copy Parameter + Paste Relative Referenceを使うと自動的にこの関数がパラメータ項目に記述されます。
上記のch()と同じように利用できます。数値の場合はch()、文字列の場合はchs()を使います。
主にファイルパスなどのコピーの使われます。
また、Houdiniのパラメータに文字列をエクスプレッションで入力する際は、
バッククオート( ` : Shift+@)で囲う必要があります。

chs(“../mantra1/vm_picture”)

chf(path, frame) 

特定のフレームの入力したパスのパラメータの値を返します。
frameの数値に$F-3などを入力することによって数フレーム前の値の参照などが可能です。

chf(“rady”, 5)

stamp(stamp_op_path, val_name, default) 

stamp_op_pathノードに入力したスタンプ変数val_nameの値を返します。
Copy Stamp SOPノードのスタンプ機能を使う際に必須の関数となります。

stamp(“../copy1”, “val”, 0)

※スタンプ変数val値が存在する時はvalの値が、
 そうでない場合は最後の引数default(この場合は0)が返されます。

atof(string) 

入力した文字列stringを数値に変換して返します。

atof(“10.5”)

bbox(surface_node, type) 

入力したsurface_nodeのバウンディングボックス情報を返します。typeにどの情報を返すかを指定します。
D_XMIN: X軸の最小値
D_YMIN: Y軸の最小値
D_ZMIN: Z軸の最小値
D_XMAX: Z軸の最大値
D_YMAX: Y軸の最大値
D_ZMAX: Z軸の最大値
D_XSIZE: X軸のサイズ
D_YSIZE: Y軸のサイズ
D_ZSIZE: Z軸のサイズ

bbox(“../sphere1/”,D_XSIZE)

centroid(surface_node, type)

入力したsurface_nodeの重心の座標を返します。
この場合の重心とは、surface_nodeバウンディングボックスの中心の座標となります。
typeにはx,y,z度の座標を取得するかを設定します。
D_X: x座標
D_Y: y座標
D_Z: z座標

centroid(“../sphere1”, D_X)

rand(seed) 

入力した数値seedに基づいて0から1の間のランダムな値(乱数)を作成し、返します。
※seedの値は整数以外の値が推奨されます。

rand(0.5)

wrap(number, min, max) 

入力した数値numberがminからmaxの間の場合はclamp()関数と同様の挙動になります。
そうでない場合はminからmaxの変化を繰り返すようになります。
numberに$Fを入力することで、ノコギリ状の波形を作成することが可能です。

wrap($F,5,10)

アトリビュート関連

アトリビュートをパラメータ上で利用するのに利用される関数です。

opinputpath(node_name, index)

入力したノード名node_nameのindex番目の入力となるノードのフルパスの文字列を返します。
indexは0番からで、一番左側の入力が0番になります。

opinputpath(“/obj/geo1/merge1”,0)

因みに、opinputpath(“.”,0)と入力することで、自身の0番目の入力ノードのフルパスを取得できます。

point(surface_node, point_number, attribute_name, index)

入力したノード名surface_nodeのPoint アトリビュートを返します。
point_numberでポイント番号を指定し、attribute_nameでアトリビュート名を指定します。
indexの項目はvectorなどのようにアトリビュートが複数のコンポーネントを持つ場合、
そのコンポーネントの番号を指定できます。

また、Houdiniではアトリビュートは自身のノードのものは参照できません。
よってsurface_nodeに直接”.”を指定するとエラーが出力されます。
直前のアトリビュートの値を利用する際は、opinputpath(“.”,0)を利用すると便利です。

文字列のアトリビュートを読み込む際は、points()関数を、
文字列リストのアトリビュートを読み込む際は、pointsmap()関数を利用します。

point(“/obj/geo1/attribcreate1/”,0,”Attrib”,0)
point(opinputpath(“.”,0),0,”Attrib”,1)

prim(surface_node, prim_num, attrib_name, index)

入力したノード名surface_nodeのPrimitiveアトリビュートを返します。
prim_numberでポイント番号を指定し、attribute_nameでアトリビュート名を指定します。
indexの項目はアトリビュートがvectorなどの複数のコンポーネントを持つ場合、そのコンポーネントの番号を指定できます。
また、Houdiniではアトリビュートは自身のノードのものは参照できません。
よってsurface_nodeに直接”.”を指定するとエラーが出力されます。
直前のアトリビュートの値を利用する際は、opinputpath(“.”,0)を利用すると便利です。

文字列のアトリビュートを読み込む際は、prims()関数を、
文字列リストのアトリビュートを読み込む際は、primsmap()関数を利用します。

prim(“/obj/geo1/attribcreate1/”,0,”PrAttrib”,0)
prim(opinputpath(“.”,0),0,”PrAttrib”,1)

・数学演算関連

数学で使われる演算に関係する関数です。三角関数については、別途記載しております。

abs(number) 

入力した数値numberの絶対値を返します。

abs(-10)

sqrt(number) 

入力した数値numberの平方根を返します。

sqrt(9)

pow(base, exponent)

入力した数値baseのexponent乗の値を返します。

pow(2, 3)

log(number) 

入力した数値numberの値を基に、自然対数を返します。
因みに、Houdiniではネイピア数はグローバル変数$Eで定義されています。

log(2.718281828)

log10(number) 

入力した数値numberの値を基に、常用対数を返します。

log10(10)

・その他演算関連

関係演算/論理演算/条件演算などの演算を利用した関数です。

min(num1, num2) 

入力した数値num1とnum2の小さい方の数値を返します。

min(2, -5)

max(num1, num2) 

入力した数値num1とnum2の大きい方の数値を返します。

max(2, -5)

if(expression, true_val, false_val) 

入力したexpressionの結果が正しければtrue_valを、正しくなければfalse_valを返します。

if($F>10, 20, 30)

・三角関数関連

三角関数及び逆三角関数です。円運動や単振動などを作成する際によく利用されます。
HScriptでは、三角関数、逆三角関数の単位は度[°]になります。
三角関数の使用例につきましては、こちらのページもご参照下さい。

sin(degrees) 

入力した数値degreesの値を基にsinの値を返します

sin(30)

cos(degrees) 

入力した数値degreesの値を基にcosの値を返します。

cos(60)

tan(degrees) 

入力した数値degreesの値を基にtanの値を返します。

tan(45)

asin(number) 

入力した数値degreesの値を基にarcsinの値を返します。

asin(0.5)

acos(number) 

入力した数値degreesの値を基にarccosの値を返します。

acos(1/2)

atan(number) 

入力した数値degreesの値を基にarctanの値を返します。

atan(1)

atan2(y, x) 

入力した数値y及びxの値を基にarctanの値を返します。
yにY座標、xにX座標を入れることでxに指定した軸を基準にした座標の角度を取得できます。

tan(1, 1)