Skip to content

PackedPrimitivesとUSDExport

普段はLOPを使用してUSDを扱っていましたが、
SOPからもUSDの出力ができるというのと、HoudiniのPackedPrimitivesについて教えてもらったので
SOPの勉強とデータの構造を理解するのを兼ねて
SOPのUSDExportを試してみようと思います。

基本

まず、SOPには「usdexport」ノードがあります。
ので、このノードに接続するとUSDを出力することができます。

シンプルなキューブをOutputFileのみを指定して出力すると、

この場合、

Relative Path Prefixの指定(この場合、usdexportのノード名)のXform+mesh_0という名前のMesh
が出力されました。

SOPのGeometry以下は、Mayaでいうところ1つのMeshノードのような扱いなので
出力されるUSDファイルは、1つのUSDファイルに対して Xform + Mesh の組み合わせで
出力されました。

確認のため、このようにDuplicateを使用してモデルを複製したのち、出力しても
1つのXform+Meshにまとめられた形で出力されます。

PackedPrimitives

次はPackPrimitiveがあった場合。
https://www.sidefx.com/ja/docs/houdini/model/packed.html
PackPrimitiveは、

パックプリミティブをコピーすると、ジオメトリ自身がコピーされるのではなく、
参照 がコピーされます

とある通り、いわゆるインスタンスです。

BoxをPackしてGeometrySpreadSheetを見ると、

Point等はパックしたジオメトリの位置情報をPointに持つようになります。

PackしたジオメトリをDuplicateして、Exportをしてみます。

結果。
青になっているのは、USDのインスタンスになっているからで
そのインスタンスの元Meshが、 Prototypes/obj_0 として出力されているのがわかります。

デフォルトではインスタンスになっていますが、USDExportの Packed Primitivesを
変更することで、実体のMeshにすることも、Point Instancerにすることも、Unpackすることも可能です。

実体化した場合は、 Relative Path Prefix 以下に obj_### で出力されます。

最後に、Unpackした場合。

Packed Primitivesがある状態で、ExportUSDでUnpackすると
Xformが作成されずに、Primitivesが個別のMeshPrimとして出力されます。

Path/Nameの指定

PackedPrimitive を使用して複製したデータを出力した場合でも
各Primitiveに名前を付けて出力したい...というケースがあると思いおます。
その場合は、指定のAttributeをつけることで
個別のPathを指定することができます。

まずは Attribute Wrangleを追加して

1
s@path = "/sampleSdfPath/Cube";

path を追加します。

こうなって

結果。
この場合は、pathがUSDのSdfPathになり、このPathに+して数字が割り振られます。

1
s@name = "hogehoge";

あるいは、 nameを指定すると、

Relative Path Prefix で指定したPath以下に name のXformが作成されます。

Mergeした場合

最後にMergeした場合を確認します。

ノードはこんな感じで、それぞれのBoxに hogehoge と fugafugaという名前を付けます。
その2つをMergeします。

SpreadSheetはこんな感じです。

結果。
それぞれのジオメトリが、別のXform+Meshの構造で出力できました。
つまりは、SOP側だけでも
pathアトリビュートあるいはnameアトリビュートを使用して USDのシーングラフを
作ることができるのがわかりました。
(それが使いやすいかは別問題として)

まとめ

もともとはSOPで使われているPackedPrimitivesとはなんぞ???
追加するとどういう意味があるんだろう???という疑問から調べ始めましたが
その挙動や、GeometrySpreadSheetを確認したときの変化
その意味するところなどが理解できました。

次はAttribute回り?