この記事では、HoudiniがSOPジオメトリをUSDに変換する方法と、プロセスを制御する方法の詳細について紹介します。
概要
- SOP Import LOPは、SOPジオメトリをLOPネットワークのUSDステージにインポートします。 ジオメトリの変換方法に関する設定があります。
- USD Configure SOPは、SOP Import LOPの設定に対応するSOPジオメトリのアトリビュートを作成します。
各アトリビュート(存在する場合)を使用するようにLOPを設定したり、対応するアトリビュートをオーバーライドするパラメータをLOPに明示的に設定したりできます。 - SOP Import LOPおよびUSD Configure SOPのパラメータに加えて、以下で説明するさまざまなSOPアトリビュートを使用して、インポータがジオメトリを変換する方法に影響を与えることができます。
階層
SOPレベルでは、Houdiniジオメトリには基本的に階層関係がありません。(Houdiniでは、モデル間の階層関係はオブジェクトレベルで定義されます。)
パスを定義するアトリビュートがない場合:
- すべてのポリゴンフェースは、mesh_0と呼ばれる単一のポリゴンメッシュに入ります。
- 同等のUSDプリミティブ(SphereやVolumeなど)を持つSOPプリミティブは、自動生成された名前(sphere_0、volume_0など)を持つ兄弟としてインポートされます。
パックプリミティブやAlembicプリミティブなどの一部のジオメトリタイプには、階層内の位置を指定するアトリビュートが含まれている場合があります。これらが存在する場合、インポータはそに従います。
また、ジオメトリをUSDにインポートするときに階層関係を制御するために、SOPにアトリビュートを追加することもできます。 [Path attributes]パラメータを使用すると、パス情報を含むSOPプリミティブアトリビュートのリストを指定できます。
インポートされるプリミティブにパスプリミティブがないと、自動的に名前が生成されます。自動的に生成された名前(mesh_0など)がある場合、またはパスプリミティブがあるが、パスが相対パスの場合は、ノードは名前またはパスフラグメントに自動的に接頭辞(prefix)を付けます。これには[Import path prefix]のパスを使用します。
これは、「パスのない」プリミティブを単一のブランチの下に整理する方法です。
たとえば、Import path prefixを/world/geoに設定します。
その際に、異なる名前/アトリビュート値を持つプリミティブは、以下の表のようにシーングラフツリーにマッピングされます。
Name/attribute value | Import path prefix | Imported at |
mesh_0 | /world/geo | /world/geo/mesh_0 |
/moon/crater | /world/geo | /moon/crater |
chair/leg | /world/geo | /world/geo/chair/leg |
-
アトリビュート値の無効なパスまたは文字は、有効なパスに変換されます。 これには通常、不正な文字をアンダースコアに置き換えることが含まれます。
-
互換性のないジオメトリタイプのパスアトリビュート値が同じ場合、接尾辞として番号を付与することで、一意の名前を付けます。
たとえば、sphereとポリゴンメッシュの両方を/foo/barに配置しようとすると、インポータは/ foo/bar_0 と/foo/bar_1 のように、異なる名前の2つのプリミティブを作成します。
ボリューム
-
デフォルトでは、すべてのSOPフィールドは単一のvolume_0プリミティブの下にインポートされます。
- usdvolumepathという名前のSOPアトリビュートをボリュームに割り当てて、ボリュームのフィールドをインポートするためのUSDシーングラフパスを指定できます。
- フィールドがボリュームの下の既存のフィールドと同じ名前の場合、インポータは新しいボリュームプリミティブ(volume_1など)を開始して、そのフィールドと後続のフィールドを保持します。
これは、2つのPyroシミュレーションが一緒にマージされた場合、インポータは2つの別々のボリュームプリミティブの下で密度、速度、温度フィールドの2つのシーケンスをグループ化します。
SOPパックプリミティブ
- パックプリミティブをポイントインスタンサーとしてインポートするように設定すると、SOP Primitive stringアトリビュートをusdinstancerpathという名前のパックプリミティブに割り当てることができます。 アトリビュート値は、作成するインスタンサーのUSDシーングラフパスを指定します。
- SOPパックプリミティブには、固有のLOD可視性設定があります。(たとえば、Packed Edit SOPでDisplayを “Hidden”に設定する) インポータは、この設定を自動的にUSD visibility メタデータに変換します。
サブディビジョンサーフェス
- [Treat Polygons as Subdivision Surfaces]パラメータを使用することで、すべてのポリゴンにサブディビジョンを適用する代わりに、osd_scheme Primitive string SOPアトリビュートの値に基づいて面を選択してサブディビジョンを適用できます。
設定可能な値は、catmullClark、loop、bilinear、またはnoneです。
(USD Import SOPは、USDをSOPにアンパックするときにこのSOPアトリビュートを作成し、USDへの往復をサポートします。)
- ポリゴンをサブディビジョンサーフェスに変換する場合、インポートでは、creaseweight、cornerweight、osd_vtxboundaryinterpolation、osd_fvarlinearinterpolation、osd_trianglesubdiv、subdivision_hole primitive group など、Subdivision SOPで認識されるSOPアトリビュートも使用できます。)
アトリビュートの変換
- 以下の一般的なHoudiniアトリビュートのいずれかをインポートする場合、インポータはそれらを対応するUSDアトリビュート、またはprimvarsに自動的に変換します。
- P
USDのポイントアトリビュートになります。 - N
USDの法線アトリビュートになります。 - v
USDの速度アトリビュートになります。 - w
USDのangularVelocitiesアトリビュートになります。(ポイントインスタンサープリミティブを作成する場合のみ) - id
(ポイントまたはポイントインスタンサープリミティブの)USDのIDになります。 - uv
Translate UVアトリビュートのSTパラメータ設定によっては、primvars:stになる場合があります。 - Cd
USDのprimvars:displayColorです。 - Alpha
USDのprimvars:displayOpacityです。 - width, widths, pscale
これらはすべてUSD widthsアトリビュートに変換できます。
- P
-
Houdiniは配列アトリビュートをサポートしますが、配列アトリビュートはUSDで同等のネイティブ表現を持ちません。
配列アトリビュートfooでジオメトリをインポートすると、インポータは以下の2つのUSD primvarsを作成します。
foo(すべての配列を連結して作成されたリスト)
foo:lengths(配列の長さのリスト)たとえば、バー配列アトリビュート値[1,5]および[2,6,8]を持つ2つのポイントは、下記の2つのprimvarsとして変換されます。
bar = [1,5,2,6,8]および、 bar:lengths = [2,3]
その他の特別なSOPアトリビュート
- usdvisibility Primitive string SOPアトリビュートを作成することで、対応するUSDプリミティブの可視性メタデータを制御できます。値はinvisible またはinheritのいずれかある必要があります。
インスタンサを作成すると、この可視性情報はinvisibleIds USDアトリビュートに変換されます。
- USD Configure SOPは、インポータ設定を表すSOPジオメトリにアトリビュートを作成できます(このノードでパラメータをオンにすることでオーバーライドできます)。グローバル(Detail)レベルでusdconfigureotherprims SOPアトリビュートにその他のプリミティブを変換する方法の設定を保存できます。
プリミティブレベルまたはポイントレベルでusdconfigureotherprims SOPアトリビュートを作成する場合、この設定をプリミティブごとに指定できます。
- SOPのポイントにusdprimtype Point string アトリビュートがある場合、USDプリミティブとしてインポートされます。インポータは、ポイントの位置と標準のインスタンス化の向きのアトリビュートを新しいプリミティブのTranslateに変換します。ポイントにusdkind string アトリビュートもある場合、プリミティブの種類(Kind)として使用されます。
これを使用して、SOPのUSDプリミティブの階層を、path、usdprimtype、およびusdkindアトリビュートを持つポイントとして表すことができます。
パラメトリックな形状
- インポーターは、Houdini SphereプリミティブをUSD Sphereプリミティブに変換します。
- エンドキャップをオンにしてHoudini Tubeプリミティブをインポートし、positive end のradiusが0の場合、インポータはそれをUSD Coneプリミティブに変換します。
エンドキャップをオンにしてテーパーを付けずにHoudini Tube プリミティブをインポートすると、インポータはそれをUSD Cylinder プリミティブに変換します。
その他の構成のTubeプリミティブは、subdivision meshに変換されます。
Tips and notes
- Houdiniが左向きのメッシュであるのに対し、USDはデフォルトで右向きのメッシュになります。 メッシュが右向きの場合は、SOPでジオメトリを変更するときには[Reverse Polygon Vertex Ordering ]をオンにします。
- SOPジオメトリをUSDに変換するときは、できるだけ効率的になるようにしてください。 デフォルトでは、アトリビュートはタイムサンプリングされますが、アトリビュートを「Set Default Values」に追加することで、タイムサンプリングされないアトリビュートを指定できます。
またTopology Attributesを「Static」に設定して、時間以外のサンプリングアトリビュートを取得することも忘れないでください。
USD(特にHydra)は、タイムサンプルが1つしかない場合でも、値がタイムサンプリングされるとより多くの作業を行います。 小規模なセットアップではおそらく大きな違いはありませんが、大きなシーンでは間違いなく影響が出てきます。