SOPジオメトリをUSDにインポートする


この記事では、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アトリビュートに変換できます。  
        
  • 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つしかない場合でも、値がタイムサンプリングされるとより多くの作業を行います。 小規模なセットアップではおそらく大きな違いはありませんが、大きなシーンでは間違いなく影響が出てきます。