On this page | |
Since | 18.0 |
概要 ¶
下流ノードに渡される一部のデータを保存しておきたいことが時折あります。 例えば、あるノードでメッシュ内のポリゴン間の関係性を解析し、下流ノードが高速検索でアクセスできるようにキャッシュを生成したいことがあります。
USDには一時的な/未保存のデータストレージが用意されていません。 USDでは、データはImmutable(変更不可)であることが求められ(新しい情報をレイヤーに乗せることでしか変更ができない)、USD内のすべてのデータが保存されていることが求められます。
しかし、Houdiniでは一時的なデータを格納する必要性が出てきます(たいていの場合、In-Memoryレイヤーをディスクに書き出す場合です)。
Houdiniは、この一時的なデータを/HoudiniLayerInfo
Primに格納します。
USDに書き出す時、Houdiniはこの特定のPrimをスキップ/取り除きます。
このPrimによって、ディスクに保存したくない独自のデータを(アトリビュートとして)格納するための便宜的な場所をステージ内に用意することができます。
Store Parameter Valuesノードは、このノード上のパラメータの内容(通常ではスクリプトで生成)を/HoudiniLayerInfo
上のプロパティにコピーするモデルに対して動作し、下流のノードでその格納値を読み込むことで、そのパラメータの値を生成させることができます。
この理由は、ノードの名前がパラメータ値を参照しているからです。
Note
このノードは、任意の一時データを格納できるようにするための回避策です。 将来のバージョンのHoudiniでは、もっとわかりやすくして、一時データをネットワークの下流に渡すのに特化した方法を用意する予定です。
How to ¶
To... | Do this |
---|---|
Store Parameter Valuesノードを使って一時データを格納する |
このノードは、パラメータの内容を保存することで動作します。 通常では、Pythonスクリプトを使ってパラメータの内容を生成します。
|
格納データを使って、下流のノードでパラメータの値を設定する |
格納値を使用する便利な方法は、その値を使ってパラメータ値を設定することです。
|
Tips ¶
-
文字列、スカラー値、配列よりも複雑なデータ(例えば、Python辞書)をエンコードしたいのであれば、そのデータをJSONエンコード(暗号化)して文字列に格納し、下流のノードでその文字列をJSONデコード(復元)することで、そのデータにアクセスすることができます。
データをJSONエンコードする
from json import dumps mydict = build_cache_dictionary() jsonstring = dumps(mydict) return jsonstring
下流のノードで辞書を取得する
from json import loads import loputils this_node = hou.pwd() input_node = node.inputs()[0] jsonstring = loputils.fetchParameterValues(input_node, "foo") mydict = loads(jsonstring)
Warning
文字列からデータを抽出する時は、Pythonの
eval()
関数を 決して使用しないでください 。 データはJSONで暗号化して、JSONで復元してください。 -
VEXスニペットで格納値を使用したい場合:
-
Bindings タブで格納値用のパラメータを作成します。または(このノードに Bindings タブがない場合)格納値を入れるためのSpareパラメータを作成します。
-
その新しいパラメータにPythonスクリプトを記述することで、格納値から値を取得することができます。
-
VEXスニペットでは、そのバインドしたアトリビュートを使用します(このノードに Bindings タブがある場合)。 または、Spareパラメータを作成していれば、
ch()
関数を使用することで、そのパラメータ値を読み込むことができます。
-
-
ネイティブのUSD配列では、データタイプを混在させた配列に対応していません。 “Auto”を使ってfloatやintのデータタイプが入ったリストを返しても、それらはfloat配列として格納されます。 本当にリスト内にデータタイプを混在させたいのであれば、そのリストをJSON文字列としてエンコードします。
パラメータ ¶
Parameters
単一ノードで複数のパラメータ値を格納することができます。 格納したい値の数をここに設定するか、または、プラスとマイナスのボタンをクリックして値を追加/削除します。
Enable
値毎に、実際にその値を計算して格納するかどうかを指定します。
Name
値の格納先となるプロパティ名。
この名前には、既存のプロパティ名と干渉していない有効なUSDプロパティ名を設定してください。
名前の頭に二重アンダースコアを付けることで、名前をもっと固有にすることができます。例えば、__indices
です。
Type
格納したい値のUSDデータタイプ。
配列を格納したい場合、Typeを“Auto”に設定し、Pythonリストリテラル(例えば、[1,2,3]
)のような文字列を返してください。
おそらくint
、float
、double
、string
のどれかを選ぶことが多いでしょう。
もっと複雑なデータであれば、string
を選択して、そのデータをJSONとしてエンコードします。
Value
格納する値の文字列表現。
通常では、Pythonスクリプトを使ってこのパラメータの値を駆動させたいです(上記の“How to”を参照)。
配列を格納したいのであれば、Typeを“Auto”に設定し、ここには、Pythonリストリテラル(例えば、[1,2,3]
)のような文字列を設定します。