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。
指定 Layer オブジェクトの usd ファイルパスを取得する
print(layer.identifier)
Prim 操作
Prim/Class/Over を作る
stage.DefinePrim("/hogehoge")
stage.OverridePrim("/over")
stage.CreateClassPrim("/class")
スキーマなしの Prim が作成さ れる。
Stage から Prim を取得する
prim = stage.GetPrimAtPath('/hogehoge')
print(prim)
スキーマありの Prim を定義する
stage = Usd.Stage.CreateInMemory()
# Xformを作る
xform = UsdGeom.Xform.Define(stage, '/xform')
# Cubeを作る
cube = UsdGeom.Cube.Define(stage, '/hello')
ConcreteSchema には Define 関数があるので、↑ のように定義する。
Schema オブジェクトから Prim を取得
prim = xform.GetPrim()
SdfPath 関係
SdfPath の基本操作
sdfPath = Sdf.Path("/base")
xform = UsdGeom.Xform.Define(stage, sdfPath)
SdfPath は、 / スタートで Stage 内のシーングラフを定義する。 定義した Path で、Prim やスキーマの定義を作ることができる。
各オブジェクトから Path 取得
attr = prim.CreateAttribute("test", Sdf.ValueTypeNames.Bool)
xformPath = xform.GetPrim().GetPath()
attrPath = attr.GetPath()
Path を取得したい Prim や Attribute、Prim オブジェクトで .GetPath() する。
Attribute の Path は /base.test のように . で表現される。
SdfPath が何を指しているか確認する
print(sdfPath.IsPropertyPath())
print(sdfPath.IsPrimPath())
print(sdfPath.IsTargetPath())
Is ~ Path で、SdfPath が何をしてしているのかチェックできる。
SdfPath 操作
# 子に対して引数の階層を追加する
cldPath = sdfPath.AppendChild('hoge')
# 子に対してAttributeを追加する
cldAttrPath = sdfPath.AppendProperty('hogeAttr')
Attribute 操作
Attribute を作る/セットする
# Boolの場合
attr = prim.CreateAttribute("test", Sdf.ValueTypeNames.Bool)
attr.Set(False)
# Colorの場合
color_attr = prim.CreateAttribute("color", Sdf.ValueTypeNames.Color3d)
color_attr.Set(Gf.Vec3d(1, 1, 1))
ValueTypeNames での型指定方法は を参照。
Color や Vector などの型は Gf モジュールにある定義を使用してセットする。
Attribute から値を取得する
attr = prim.GetAttribute('test')
print(attr.Get())
Namespace を使用する
# Namespaceつきのアトリビュートを作る
prim.CreateAttribute("ns:testVal", Sdf.ValueTypeNames.Bool)
props = prim.GetPropertiesInNamespace('ns')
print(props)
プロパティ名・アトリビュート名には Namespace をつけることができる。
つけかたは Namespace:hogehoge のように : で区切れば OK。
Namespace をつけておくと、GetPropertiesInNamespace 関数を使用して
指定の Namespace のプロパティやアトリビュートを取得することができる。