SOLARISの sopimportを攻略する
Houdini Advent Calendar 2022 は、SOLARIS のノード「sopimport」の使い方を、できる限り調査していきたいと思います。
sopimport ノードとは¶
sopimport ノードは、その名の通り SOP で作成したジオメトリを LOP の世界に持ち込むことができるノードです。
このノードを使用することで、SOP の usdexport ノードでファイルを出力することなく
シームレスにジオメトリデータを LOP に持ち込むことができます。
似たようなことを、 SOPから無理やりデータを持ってくる こちらの記事で実行していますが
こちらはかなりイレギュラーな手段で、
Python ノードを使用して自力で Prim を生成していますが、
ことジオメトリに関して言えばこんなめんどくさいことをせずに
ほぼだいたいのことを sopimport ノードを使用することで実行できます。
基本¶
まずは基本的な使い方。
SOP Network を作成し、
シンプルな Pighead モデルと OUTPUT ノードを作成します。
SOP Path を、sopnet 内の OUTPUT になるようにしておきます。
まずはこれで Mesh を持ち込むことができます。
この時の importPrimitive は、デフォルトでは sopimport ノード名になっています。
無事ジオメトリが持ち込み出来ました。
Reference¶
基本的な持ち込み方法では、データはそのままメモリ上のレイヤーにインポートされ、
レイヤーを分離して保存したとしてもサブレイヤー扱いになります。
そうではなく、Reference で持ち込みたい場合は Load As Reference にチェックをいれます。
この場合、Layer Save Path で指定したレイヤーを「Reference」でロードするようになります。
サブレイヤーとは違い、SOP 側で作成したジオメトリと階層構造を
指定のパス(PrimitivePath)に読み込むことになるのが大きく異なります。
Copy Contents into Editable Layer¶
sopimport でモデルを読み込もうとした場合、そのままだと Warning が表示されます。
出ていてもモデルは持ち込めますが、Warning を確認します。
sopimport で SOP からインポートした場合、レイヤーが保存されてないよ。
SOP ノードのレイヤーは、その Houdini のパスあ k ら生成された
ファイルパスに出力されるよ。
ということのようです。
SOP と LOP の行き来をテストしていたときに気が付いたことですが
LOP Node には Editable Stage と Stage と 2 種類取得方法があります。
SOP から LOP のノードにアクセスしようとした場合、
取得は可能だが変更不可な read-only の stage として取得できます。
ということを踏まえて、現状だと read-only の stage として取得されてる
状態なので、変更可能な保存先に入れておいてね?ということだと解釈して
Copy Contetents into Editable Layer オプションを押して
現在の LOP 側の EditableLayer(編集可能レイヤー)に構造をコピーして
LOP のレイヤーとして扱うことにすれば、Warning は消えます。
Group¶
Import 時の指定だと、ある SOP のノードを指定して
その段階の Geometry を取得していますが、そこから条件を指定して
一部だけ読み込みたいケースもあるでしょう。
その場合、SOP の Group を指定して一部だけ持ち込むことができます。
Import Group で、SOP 側で指定した Group を指定すると、
指定した Group のモデルだけを LOP 側にインポートできました。
SubsetGeom¶
SubsetGeom とは、USD で Face 単位のマテリアルアサイン等をするときに使用するものです。
詳細は UsdPreviewSurfaceを使う このあたりに書いたので合わせてみてもらえればですが、
Subset Groups で、SOP 側の Group を指定すれば、
GeomSubset が作成され、Group で指定した Face に対してマテリアルアサインを
するなどが可能になります。
Point¶
デフォルトで SOP から持ってこれるのは Primitives ですが、 Import Group Type で「Points」を選ぶことで、Point としてもインポートが可能です。
Points として読み込むと、UsdGeomMesh ではなく UsdGeomPoints として読み込むことができます。
表示した結果。
Path 指定¶
特に何もせずにインポートすると /nodename/mesh_0 のような名前で Mesh が生成されますが PackedPrimitivesとUSDExport このあたりは、SOP の USDExport ノードのルールと同様に、
指定の Attribute を指定することで SOP 側で指定することができます。
AttributeWrangle を作成し、
GroupType を Primtives に変更し、
path アトリビュートに、LOP 側の SdfPath を指定します。
こうしておくと、 sopimport で LOP に読み込んだ時の SdfPath を
SOP 側でコントロールすることができます。
Instance¶
次にインスタンスを作成したい場合。
インスタンスを使うには、PackedPrimitives を使用します。
SOP の Copy and Transform ノードで「Pack and Instance」で複製してみると、
インスタンスのもとになっているジオメトリは「Prototypes」として作成され
青文字になっている部分はインスタンス扱いとして作成されます。
PackedPrimitive になっているものはインスタンス扱いになりますが
sopimport の Packed Primitives でどのように持ち込むかを変更できるので
あえてインスタンスにしたくない場合だったり、PointInstancer で持ち込みたい場合は
設定で変更が可能です。
Layer Save Path¶
sopimport で SOP から持ち込まれるデータは、基本的にジオメトリオブジェクトです。
ので、この部分だけを別レイヤー扱いにしておいたほうが都合がよいので、
sopimport で、レイヤーパスを指定します。
Layer Save Path に、保存先を指定すると、
USD ROP ノードを作成します。
その結果、sopimport 段階のデータとそれ以外とでレイヤーを分離できます。
これで USD への出力がコントロールできました。
Attribute¶
SOP では、各頂点や Primitives に対して GeometrySpreadSheet で Attibute をつけることができます。
特に指定がない場合は、USD の Attribute としては持ち込めませんが
sopimport の USD custom Attribute で読み込みたい Attribute を指定できます。
アスタリスクの場合は、どんなアトリビュートでも全部持ってくるという意味になりますし
usd*のようにすると、頭が usdのアトリビュートのみを USD のアトリビュートとして
インポートできます。
れいとして、これは usd_*でインポートした場合。
で読み込んだ場合。
だとより多くのアトリビュートが持ち込めているのがわかります。
Point の場合¶
先ほどの例は Primitives に対してのアトリビュートでしたが
Point に対してもアトリビュートが付加できます。
試しに、全頂点にランダムな値を入れておきます。
これを持ち込んだ結果はこちら。
primvars として頂点分の配列を持ち込むことができました。
この rpimvars とは primitive variables の略で、
Primtives の各頂点単位で指定され、主に material などで頂点間で値を補完して扱うものです。
例えば、SOP 側で Color ノードを使用して頂点カラーを指定した場合。
displayColor としてインポートされます。
各頂点ごとに指定された値によって、間の Face カラーは補完されて表示されます。
といった感じで、SOP 側で頂点に対して指定した値は primvar として出力され
自由に扱えるようになるというのがわかりました。
primvar はデフォルトだと全部インポート扱いになっていますが
Attributes で、Primitives 同様に持ち込むパラメーターを制御できます。
アニメーション¶
SOP 側でアニメーションを追加した場合は、デフォルトで SOP 側に TimeSampling が追加されます。
USD ROP が、デフォルトだと単一フレームなので、 Valid Frame Range を
Render Specific Frame Range に変更すれば、アニメーション付きで Export できます。
まとめ¶
この記事を投下する前に SOPにLOPを持ち込もう や SOPから無理やりデータを持ってくる のようなトリッキーな手法を書いてしまったのですが
多くの場合はそんなことをせずに、sopimport ノード1つで
たいていのデータは LOP に持ち込み、そして USD アセットとして扱えるようになります。
SOP のプロシージャルモデリングと、TOP を使用してのバッチ処理
LOP を使用しての USD のセットアップを組み合わせれば
大量委のアセットをまとめて USD 化なども簡単にできるので
ぜひとも Houdini を活用して
大量のアセットを作成していけるといいなーと思います。
今回は取り上げませんでしたが、Agent(Skel 周り)や Curve 周りなども
持ち込んだり、
Scene Import LOP object translator plugin のような、さらに痒い所に手が届く機能もあるので
今回書けなかった部分も含めて検証を進めていければなーと思います。