LOPs 導入チュートリアル1: アセットの生成


この記事では、LOPsにおける、アセットの生成方法について解説します。

このチュートリアルでは、アセット部門として簡単なアセットを作成します。
アセットデータは様々な形で提供が行われる為、Houdini標準のbgeo形式以外の形式で提供されることも多々あるでしょう。
このチュートリアルでは.obj形式の樽をインポートしていきます。今回の樽のアセットにはテクスチャが含まれている為、テクスチャも一緒にインポートします。

樽をインポートし、ファイルの修正を行った後、シェーダを実装してUSDに対応させていきます。次に、アセットのバリエーションをバリアントセットとして含むUSDファイルの生成及びエクスポートを行います。

念のため、作業中には頻繁にファイルを保存するようにして下さい。

 

Houdiniにアセットをインポートする

  1. Houdiniで新規シーンを作成します。
     
  2. DesktopSolarisに変更します。
    DesktopにSolarisがない場合は、Scene Graph Treeペインを作成してください。
     
  3. /obj階層でtabメニューからFileを選択するとGeometryオブジェクトが作成されます。名前を Source に変更します。
    この中で、樽のアセットをインポートします。
     
    ※注意※
    パイプラインによっては、USDを直接インポートする場合があります。その場合はこちらの手順はスキップされます。
     
  4. Sourceノードをダブルクリックするか、選択してEnterキーを押し、中に入ります。
    ここに、ダウンロードしたLOPsサポートファイルからファイルをロードします。
    まだダウンロードされていない場合は、こちらのページを参照してダウンロードしてください。

     
  5. 中に入っているFile SOPを編集します。
    Geometry Fileを   $HIP/LOPS_DEMO_FILES/BaseGeo/repacked_BarrelWithLid_UV.obj に変更します。
     
  6.  Match Size SOPを追加し、プロップがWorldの中央に配置されるようにします。
    Translateチェックボックスにチェックが入っていることを確認します。
    Translate0, 0, 0であることを確認します。
    Justify YMin に設定します。
     
  7. Null SOPを追加し、名前を OUT_BARREL に変更します。
      
    Node Infoを確認すると、アセットに側板(Barrel)、蓋(Lids)、帯鉄(MetalStraps)を識別するためのグループがあることがわかります。

 

アセットをLOPsにインポートする

  1. /obj階層から、/stage階層に移動します。
    ※従来のネットワーク同様にLOPネットワークを任意階層に作ることは可能です。今回は単純化のために/stage階層で作業を行います。
     
  2. SOP Import LOPを作成します。
    SOP Pass/obj/Source/OUT_BARREL に設定します。
    ジオメトリはLOPsに呼び出されると、プリミティブ(または「プリム」)と呼ばれるようになります。この定義はHoudiniのプリミティブの従来の定義と異なるものとなりますので、注意してください。
     
    Load as Reference
    チェックを入れます。
    リファレンス(参照)は、最も一般的なコンポジションアークの1つであり、一般に、アセットやプロップをステージに構成するために使用されます。リファレンスはインスタンス化のようにも見えますが、実際には明示的にインスタンスとして設定しない限り、インスタンス化はされません。
    リファレンスは、シーンディスクリプションをコンパクトに再利用するための一種の「マクロ」と考えてください。リファレンスは、例えば本棚を組み立てるために利用されます。本棚と本はそれぞれ棚と本のアセットを参照します。

    Primitive Pass/Barrel/BarrelGeo に設定します。
    これは任意ですが、設定するようにすると便利です。これは、内部USDファイル構造の場所であり、これに対応するLOPシーングラフ内のこのプリミティブへのリファレンスが保存される場所です。
     
    Layer Save Passにチェックを入れ、$HIP/tutorial1/Geo/BarrelBase.usd に設定します。
    これは、このプリミティブを含む実際のUSDファイルをディスク上のどこに置くかをUSDに設定します。 これに関する更なる情報については、このチュートリアルの後半にあるUSD ROPに関する記述を参照してください。

     

  3. Scene Graph Treeペインを確認します。
    こちらでUSDステージのレイアウトを確認することができます。常にシーングラフツリーを参照して、USDステージが論理的に構成されていることを確認します。
    注:シーングラフツリーにKind項目が表示されない場合は、ギアメニューをクリックしてKindをチェックし、有効にします。


     
  4. これで、Barrelがグループとして、その下にネストされたコンポーネントBarrelGeoと共に表示されるはずです。
    これらの組織構造(アセンブリ、グループ、コンポーネント、およびサブコンポーネント)の詳細については、SideFX社用語集を参照してください。
     
  5. それでは、作成されたUSDを見てみましょう。これは、構成されたステージ(Houdiniの「シーン」)を含むコードになります。
     
  6. SOP Importノードを右クリックして、 LOP Options  -> Inspect Active Layers を選択します。

    Barrelはグループであり、その下にコンポーネントBarrelGeoがあることに注意してください。
    また、Barrelがペイロードとして追加されていることに注意してください。

 

マテリアルライブラリの追加

  1. Material Library LOPを作成します。
     
  2. Material Libraryノードを選択してEnterキーを押し、中に入ります。
     
  3. Principled Shader VOPを作成し、Barrelという名前に変更し、以下の設定を行います。
    Base Color1,1,1 に設定します。
    Roughness1 に設定します
     
  4. Texture タブに移動し、base color, roughnessmetallic の項目でUse textureチェックを入れます。
    以下の項目にパスを設定します。
    Base color texture
    $HIP/LOPS_DEMO_FILES/Library/Assets/Barrels/Textures/repacked_BarrelWithLid/repacked_BarrelWithLid_UV_<UDIM>_BaseColor.png
    Roughness texture
    $HIP/LOPS_DEMO_FILES/Library/Assets/Barrels/Textures/repacked_BarrelWithLid/repacked_BarrelWithLid_UV_<UDIM>_Roughness.png
    Metallic texture
    $HIP/LOPS_DEMO_FILES/Library/Assets/Barrels/Textures/repacked_BarrelWithLid/repacked_BarrelWithLid_UV_<UDIM>_Metallic.png
     
    ※<UDIM>の部分についてはChoose Imaseダイアログより画像を選択する際は、UDIMを指定することで、適切なパスを指定するようにしてください。

     
  5. Uキーを押すなどして、/stage階層に戻ります。
     
  6. Material Libraryノードのパラメータで、[Auto-fill Materials]ボタンをクリックします。これにより、インターフェイスにPrincipled shaderが入力されます。
     
  7. Material Library LOPにConfigure Layer LOPを追加、接続します。マテリアルの保管場所をUSDに伝える必要がありまので、Save Passにチェックを入れ、  $HIP/tutorial1/Materials/BarrelMaterials.usd に設定します。

マテリアルを樽に追加する

マテリアルライブラリができたので、プリミティブへのマテリアルの追加が行えます。 Reference LOPを使用し、Materials LOPを割り当ててマテリアルをアタッチします。 リファレンスは、シーンディスクリプションをコンパクトに再利用するための一種の「マクロ」と考えることができます。

  1. Reference LOPをSOP Importノードに接続します。
    Primitive Pass/Barrel/materials に設定します。
    前述のとおり、Primitive Passの設定は任意となりますが、設定を推奨します。 これは、樽のマテリアルを樽の下に配置するために行います。
    Reference TypeReference From Multi-input に設定します。

  2. configurelayer1Reference LOPの2番目の入力に配線します。

  3. Reference LOPPrimitive Path/Barrel/materials/materials に変更して、シーングラフで何が起こるかを確認します。
    確認後は必ず/Barrel/materials に戻してください

  4. Assign Material LOPを追加します。

  5. Scene Graph TreeからAssign Materialsノードのパラメータにドラッグアンドドロップして、次の2つのフィールドを割り当てます。
    Primitive
    /Barrel/BarrelGeo
    Material Path
    /Barrel/materials/Barrel


 

バリアントの作成

樽とマテリアルができたので、簡単なバリエーションを作成してみましょう。 今回は、ふたを非表示にすることで、ふた付きとふたなしの2種類の樽を使用できるようにします。 このためには、SOPのグループをLOPで使用可能にする必要があります。 これを行うには、既存のLOPチェーンをわずかに変更する必要があります。

  1. 以前作成したSOP Importノードに、以下の変更を行います。
    Primitive Pass/Barrel/BarrelGeo/Body に変更します。
    Parent Primitive KindComponent に変更します。
    アセットを整理する方法として、樽のパーツのコンポーネントを作成しています。
    これらの組織構造の詳細につきましては、SideFX社用語集を参照してください。

    Import Groupにチェックを入れ Barrel MetalStraps を設定します。
    右側のドロップダウンメニューを使用して、これらのグループを選択できます。

      
  2. Altキーを押しながら既存のSOP Importノードをドラッグして複製し、最初のSOP Importノードの下のワイヤにドロップします。
    Primitive Pass/Barrel/BarrelGeo/Lids に変更します。
    Layer Save Path$HIP/tutorial1/Geo/BarrelLids.usd に変更します。
    Import Groupにチェックを入れ、 Lids を設定します。
    ※この際にBarrelとMetalStrapsが含まれていないことを確認して下さい。
     
  3. Assign Material LOPの下にNULL LOPノードを作成し、名前を Barrel_W_Lidとします。
     
  4. Scene Graph Treeより、 BodyとLidが、BarrelGeo下のコンポーネントとして表示されていることが確認できます。

     
  5.  Configure Primitive LOPを2番目のSOP Importノードの下に追加します。
    Primitives /Barrel/BarrelGeo/* に設定します。
    Kind にチェックを入れ Subcomponent に設定します。
     
  6. Scene Graph Tree を再度確認します。
     
    階層がグループからコンポーネント、サブコンポーネントにどのように移動するかに注意してください。更にここからアセンブリを行うこともできますが、今回の場合はできません。恐らく10個の樽を載せたパレットがある場合、この処理はアセンブリになるでしょう。詳細については、SideFX社用語集をご確認ください。また、この階層を壊すことはできないことに注意してください。つまり、グループ、サブコンポーネント、コンポーネントを持つことはできません。

 

シンプルなバリアントを作成する

  1. Assign Material LOPの下にPrune LOPを追加します。
    Primitive PatternにScene Graph Treeから Lids をドラッグアンドドロップして設定します。
      
  2. Pruneノードにディスプレイフラグを設定します。 ふたが消えることを確認します。
     
  3.  Prune LOPの下にNullノードを追加し、名前を Barrel_No_Lid とします。
     
  4. Add Variant LOPを追加します。(-> Tabメニューから Add Variants to New Primitive を選択)
    Barrel_W_Lidを最初の入力に、Barrel_No_Lidを2番目の入力に配線します。

     
  5. Add Variantノードを右クリックし、 LOP Options -> Inspect Active Layer を選択して、USDコードを確認します。

これらのLOPsネットワークによって、ふたのない新しい樽のアセットを作成することができました。しかし、この手法は効率的ではありません。今回の場合は単純なオブジェクトですので、それほど問題ではありませんが、もっと複雑かつ多くのアセットを利用する場合、もっと効率的な手法が求められることでしょう。そのような手法を以下に記載します。

 

Context Option Blockを用いてバリアントを作成する

  1. Tabメニューより Add Variants to existing Primitive block を作成します。
     
  2. variantblock_endノードを選択します。
    Primitive PathにScene Graph Treeから /Barrel/BarrelGeo をドラッグアンドドロップして設定します。
    これは先にBarrel_W_Lidを選択した状態でScene Graph Treeをピン止めした上で、variantblock_endノードを選択する必要があります。操作が終了したらScene Graph Treeのピン止めを解除するのを忘れないようにして下さい。
     

    Tips
    ペインを固定してドラッグアンドドロップするのが手間な場合は、Scene Graph Treeに移動し、目的のパスを選択してから、右クリック -> Copy Pathsを選択、またはCtrl+Cキーでパスをコピーし、LOPパラメータに貼り付けることも可能です。

     

  3. 図のように配線します。

    variantblock_endの第1入力は、変更したい元のアセットで、他の入力はバリアントになります。
    従って最初の入力は蓋つきの樽となり、これは変更されることがありません。
    第2入力にはPrune  LOPを使用して樽からふたを「刈り取り(非アクティブにする)」ます。ふたをScene Graph Treeから /Barrel/BarrelGeo/Lids をパラメータPrimitive Patternにドラッグアンドドロップするだけです。
    variantblock_beginノードの下にNullノードを追加して名前をLidに、Pruneノードの下にNullノードを追加して名前をNo_Lidに変更します。その後両方のNullノードをvariantblock_endの第2入力に接続します。

variantblock_endを右クリックし、LOP Actions -> Inspect Active Layerを選択して、アクティブレイヤーを検査します。 このUSDコードを以前に作成したUSDコードと比較します。 USDコードが非常にコンパクトになっていることが確認できるかと思います。 ここでは、樽全体を再度追加してから蓋を非表示にする代わりに、数行を追加して蓋のみを非表示にするバリアントを作成しています。

 

仕上げ

  1. variantblock_endの後にSet Variant LOPを追加し、デフォルトのバリアントを選択します。
    Variant Set model に設定します。
    Variant Name に右側のドロップダウンメニューからLidまたはNo_Lidを選択します。
    これがデフォルトのバリアントになります。
     
  2. Null LOPを追加し、名前を BarrelSets とします。
      
  3. Configure Layer LOPを追加し、この樽のアセットが書き込まれるUSDファイルを定義します。
    Default Primitiveチェックを入れ、右側のドロップダウンメニューから /Barrel を選択します。
    Save Path にチェックを入れ、 $HIP/tutorial1/Geo/Barrels.usd に設定します。
     
  4. USD ROP LOPを追加します。
    Output File $HIP/tutorial1/BarrelsAsset.usd に設定します。Output Processing内でOutput Processors をクリックし、Use Relative Paths が有効になっていることを確認します。
    これにより、このLOPネットワークの他のすべての場所で$HIPが使用できるようになります。 USD ROPは、$HIPへの参照についてネットワークを調べ、USDファイルを書き込むときにそれらを相対パスに置き換えます。これは実際にはUSDの非常に複雑な部分であり、新規ユーザーの混乱の原因になっております。このコントロールを使用すると、使い慣れたファイル構造で作業でき、かつ、USDフレンドリーなパスは、LOPが内部で作成されます。
     
  5. Save to Discをクリックして、USDファイルをディスクに保存します。

※LOPノードおよびUSD ROPでは、まだ存在していないディスク上のファイルへのパスを指定すると、ROPの実行時に自動でディレクトリが作成されます。

 

作成したUSDファイルをHoudiniで読み込む

  1. 何も接続されていない、Reference LOP を新に作成します。
    Reference ->  Reference File$HIP/tutorial1/BarrelsAsset.usd を設定します。先ほどのノードチェーンの最終結果が出力されていることが確認できるかと思います。
     
  2. Set Variant LOPを追加して、表示するバリアントを選択します。
    Primitives にScene Graph Treeから /Barrel/BarrelGeo をドラッグアンドドロップして設定します
    Variant Set model に設定します。
    Variant Name に右側のドロップダウンメニューから表示したいバリアントを選択します。

 

USDファイル構造の検査

USDファイルを保存したディレクトリを確認します。 次の5つのファイルが表示されるはずです。

├── BarrelsAsset.usd
├── Geo
│   ├── BarrelBase.usd
│   ├── BarrelLids.usd
│   └── Barrels.usd
└── Materials
    └── BarrelMaterials.usd

 

トラブルシューティング

  • Reference LOPを使用してUSDをHoudiniに戻しても、LOPチェーンの最終ノードと同じ結果が表示されません。
    上記ファイル構造に5つのファイルが存在しているかご確認ください。
    そうでない場合は、複数のLOPノードに同じファイルパスを配置した可能性があります。 これにより、これらのファイルは互いにストンプします。

  • 樽にマテリアルがアサインされていません。
    シェーダのファイルパラメータで適切なUDIM構文が使用されているかご確認ください。 マテリアルライブラリのセクションとノードの警告を確認してください。