Pythonで作るUSDアセット
Universal Scene Description AdventCalendar2021 20 日目は、
以前紹介した ComponentBuilderで遊ぼう に近い内容を Python でやりながら
Python を使用した USD のコンポジションの作り方を説明していきます。
最終的な構成¶
まず、最終的にどのようになるのかを見てみます。
今回はマテリアル回りは省いて、ジオメトリのみの構成です。
Kitchen_set の構造をベースにしつつ、ジオメトリのヴァリエーションは個別のレイヤーに分けつつ
Payload の構造と、Inherits の構造をデフォルトで仕込むようにします。
では、順番に処理を見ていきます。
アセット名の指定など¶
1 2 3 4 |
|
まずは必用なモジュールを Import します。
1 |
|
そして Asset のルートディレクトリを決めておきます。
各アセット以下はこのような構成になるようにします。
Prim やフォルダ名、レイヤー名などには、AssetName を使用するので
事前に変数で定義しておきます。
(実際に使用する場合は、この辺りは関数にしたほうが良いけど、今回はベタ書きします)
1 2 3 4 5 |
|
ディレクトリは決まったので、USD の Prim を作っていきます。
最初に、 payload のレイヤーを作り、その中にすでにあるジオメトリのレイヤーを
リファレンスするようにします。
1 2 3 4 5 |
|
CreateInMemory で、Stage を作り、空の Prim の作成+ DefaultPrim の設定をします。
新しいレイヤーを作る場合は、いくつかやり方があります。
1 |
|
このように、CreateNew する手もありますが
この場合既にファイルがあるとエラーになるので、
1 2 |
|
FindOrOpen するか、サンプルのように CreateInMemory しておくほうが個人的には好きです。
(CreateInMemory なら、必ず作り直すのでアセットづくりの場合なおのこと。)
Variant 作り¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Payload 用の Stage ができたら、その中に VariantSet を作り、
ジオメトリのレイヤーを VariantSet で切り替えできるようにします。
今回は、指定フォルダ以下にあるレイヤーを切り替えできるようにする
感じで処理をするので、モデルの置き場所を指定して
Asset 以下にコピーしたうえで VariantSet を作ります。
(この辺りはお好みで)
実行すると、このようなレイヤーが出来上がります。
payload.usd を usdview で確認すると、こんな感じになります。
RootPrim に VariantSet が追加され、指定フォルダ以下の Layer が Variant で切り替えできるようになります。
Inherits 作り¶
次に Inherits するためのレイヤーを用意します。
Reference は指定 Prim に対して Reference する Layer の Path(あるいは SdfPath)を指定しますが
Inherits は、SdfPath を指定します。
そのため、Inherits 用の ClassPrim を別レイヤー化したい場合は、
SubLayer と組み合わせる必要があります。
1 2 3 4 5 |
|
こんな感じで、 class ( Specifier は class ) だけを定義した別レイヤーを作成します。
このように分けておけば、あとで継承した Prim に対して何かしたい場合は
このレイヤーを編集すれば OK になります。
メインの Layer を作る¶
最後に、実際にレイアウトなどで配置するときに読み込む Layer を作ります。
レイヤー名は、アセット名になるようにして
これまで作成した Layer を読み込みつつ、AssetInfo と Kind を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
完成した USD ファイルを usdview で開いてみます。
Composition を見ると、Root になる sampleAssets には SubLayer Inherits Payload Variant
Geom には Reference と、(Specialize を除いた)5つのコンポジションアークを使用した
アセットが出来上がりました。
Meta Data を確認すると、 variant assetInfo kind が指定されています。
まとめ¶
以上、Python を使用して Asset のセットアップでした。
このように Python で書くと、どこで何をして、最終的にどうなるのかが
わかりやすくなるのではと思います。
https://fereria.github.io/reincarnation_tech/60_JupyterNotebook/USD/CompArc/usd-comp-arc/
今回は Notebook で書いたのですが、実際に使う場合は
関数化して、コマンドラインツール化して各種自動化と組み合わせると良いかと思います。
公式のリポジトリの
USD/extras/usd/examples/usdMakeFileVariantModelAsset/usdMakeFileVariantModelAsset.py
に、今回書いた内容のコマンドラインツールのサンプルがあるので
合わせて確認してみてください。