Skip to main 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 を追加して

s@path = "/sampleSdfPath/Cube";

path を追加します。

こうなって

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

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 回り?