USD の自己学習が進みましたので,私個人の専門分野への応用を念頭におきながら実践編へと移ってまいります。
Xformable なノードの作成
Xformable なノードが定義されたステージファイルを作成してみます。ステージに /World という名のノードがひとつあるだけのごくシンプルなファイルです。
from pxr import Usd, UsdGeom
def create_stage():
stage = Usd.Stage.CreateInMemory()
return stage
def create_node(stage, path):
node = UsdGeom.Xform.Define(stage, path)
return node
if __name__ == '__main__':
# ステージ作成
stage = create_stage()
# ルートノード作成
rootNode = create_node(stage, '/World')
# USDファイルにエクスポート
stage.GetRootLayer().Export('./World.usda')
上記プログラムを実行すると,USDファイル「World.usda」が無事に生成されます。
念のために,usdchecker に掛けてみましょう。
$ usdchecker ./World.usda
Stage does not specify an upAxis. (fails 'StageMetadataChecker')
Stage does not specify its linear scale in metersPerUnit. (fails 'StageMetadataChecker')
Stage has missing or invalid defaultPrim. (fails 'StageMetadataChecker')
Failed!
警告が 3 つ表示されてしまいました。
「upAxis」と「metersPerUnit」は指定が無くともデフォルト値が入るので,その範囲内で使用する分には問題ないはずですが,正確性を期して指定することにしましょう。「defaultPrim」も同様に明確化しておきます。
修正版は次のようになります。
from pxr import Usd, UsdGeom
def create_stage():
stage = Usd.Stage.CreateInMemory()
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
UsdGeom.SetStageMetersPerUnit(stage, 0.01)
return stage
def create_node(stage, path, is_defaultPrim=False):
node = UsdGeom.Xform.Define(stage, path)
if is_defaultPrim is True:
stage.SetDefaultPrim(node.GetPrim())
return node
if __name__ == '__main__':
# ステージ作成
stage = create_stage()
# ルートノード作成
rootNode = create_node(stage, '/World', is_defaultPrim=True)
# USDファイルにエクスポート
stage.GetRootLayer().Export('./World.usda')
できあがった USD ファイルは次のようなものです。
#usda 1.0
(
defaultPrim = "World"
metersPerUnit = 0.01
upAxis = "Y"
)
def Xform "World"
{
}
usdchecker を起動すると,こんどは「Success!」となりました。
まとめ
Python で Xformable なノードが定義されたステージファイルを作成しました。
「defaultPrim」,「metersPerUnit」,「upAxis」は明示しておいた方がよさそうです。
参考資料
ft-lab (Yutaka Yoshisaka) さん,あんどうめぐみさん による以下のサイトが理解の助けになりました。