On this page |
概要
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を変更しないでください 。変更してしまうと予期しない間違った結果を招いてしまいます。)
サンプル
ステージに新しい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(): # Access or edit the 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()
もコール しないでください 。
Tips
-
コードを編集する時、このノードは、エディタ外をクリックまたはAlt + Enterを押した時にクックします。
-
このノード上にSpareパラメータを追加することで、このノードにグラフィカルインターフェースを追加することができます。 例えば、Primパスを受け取る
primpath
という名前のテキストボックスを追加することができます。 これによって、スクリプト内でそのパラメータ値にアクセスすることができます:node = hou.pwd() primpath = node.evalString("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プリミティブパターンマッチを実装しています。 このオブジェクトはパス文字列のリストを生成します。
stage.GetPrimAtPath(pathstring)
を使用することで、パス文字列からPrim
オブジェクトに変換することができます。 この手法を使用すると、現行ノードではなくて、入力ノード上の選択ルールが評価されるので、再帰エラーが回避されます。 他にも、入力ステージの重い複製を回避するために、このノードの編集可能ステージを取得する前に選択ルールを評価してください。
パラメータ
Python Code
このノードをクックする時に実行するPythonコード。Tipsとサンプルは上記のメインヘルプを参照してください。