PythonUSD チートシート
Python を使用して USD を操作するやり方がだいぶ分かってきたので
よく使う物とかをまとめ。
全般
Import
import os.path
from pxr import Usd, UsdGeom, Sdf, Gf
Stage 関係
New シーン
stage = Usd.Stage.CreateInMemory()
usda を作らずにとりあえずステージを作る場合。
stage = Usd.Stage.CreateNew(USD_PATH_ROOT + '/HelloWorld.usda')
usda を作って、新しいステージを作る。
USD を開く
stage = Usd.Stage.Open(USD_PATH_ROOT + '/HelloWorld.usda')
すでにある USD ファイルをステージとして開く。
Payload をロードせずに USD を開く
stage = Usd.Stage.Open(USD_PATH_ROOT + '/HelloWorld.usda',Usd.Stage.LoadNone)
保存する
stage = Usd.Stage.CreateNew(USD_PATH_ROOT + '/HelloWorld.usda')
stage.Save()
開いている usd をそのまま保存。
stage = Usd.Stage.CreateInMemory()
stage.GetRootLayer().Export(USD_PATH_ROOT + '/HelloWorld.usda')
メモリ上のみで作成している USD を Export する。
CreateNew して開いて保存する場合、すでに USD があると Error になってしまうが
こちらの場合はエラーにならない。
現在の USD の中身を確認する
print(stage.GetRootLayer().ExportToString())
ExportToString をすると、げんざいの USD をプリントすることができる
全コンポ結果を反映した USD を確認する
stage.Flatten().ExporToString()
通常の ExportToString()の場合、コンポ情報が残った状態で表示される。
が、すべてのコンポジションの結果をすべて判定(Flatten)した状態で見たい場合は
上のようにする。
当然のことながら、複雑なコンポを行っている場合 Flatten するとファイルサイズは増大する。
Stage 関係
ステージ内の Prim をトラバースする
compStage = Usd.Stage.Open(USD_PATH_ROOT + "/sample.usda")
for prim in compStage.Traverse():
print(prim)
実行すると、このようなシーングラフなら
このように全 Prim を深さ優先で取得することができる。
Payload がロードされていないノードも Traverse する
Prim の状態をチェックしつつ検索するには GetFilteredChildren を使用する。 このコマンドの場合は、引数に Traverse するノードの状態を指定することで 該当するノードを取得することができる。
for i in prim.GetFilteredChildren(Usd.PrimIsActive & Usd.PrimIsDefined & ~Usd.PrimIsAbstract):
print(i)
通常の Traverse や GetChildren は、上のフラグに+して Usd.PrimIsLoaded も ON になっている。 なので、Payload で読まれていない Prim は取得できない。
Layer をミュートする
# Layerのusdファイルは identifer で取得できる
# パス指定でLayerをミュート(コンポ処理から除外)できる
compStage.MuteLayer(layer.identifier)
ミュートは現在のステージ上のみで有効で、USD ファイル内には保存されない。
→ ミュートした状態で Flatten すると、ミュート状態のレイヤーは無効化される。
Layer 関係
RootLayer を取得
openUsd = Usd.Stage.Open(USD_PATH + "/baseUSD.usda")
print(openUsd.GetRootLayer())
Composition の Root の Layer(.usda)を取得する。
ここで取得出来る Sdf.Find()で取得出来る Layer の Prim は
いわゆる PrimSpec。