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
から読み込むことができます。
クックの実装 ¶
-
$HFS/houdini/help/files/hom_cookbook/xforms_from_disk.hip
を開きます。 -
Playをクリックします。
xforms_from_disk1
オブジェクトノードは、同じディレクトリのmotion.csv
ファイルからそのトランスフォームを読み込みます。 オブジェクトノードは、クック時に、ファイルから現在の時間に該当するトランスフォメーションマトリックスを検索して、そのマトリックスをノードのトランスフォームに設定します。 -
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())