Houdini 18.5 ネットワークとパラメータ

カスタムHScriptエクスプレッション関数

HScriptエクスプレッション言語にカスタム関数を追加する方法。

On this page

あなたが使用したいカスタム関数をHScriptエクスプレッションで作成することができます。 カスタムエクスプレッション関数を作成する前に、エクスプレッション関数の組み込みライブラリを二重チェックしてください。必要な関数が既に存在している場合があります。

Note

カスタム関数を必要とする非常に高度なエクスプレッションを記述したいのであれば、スクリプトをPythonに切り替えることを検討してください。

How to

To...Do this

カスタムエクスプレッション関数エディタを開く

  1. Edit ▸ Aliases and Variables を選択すると、 Aliases and Variables エディタが開きます。

  2. Expressions タブをクリックします。

新しいカスタムエクスプレッション関数を作成する

  1. カスタムエクスプレッション関数エディタを開きます(上記参照)。

  2. 大きなテキストボックスに新しい関数を入力します。

  3. Apply Changes をクリックします。新しい関数名が左側の関数リストに表示されます。

外部ファイルから定義を読み込む

カスタムエクスプレッション関数エディタの右下コーナーにあるプラスアイコンをクリックして、読み込むファイルを選択します。

外部エディタで関数ソースコードを編集する

  1. カスタムエクスプレッション関数エディタの右下コーナーにある Edit ボタンをクリックします。

    Houdiniは、$EDITOR環境変数で定義した外部エディタを使用します。$EDITORを設定していない場合は、Houdiniはプラットフォームのデフォルトのエディタ(例:vinotepad.exe)を使用します。

  2. 外部エディタでソースコードを編集して、保存して閉じるとHoudiniに戻ります。

フォーマット

カスタムエクスプレッション関数は以下の構文を使って定義します:

[return_type]
functionName([[arg_type1] arg_name1 [, [arg_type2] arg_name2] ...])
{
...
}

戻り値のタイプと引数のタイプはfloatstringvectormatrixになります。

Note

戻り値のタイプや引数のタイプを明示的に示さなかった場合、Houdiniは、そのタイプをfloatと見なし、暗黙で他のデータタイプをfloatにキャスト(型変換)します。引数が文字列であることを指定し忘れると、Houdiniは引数をfloatにキャスト(型変換)してしまうのでバグを見つけるのが難しくなります。

関数のボディを定義するには、割り当て(=+=-=)、ifforwhileなどの特別な構文を使うことができます。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;
}

ネットワークとパラメータ

ネットワーク

パラメータの編集

次のステップ

エクスプレッション

導師レベル

リファレンス