On this page | |
Since | 17.0 |
概要 ¶
LOPノードを使って表現するのが難しい技術的タスクまたは統合タスクには、このノードを使用してUSD APIのフルパワーを使ってシーングラフツリーを読み込んで修正したり、HOMのパワーを使って残りのHoudiniにアクセスしてコントロールすることができます。もちろん、Pythonとそのライブラリのフルパワーを使って外部データにアクセスしてパイプラインや他のシステムに統合することもできます。
このノードは、独自のパイプライン固有のタスクをスクリプト化するのに役立つ事が多いです。
APIのヘルプはPixarのPython APIチュートリアルを参照してください。
ステージのスクリプト化 ¶
-
hou.pwd()
をコールすることで、このノードの参照をhou.Nodeとして取得することができます。 この参照を介して現行ステージ も 取得することができます(以下参照)。 さらには、この参照を使ってこのノードに追加されているSpareパラメータにアクセスすることができます。 -
hou.pwd().editableStage()
をコールすることで、編集可能なpxr.Usd.Stage
オブジェクトを取得することができます。 このオブジェクトは、このノードの出力(APIによって加えられた変更を含みます)を表現しています。(USD Edit Targetは自動的にアクティブレイヤに設定されます。 このEdit Targetを変更しないでください 。変更してしまうと予期しない間違った結果を招いてしまいます。)
-
hou.pwd().inputs()[0].stage()
をコールして入力ステージを読み込み、次に、評価されたプリミティブパターンまたは他の値をスタッシュ(保存)した **後に**hou.pwd().editablestage()
をコールしてください。順番を誤ってこの処理が行なわれても、通常ではHoudiniはそのコードを実行しますが、効率が低下します。
サンプル ¶
ステージに新しいPrimsを追加する。
stage = hou.pwd().editableStage() xform = stage.DefinePrim('/shapes', 'Xform') cube = stage.DefinePrim('/shapes/cube1', 'Cube')
シーングラフツリー内のすべてのPrimをループする。
stage = hou.pwd().editableStage() for prim in stage.Traverse(): # Primにアクセスまたは編集します。 pass
USDのハイレベルAPIsを使って複雑なアトリビュートを制御する。
from pxr import UsdGeom stage = hou.pwd().editableStage() cube = stage.GetPrimAtPath("/shapes/cube1") # アトリビュートを直接変更する。 cube.GetAttribute("size").Set(1.5) # APIsは便利なショートカットを持つことができます。 cube_api = UsdGeom.Cube(cube) color = cube_api.GetDisplayColorAttr() color.Set([(0, 0, 1.0)]) # マトリックスアトリビュートを直接いじることなくXformCommonAPIを使ってトランスフォームを制御することができます。 UsdGeom.XformCommonAPI(cube).SetTranslate((4, 5, 6))
すべてのライトをループさせて、ライトの露出をライトの強度にコピーし、その露出をクリアする。
from pxr import UsdLux stage = hou.pwd().editableStage() # UsdLuxには、シーン内のすべてのライトを効率的に検索するための特別なAPIが用意されています。 api = UsdLux.ListAPI(stage.GetPseudoRoot()) for lightprim in light api.ComputeLightList(): exposure_attr = lightprim.GetAttribute("exposure") intensity_attr = lightprim.GetAttribute("intensity") intensity = intensity_attr.Get() exposure = exposure_attr.Get() if exposure: intensity_attr.Set(intensity * (exposure ** 2)) exposure_attr.Set(0)
hou.LopSelectionRuleを使って、すべてのライトの強度を現行値の半分にする。
node = hou.pwd() # まず最初に、入力上のすべてのライトPrimsを検索します。 # 入力ノードの重い再クックを回避するために、編集可能ステージを取得する前に、これをする必要があります。 ls = hou.LopSelectionRule() ls.setPathPattern('{ usd_istype(0, @primpath, "UsdLuxLight") }') paths = ls.expandedPaths(node.inputs()[0]) # これで一連のPrimパスが取得できたので、編集可能ステージを取得して変更を加えることができます。 stage = node.editableStage() for path in paths: prim = stage.GetPrimAtPath(path) intensity = prim.GetAttribute('intensity') intensity.Set(intensity.Get() * 0.5)
他のAPIでアクティブレイヤをスクリプト化する ¶
-
Usd
APIsを使ってステージを制御する 代わりに 、ローレベルのSdf
APIsを使ってアクティブレイヤを編集することができます。 同じスクリプト内で両方の処理を制御することはできません。 -
ローレベルAPIsの方を好む理由があれば、おそらくアクティブレイヤだけをスクリプト化したいことでしょう。
pxr.Usd
メソッドは、非常に使い勝手の良いハイレベルメソッドです。pxr.Usd
メソッドは、エラーチェックやデータの有効性を実行する処理が多いです。 しかし、pxr.Sdf
APIsは劇的に高速で、特に新しいUSD Primsを作成する時がそうです。 -
アクティブレイヤの編集可能な
pxr.Sdf.Layer
参照を取得したいのであれば、hou.pwd().editableLayer()
をコールします。 これをコールした場合、同じスクリプト内でhou.pwd().editableStage()
をコール しないでください (コールした場合は単にNone
が返されます)。 -
Python LOPがクックしている間は、返される編集可能レイヤはどのUSDステージにも属していないので、編集時に
Sdf.ChangeBlock
オブジェクトを使用して一括で変更通知する必要がありません。 -
editableLayer
コールの後は、hou.pwd().uneditableStage()
を使用することで、読み込み専用のUsd.Stage
にアクセスすることができます。 このステージは、このノードの入力に接続されているノードの出力になります。 しかし、hou.pwd().stage()
やhou.pwd().input(0).stage()
をコールするのとは違って、この手法は既にロックされているステージに対して再度Read Lockしようとすることで発生する再帰的なエラーや警告は発生しません。 その返されたステージを使用してステージの現在の状態に関する情報にアクセスすることで、編集可能レイヤに加えた変更を知らせることができます。 この編集可能レイヤはこの読み込み専用ステージに合成されないので、このレイヤに加えた変更は、そのステージの内容には影響しません。
Tips ¶
-
コードを編集する時、このノードは、エディタ外をクリックまたはAlt + Enterを押した時にクックします。
-
このノード上にSpareパラメータを追加することで、このノードにグラフィカルインターフェースを追加することができます。 例えば、Primパスを受け取る
primpath
という名前のテキストボックスを追加することができます。 これによって、スクリプト内でそのパラメータ値にアクセスすることができます:node = hou.pwd() primpath = node.evalParm("primpath")
-
作成した便利なPython Scriptノードを共有したい場合、そのノードインスタンスをLOPデジタルアセットに変換することができます。 ネットワークエディタ内でそのノードを右クリックして、 Create Digital Asset を選択します。 このスクリプトがデジタルアセットの一部として格納され、このノードも同じように動作しますが、共有とバージョン管理が可能なアセットとして機能します。
-
エディタの右側にあるポップアップメニューボタンは、Houdiniパス内の
PythonScripts.txt
ファイルからスニペットを取り込みます。$HOUDINI_USER_PREFS_DIR/PythonScripts.txt
ファイルを作成し、そのテキストにスニペットを追加すれば、このメニューにそれらのスニペットが表示されます。$HFS/houdini/PythonScripts.txt
を読んで、必要なファイル形式を確認してください。 -
スクリプトで“何とかのPrimsすべてを検索”する必要がある場合、USDの走査系メソッドを使用するよりも、hou.LopSelectionRuleを使用することを考慮してください。 hou.LopSelectionRuleオブジェクトは、HoudiniのUSDプリミティブパターンマッチを実装しています。 このオブジェクトは
Sdf.Path
オブジェクトのリストを生成します。stage.GetPrimAtPath(pathstring)
を使用することで、Sdf.Path
をUsd.Prim
オブジェクトに変換することができます。 この手法を使用すると、入力ノード上の選択ルールを評価したり、pwd().editableStage()
が返すUsd.Stage
上の選択ルールを直接評価することができます。 入力ノードを使用する場合、入力ステージの重い複製を回避するために、このノードの編集可能ステージを取得する前に選択ルールを評価してください。 -
Python LOPのスクリプト内からhou.setContextOption()をコールするのは、ほとんどの場合で良くない考え方です。 それをしてしまうと、グローバルコンテキストオプションが作成されてしまいます。 グローバルコンテキストオプションは、hipファイル内のどこからでもアクセス可能です。つまり、このLOPをクックしてスクリプトを実行すると、hipファイル内の他のどれかのノードがこのグローバルコンテキストオプションを使用していた場合にそのノードがDirty(変更あり)になってしまう可能性があります。 さらに、グローバルコンテキストオプションは、ノードがクックされる時にのみ設定されますが、Context Option Editorまたは(Pythonシェル内や他のPython LOP内で)Pythonコードを使用してグローバルコンテキストオプション値を変更しても、 このノードはDirtyにならないので再クックもされず、期待通りにオプション値がリセットされることはありません。 代わりに、LOPネットワーク内にローカルでコンテキストオプションを設定するには、
Edit Context Options LOPを使用してください。
-
ステージのルートレイヤを編集しないでください。このルートレイヤはPython APIからアクセスできますが、このLOPクックの構造上、どの単一LOPノードからも干渉されないようにそのルートレイヤを自由に管理できる必要があります。 この間違いを招いてしまうよくある使い方は、サブレイヤをルートレイヤに追加したい時です。サブレイヤをルートレイヤに追加したいのであれば、代わりにhou.LopNode.addSubLayerメソッドを使用すると良いでしょう。
パラメータ ¶
Python Code
このノードをクックする時に実行するPythonコード。Tipsとサンプルは上記のメインヘルプを参照してください。
Maintain State
有効にすると、大元のPythonインタープリタがクック間でクリアされなくなります。 これによって、いくらかパフォーマンスが良くなりますが、その反面、予期しない挙動を招く可能性があります。 通常では、これを無効なままにすることを推奨します。