| On this page |
あなたが使用したいカスタム関数をHScriptエクスプレッションで作成することができます。 カスタムエクスプレッション関数を作成する前に、エクスプレッション関数の組み込みライブラリを二重チェックしてください。必要な関数が既に存在している場合があります。
Note
カスタム関数を必要とする非常に高度なエクスプレッションを記述したいのであれば、スクリプトをPythonに切り替えることを検討してください。
How to ¶
| To... | Do this |
|---|---|
|
カスタムエクスプレッション関数エディタを開く |
|
|
新しいカスタムエクスプレッション関数を作成する |
|
|
外部ファイルから定義を読み込む |
カスタムエクスプレッション関数エディタの右下コーナーにあるプラスアイコンをクリックして、読み込むファイルを選択します。 |
|
外部エディタで関数ソースコードを編集する |
|
フォーマット ¶
カスタムエクスプレッション関数は以下の構文を使って定義します:
[return_type]
functionName([[arg_type1] arg_name1 [, [arg_type2] arg_name2] ...])
{
...
}戻り値のタイプと引数のタイプはfloat、string、vector、matrixになります。
Note
戻り値のタイプや引数のタイプを明示的に示さなかった場合、Houdiniは、そのタイプをfloatと見なし、暗黙で他のデータタイプをfloatにキャスト(型変換)します。引数が文字列であることを指定し忘れると、Houdiniは引数をfloatにキャスト(型変換)してしまうのでバグを見つけるのが難しくなります。
関数のボディを定義するには、割り当て(=、+=、-=)、if、for、whileなどの特別な構文を使うことができます。returnを使うと、値を返します。
#で始まる行はコメントになり、Houdiniで無視されます。
サンプル ¶
# 2つの浮動小数点から
# 最小値を見つける関数
min(v1, v2) {
if (v1 < v2) {
return v1;
} else {
return v2;
}
}
# 文字列の順番を逆にする関数
string strreverse(string in) {
float len = strlen(in);
string result = "";
for (src = len-1; src >= 0; src--) {
result += in[src]; return result;
}
}
# ベクトルから最小要素を見つけるサンプル
float vecmin(vector vec) {
min = vec[0];
for (i = 1; i < vsize(vec); i++) {
if (vec[i] < min) min = vec[i];
}
return min;
}
# ベクトルを、渡されたオブジェクトの空間
# に変換するサンプル
vector opxform(string oname, vector v) {
matrix xform = 1;
if (index(oname, "/obj/")) {
xform = optransform(oname);
} else {
xform = optransform("/obj/"+oname);
}
return v * xform;
}
# ディスプレイフラグが設定されているオブジェクトすべてを
# 見つけるサンプル
string opdisplay() {
string objects = run("opls /obj");
string result = "";
nargs = argc(objects);
for (i = 0; i < nargs; i++) {
string obj = arg(objects, i);
if ( index(run("opset " + obj), " -d on") >= 0 ) result += " " + obj;
}
return result;
}