メインコンテンツまでスキップ

SOPImportの基本設定

Image from Gyazo

SOLARIS には、sopimport というある意味 Houdini で USD を扱う場合に最重要となる「SOP のデータを USD に持ち込む」ためのノードが用意されています。

SOP と LOP は別空間ではあるものの、このノードを介することで相互に行き来が可能になるため
Houdini + USD の利便性やイテレーションの向上に大いに寄与してくれるノードではあるのですが
その設定が多く、どのような仕様になっているのか私自身も正しく理解できていないところがありました。

ということで、今回は sopimport の挙動を基本的なところから確認しつつ
USD の仕様を確認していきたいとおもいます。

基本的な使い方

Image from Gyazo

最も基本的な使い方は、 SOP Import の SOP Path に読み込みたい SOP ノードを設定するだけです。
これを指定することで、SOP 側のジオメトリを LOP の世界に読み込むことができます。

Image from Gyazo

この結果、SOPImport のノード名の Xform の下に mesh_0 という名前の MeshPrim が作成されました。
Image from Gyazo この「sopimport1」の部分は、Import Path Prefix の部分で決まっていて、デフォルトだと /$OS という自身のノード名が指定されていますが、変更すれば固定の名前にすることが可能です。

MeshPrimName を SOP で決める

まず、最初にやりたくなるのは、MeshPrim の名前や、MeshPrim の分割をどう分けるか?なのではないでしょうか。

Image from Gyazo

その指定は、SOP 側の Primitives の path あるいは name アトリビュートです。

Image from Gyazo

Image from Gyazo

name の場合は、LOP に持ち込まれたときは name アトリビュートで指定したものになりますし、path の場合は Prim のパスを指定することができます。

Image from Gyazo

SOP 側で作成したジオメトリを、複数の Prim に分割したい場合も
name を Primitives のアトリビュートに指定することで、その name ごとの Prim に切り分けることができます。

部分的な読み込み

デフォルトの状態だと、SOP 側のジオメトリはすべて LOP 側に読み込まれてしまいますが
Group を設定することで、指定の Group に属した Mesh だけ LOP に読み込むことができます。

Image from Gyazo

例として、group1 を作成して、Cube と Sphere のうち Cube だけをそのグループに入れておきます。

Image from Gyazo

Import Group で SOP 側の Gorup を指定すると、

Image from Gyazo

その Group に属した Mesh だけが読み込まれます。
この例だと、name = group になっていますが、もちろん cube sphere の一部分の Face だけ読み込むようなことも可能です。

Mesh or Points

ここまで Mesh を LOP にインポートしてきましたが、Mesh だけではなく Point も LOP に持ち込むことができます。
では、どのようなパターンで Points でどのようなときに Mesh になるのか見ていきましょう。

Points

基本的には Mesh で出力される方が多いので、どういうパターンで Points になるのか見ていきましょう。

Image from Gyazo

Points になるのは、SOP 側がその名の通り Points にのみデータを持っているケースで
この場合は、SOP 側の Point が、USD の PointsPrim としてエクスポートされます。
name / path の指定は Mesh と同様で SOP 側の PointAttribute に対して name または path を指定することで、Prim を分割したり名前を変更することができます。

Mesh

基本的には、Points で示したような SOP 側で Points を作った例を除けば
それ以外は Mesh 扱いになります。

Image from Gyazo

例として、CopyToPoints で Point に対してジオメトリを配置したような場合。

Image from Gyazo

この場合は、1つの MeshPrim として LOP にインポートされます。

Image from Gyazo

Point と Mesh をマージしたものを読み込んだ場合は、

Image from Gyazo

両方がそれぞれのノードで出力されます。

Instance

CopyToPoint を使用する場合も単体の Mesh で出力されていましたが、
多くの場合 CopyToPoint を使う時はインスタンス配置として Usd の NativeInstance か PointInstancer で出力されてほしいかと思います。
ので、単一の Mesh や Points を Prim として出力するパターンを確認していきます。

PackedPrimitive

まず、LOP 側の NativeInstance の構造に対応する SOP の構造がなにか?というと、
それは「Pack」です。

Image from Gyazo

SOP 側で Pack をした状態で LOP に持って行くと、

Image from Gyazo

このように、Prototypes という形で Mesh が出力され、
その Mesh を InternalReference(ファイル内のリファレンス)でリファレンスして、
instanceable=True の形で出力をします。

今回の例だと、1 つしか Mesh がないので、1Reference1Mesh になっています。

Image from Gyazo

この Pack したオブジェクトを、CopyToPoint で Point に対して配置します。

Image from Gyazo

すると、このように、Point 分に配置された NativeInstance が出力されます。

PointInstancer

Image from Gyazo

デフォルトでは NativeInstance でしたが、これを PointInstancer で出力したい場合はどうするかというと、

Image from Gyazo

Packed Primitives の項目を Create Xform から Create PointInstancer に変更します。

Image from Gyazo

すると、このように PointInstancer の形式で LOP に持ってくることができます。

Attribute

Mesh,Instance の次は、Attribute です。
LOP では、SOP で指定した Attribute を Prim の Attribute としてインポートすることができます。
なにをどう持ってくるかは SOP Import の Import Data で指定が可能なので
よく使うものから順にみていきたいと思います。

デフォルトの挙動

まず、Attribute を持ってくる場合は
Mesh として持ってきたい場合は PrimitivesAttribute、Points として持ってきたい場合は PointAttribute に値を指定します。

Image from Gyazo

Primitives に hoge Attribute が指定されていたとします。

Image from Gyazo

これをデフォルトの状態で出力すると、 primvars としてパラメーターが出力されます。
これはどういうことかというと、SOP の Primitive は、LOP がわの Face にあたるため
Mesh に対して1つのパラメーターが設定された というわけではなく、
「各 Face ごとに別の値が入っていて、たまたま同じ値が入っていた」
という解釈で読み込まれているわけです。

Image from Gyazo

なので、このように 1Mesh(同意 name が指定されている Primitives)に別の hoge アトリビュートがある場合などは、

Image from Gyazo

hoge には SOP 側で指定されている文字列パターンと、その Indices が LOP 側にインポートされます。

デフォルトでは primvar になりますが、そうじゃないケースはどうすればいいかを順にみていきます。

CustomAttribute

Primvar ではなく、すべてに単一の同じ値がセットされているとして
固定のアトリビュートとして出力したい場合は以下のようにします。

Image from Gyazo

まず、Primvar ではなくアトリビュートとして定義したい場合は USD Custom Attributes に、アトリビュートにしたいものの名前(今回の場合 hoge)を入れます。

Image from Gyazo

その場合、hoge は配列で SOP 側にセットした数だけ配列で値が列挙されます。

Image from Gyazo

そうではなく String としたい場合は、 Import as Single Value をオンにして、そこに配列ではなく通常の値で読み込みたいアトリビュート名を入れます。

Image from Gyazo

要素は 1 つだが Array にしたい場合は、 Import as Single Element Array をオンにします。

Image from Gyazo

この場合、配列の要素は 1 つだけのアトリビュートとして読み込まれます。 Import as Single Value と Import as Single Element Array 両方が ON の場合は、配列扱いになるようです。

Image from Gyazo

両方 OFF の場合は、Primvar ではなく、通常のアトリビュートの配列で
SOP 側の Primitives の値がそのままインポートされます。

Attribute の型

USD のアトリビュートの型は、ある程度 SOP 側の型準拠で自動でインポートされます。
これまでの例だと、SOP 側を string で定義していたので、USD 側も string でしたが

Image from Gyazo

SOP 側が int であれば、LOP 側も int 扱いになります(配列の場合は int の配列)
ですが、場合によっては別の型にしたい 例として SOP 側は int、USD 側はそれを Bool 扱いにしたい場合があります。

Image from Gyazo

そういった場合は、 Boolean Attributes に Bool 扱いにしたいアトリビュート名を入れると、

Image from Gyazo

LOP 側は Bool アトリビュートとしてインポートできます。
同様の挙動が Unsigned 32-bit / Unsigned 64-bit 等の設定になります。

GeomSubset

Attribute として LOP にインポートする以外に、特定の処理をするために
SOP 側のアトリビュートを使用したいパターンが、この GeomSubset です。

SOLARIS 上での GeomSubset の作り方は、以前 こちらにまとめているので詳細は割愛しますが
SOPImport では、この GeomSubset を SOP の Attribute を指定することで作成することができます。

Image from Gyazo

それが、Subset Attributes で、同一 Mesh に複数マテリアルを指定したいとき用に指定する GeomSubset の指定を定義した Attribute を指定して、

Image from Gyazo

その情報をもとに、このように GeomSubset としてインポートすることができます。

Material

最後にマテリアル周りのインポートを確認していきます。

Image from Gyazo

SOPImport には、 BindMaterials という項目があり
この設定を切り替えることで SOP の情報をもとに BindMaterial を作成することができます。

この値は、SOP 側のマテリアルアサイン(shop_materialpath ) とは別で、
SOP 側で、usdmaterialpath アトリビュートを指定することで動作します。

Image from Gyazo

まず、Primitives アトリビュートに対して、usdmaterialpath を指定します。
個々には USD 側の Path 形式か、/を入れず material 名(上の画像なら testMat )のように指定できます。

Image from Gyazo

名前をもとに、資金で MaterialPrim を作成&アサインしたい場合は
Create and Bind Materials Based on Imported Attribute を指定します。

Image from Gyazo

すると、このように usdmaterialpath で指定したパスに MaterialPrim を作成できます。

Image from Gyazo

Mesh 側には、自動でこの作成したマテリアルがバインドされます。
BindMaterial の場合は、すでに LOP 側でマテリアルがある想定で、既存の MaterialPrim に対してマテリアルのアサインを行います。 指定したマテリアルが存在しない場合は、何も起こりません。

shop_materialpath の扱いはどうなの?というのは、公式 HELP に

shop_materialpath SOP アトリビュートからシェーディング用またはジオメトリサブセット用の USD Primvars を生成することができます

とあるので、対応する USDMaterial を作りつつ
この primvar の情報をもとに LOP 側で再構築するのかな?とおもいます。 (が、あまり SOP でのマテリアルアサイン事情に詳しくないので間違ってたらすいません)

まとめ

これ以外に over か define かとか、Animation,Curve,等他のアセットの扱いなど
Primitive Definition 系はまだ設定があるのですが今回はこのあたりまでにしておこうと思います。

それぞれの要素だけでも調べることは多いので(特に Animation 等)
そこはまた続きの調査記事をまとめていきたいと思います。

今回の内容で、SOP 側で作成したジオメトリやアトリビュートを
適切な形で LOP 側に読み込むための設定箇所は抑えたと思うので
データ作成時の SOP 側の設定、SOPImport の設定の参考にしてください。