Houdini 19.0 Pythonスクリプト HOMクックブック

HOMクックブック Pythonオブジェクト

On this page

概要

ノードのサブネットワークの代わりに、Pythonスクリプトで定義されたオブジェクトノード(OBJ)のアセットを作成することができます ( File ▸ New Operator Type , Python Type をクリック, Network Type を“Object”に設定する)。 このサンプルは、ディスク上のファイルからトランスフォーメーション情報を取得するPythonオブジェクトノードを定義しています。

このサンプルは、例えば、他のソフトウェアパッケージや、ハードウェアデバイスから生成された未処理のトランスフォーメーション情報を、Pythonを使用してHoudiniへ取り込む方法を示しています。

事前に作成されたアセットは、$HFS/houdini/help/files/hom_cookbook/PythonObjects.otlから読み込むことができます。

クックの実装

  1. $HFS/houdini/help/files/hom_cookbook/xforms_from_disk.hipを開きます。

  2. Playをクリックします。

    xforms_from_disk1オブジェクトノードは、同じディレクトリのmotion.csvファイルからそのトランスフォームを読み込みます。 オブジェクトノードは、クック時に、ファイルから現在の時間に該当するトランスフォメーションマトリックスを検索して、そのマトリックスをノードのトランスフォームに設定します。

  3. xforms_from_disk1ノードを右クリックして、 Type Properties を選択し、アセットのType Properties Windowを開きます。

  • 通常のアセットと同様に、ファイル名の Parameters タブにパラメータを作成しました。

  • Code タブには、ノードの論理を実装したPythonコードが含まれています。

# このコードは、このオブジェクトのインスタンスのクック時にコールされます。

# このノードを表すNodeオブジェクトを取得します。
this = hou.pwd()

# このノードのキャッシュデータからキャッシュ化されたトランスフォームを取得するようにしてください。
# キャッシュを保存したため、ファイルが変更されたかどうかのチェックは
# ここでは余計かもしれません。
xforms = this.cachedUserData("diskxforms")
if not xforms:
    # このアセットタイプのPythonモジュールで定義された関数を使用して、
    # ファイルからトランスフォームマトリックスを読み込み、キャッシュ化します。
    xforms = this.hdaModule().reload(this)

if xforms:
    # 現行のフレームに対してトランスフォームを取得します
    index = max(int(round(hou.frame())), 1) - 1
    if index < len(xforms):
        xform = xforms[index]
    else:
        # インデックスがファイルの最後のトランスフォームの後にある場合、
        # ファイルの最終のトランスフォームを保持します
        xform = xforms[-1]

        # 16個の浮動小数点からマトリックスオブジェクトを構築し、
        # このオブジェクトのトランスフォームをマトリックスに設定します
        this.setCookTransform(hou.Matrix4(xform))

関数のリロード

ノードの実際のコードをより綺麗に維持するために、アセットタイプのPython モジュールで、機能性をヘルパー関数/クラスに移したいことがよくあります。 このケースでは、関数を置いて、( Scripts タブにある)アセットモジュールにファイルをリロードしました。

def reload(this):
    """
    ディスクファイルからトランスフォームマトリックスをリロードして、
    ノードのキャッシュユーザデータにキャッシュ化します。
    """

    # 自分のパラメータからファイルの名前を取得
    filename = this.evalParm("file")

    xforms = []
    with open(filename) as f:
        # ファイルは、1行に16個の浮動小数点をカンマで区切った
        # 単純なCSVテーブルです。
        for line in f:
            # その行から空白/改行を分割
            line = line.strip()
            # カンマ区切りの文字列を分割し、数字の部分列を取り出す
            ns = line.split(", ")
            # 文字列を浮動小数点に変換
            fs = tuple(float(n) for n in ns)
            assert len(fs) == 16
            # これをマトリックスのリストに追加
            xforms.append(fs)

    # トランスフォームをキャッシュ化
    this.setCachedUserData("diskxforms", xforms)

アセットのパラメータインターフェースには、 Reload ボタンがあります。 ボタン上のコールバックスクリプトは、単に、アセットのPythonモジュールのヘルパー関数をコールします:

hou.pwd().hdaModule().reload(hou.pwd())

HOMクックブック