Houdini 19.5 Solaris

Solarisジャンプスタート

On this page

素晴らしい Solarisジャンプスタート チュートリアルを作成してくれたChris Rydalch氏に感謝します。

Universal Scene Description(普遍的なシーン記述)

Universal Scene Description(USD)とは、3Dのアセットやシーンを効率的に構築しコラボレーションするためのPixar社が開発したオープンソースなシーン記述フォーマットのことです。 Houdiniでは、それがLOPsで実装されています。 LOPsを介してUSDを使用することで、複数のユーザー/部署が同じシーンを非破壊的に作業することを可能にしています。 USDには、スタジオのパイプラインのためのフレームワークだけでなく、ステージ(シーン)を構築、表現、検査、編集を迅速且つ効率的にできるようにするための実際のインフラが用意されています。 USDは、Alembic、OBJ、FBXなどの他のジオメトリフォーマットとは 超越 しています。

HoudiniのライティングとルックデブのコンテキストはLOPsです。 これはLighting Operatorsの略です。 LOPネットワークはSOPネットワークに似ていますが、Houdiniのジオメトリモデルを使用するのではなくて、LOPsはUSDを使用します。

また、USDではまったく新しい語彙が導入されており、残念ながら既存のHoudini用語や従来のCG用語と場合によって意味が異なることがあります。 詳細は、用語集を参照してください。

個人ユーザーまたは小規模スタジオだと、LOPsを使用する価値があるのかどうか疑問に思うかもしれません。 これだけは言えることは、Karmaが使用できるので色々触ってみる価値があります。Karmaとは従来のIFDファイルではなくUSDを消費するHoudiniレンダラーのことです。 しかし、パイプラインやショット環境のことだけを考えると、最初のうちはぼんやりしてよく分からないかもしれませんが、一度使いこなしてしまうと、もうLOPsは必要不可欠なものになることでしょう。

PrimsとProperties(プリムとプロパティ)

USDシーンを見ると、プロパティを持ったプリミティブで構成された階層になっています。 Prim(プリム)には、Mesh、Light、Camera、Shaderなどのいくつかのタイプが存在します(USDでは、これらのタイプのことをスキーマと呼びます)。 USDを拡張することで新しいスキーマに対応させることができますが、そのコアライブラリは非常に広範囲なフレームワークになっています。 各スキーマは、各Primタイプが対応するプロパティをすべて定義します。

Primのプロパティは、アトリビュートまたはリレーションシップのどちらかを意味します。 アトリビュートとは、単に値の種類(カラー、浮動小数点、トランスフォーム行列、値の配列など)のことです。 アトリビュートは、各タイムサンプルを配列に格納することでアニメーションさせることができます。 リレーションシップは、シーン内のPrimまたはプロパティを指します。 スキーマの一部でないアトリビュートはカスタムアトリビュートになります。

USD Primsの重要な特徴は、合成ステージから永遠にPrimsを削除することができないという事です。 代わりにUSDは非アクティベーションに対応しています。これが非破壊的な削除です。 アクティベーションはそれとは逆の考えで、合成ステージでそのPrimが計算されることを意味します。

Instancing(インスタンス化)

USDは2つの形式でインスタンス化を行なうことができます。

  • ネイティブインスタンシング は、効率的にアセットのコピーをたくさん表現できるようにするために、USDに単一の“マスタープリミティブ”を生成するように命令するプロパティです。 ネイティブインスタンシングは、どのプリミティブにも設定することができ、USDは必要に応じて“マスタープリミティブ”を生成します。 USDは複数のインスタンス化可能プリミティブが“同一”であると検知すると、そのマスタープリミティブをそれらのインスタンス化可能プリミティブ間で自動的に共有します。

  • ポイントインスタンサー は、ジオメトリの膨大なコピーを効率的に表現できる特別なスキーマです。

どちらのタイプのインスタンス化も、各プリミティブのトップレベルのトランスフォームに対応しており、さらに、(各ネイティブインスタンスに対して、または、ポイントインスタンサープリミティブに対して)Primvarsを編集してインスタンス単位でマテリアルプロパティを設定することもできます。

ネイティブインスタンス は、各インスタンスの実トランスフォームで、各インスタンスはシーン内で固有のネームスペースとして表現されます。 ネイティブインスタンスは、簡単にインスタンスからヒーローに昇格することができます(単に“instanceable”プロパティを無効にするだけです)。

ポイントインスタンサー は高速ですが、すべてのインスタンスのトランスフォームは、ポイントインスタンサープリミティブ上の配列アトリビュートとして設定されます。 インスタンスからヒーローに昇格させるには、シーンをMutate(変異)させる必要があります。 ポイントインスタンスとネイティブインスタンスはどちらにもプロモートさせるLOPノードがありますが、生成させたいインスタンスの数が多いほど、たいていの場合はヒーローに昇格させるよりもポイントインスタンスのままにする方が望ましいです。

ステージの合成

USDのシーンのことをステージと呼び、単にファイルを読み込むのではなくて、USDはステージを合成します。 稀なケースですが、ステージ全体を単一の平坦なファイルに保存することがあります。 通常では、少なくとも2,3枚のレイヤー(ディスク上の各.usd/.usda/.usdcファイル)が存在し、これらのレイヤーがまとめて合成されて、ユーザー側に完全なシーングラフのビューを表示します。 合成されたステージは、Primsの階層になっていて、モデル、キャラクタ、プロップなどのすべてを表現します。

レイヤー

レイヤーには、シーングラフ内のPrimsに関する オピニオン(意見) が含まれています。 一部のオピニオンはPrimsと値を定義し、他のオピニオンは値をオーバーレイします。 レイヤーは、ディスク上のファイルから読み込んだり、または、純粋にメモリ内に存在させることもできます(このレイヤーを“匿名”レイヤーと呼びます)。

SubLayers(サブレイヤー)

サブレイヤーは、USDでよく使用するコンポジションアークの1つです。 レイヤーは複数のサブレイヤーを持つことができ、それらのサブレイヤーのリストは強い順で並んでいます。 レイヤーとサブレイヤーの順序付きリストのことをLayerStack(レイヤースタック)と呼びます。

以下にショットのレイヤーの例を載せます:

#usda 1.0
(
    subLayers = [
            @shotLighting.usd@,
            @shotFX.usd@,
            @shotAnimation.usd@,
            @shotSetDressing.usd@,
            @sequence.usd@
    ]
)

USDを使用すれば、アーティストはシーンへの寄与を編集するだけで、後はすべてのレイヤーを合成すれば良いだけです。 上記の例のアニメーションレイヤーには、アニメーションポイントとアニメーションさせたトランスフォームのみが含まれています。 レイアウトレイヤーには、トランスフォームのみが含まれていて、シーケンスレイヤーで定義されたシーケンス全体のセットの配置を調整します。 このレイアウトレイヤーには、ショット固有のモデルを入れたり、カメラまたはストーリーの要件に応じて変更することができます。

レイヤーの重要な特徴の1つは、レイヤーをミュートすることができることです。 レイヤーをミュートすると、そのステージが再合成され、ミュートしたレイヤー(s)のすべてのオピニオンは、もはやシーンに何も影響を与えなくなります。 レイヤーがショット内の何かを壊してしまった場合、または、レイヤーに何かしらの望ましくない効果があった場合、そのレイヤーはサブレイヤーのリストから削除することなくミュートにすることができます。 レイヤーをミュートするには、そのレイヤーはサブレイヤーである必要はないのですが、一般的には本番環境で最終的にミュートすることになるレイヤーです。

例えば、FXがshot.usdaレイヤーより上のレイヤーで作業した場合、ショットの再生は非常に遅いです。 この場合、そのショットを読み込んだアーティストは、単にそのshotFX.usdレイヤーをミュートするだけで、USDはそのショットを再合成しますが、そのshotFX.usdレイヤーのすべてのオピニオンは無視されます。

References(リファレンス)

リファレンスは、よく使用するコンポジションアークの1つで、通常ではこれを使ってアセットとプロップをシーン内に合成します。 サブレイヤーとは違って、リファレンスはシーングラフ内の特定のPrimパス(ネームスペース)内に合成されます。

例えば、以下は単純なゴミ箱アセットの例です:

#usda 1.0
(
   defaultPrim = "TrashCan"
)


def Xform "TrashCan" (
   kind = "component"
)
{
   def Cylinder "Can"
   {
       token axis = "Y"
       bool doubleSided = 0
       double height = 2
       double radius = 1
   }
}

以下は、セット内の3部屋でゴミ箱アセットを3回リファレンスしたレイヤーです:

#usda 1.0
()


def Xform "Scene"
{
   def Xform "Set"
   {
       def "BathroomTrashCan" (
           append references = @./trashcan.usda@
       )
       {
           double3 xformOp:translate = (2, 0, 1.4)
           uniform token[] xformOpOrder = ["xformOp:translate"]
       }


       def "KitchenTrashCan" (
           append references = @./trashcan.usda@
       )
       {
           double3 xformOp:translate = (16.01, 5, -43.072)
           uniform token[] xformOpOrder = ["xformOp:translate"]
       }


       def "OfficeTrashCan" (
           append references = @./trashcan.usda@
       )
       {
           double3 xformOp:translate = (-7.12, 0, 11.9)
           uniform token[] xformOpOrder = ["xformOp:translate"]
       }
   }
}

リファレンスは、見た目はインスタンスかもしれませんが、実際はインスタンス化されていません。 Primをinstanceable(インスタンス化可能)として宣言すれば、USDは各インスタンス間でそれらのPrimsを最適化して共有するようにします。 しかし、インスタンスリファレンスは、インスタンスルート下のPrimsに対して固有のオーバーライドを持つことができません。

VariantSets(バリアントセット)

もう1つ強力なコンポジションアークがバリアントセットです。 これは、別々のバリエーションのアセットを構築することができます。 アセットのネームスペースをそのままに色々なアセットを表現することができます。 バリアントは、それが格納可能な要素について何も制限はなく、バリアントセットは単にマテリアルを入れ替えたり、階層全体を変更することができます。 バリアントセットは、アセット上で定義する必要はなく、下流のノードで取り込むことができます。 バリアントをタイムサンプルすることはできません(つまり、アニメーションを付けることができません)。

以下は、“owner”という名前のバリアントセットを含んだレイヤーの例です。 各バリアントのカラーは、そのボールを所有するストーリー内のキャラクタに呼応しています:

#usda 1.0
()


def Sphere "toyBall" (
    variants = {
        string owner = "blake"
    }
    append variantSets = "owner"
)
{
    double radius = 1
    variantSet "owner" = {
        "andy" (
        ) {
            color3f[] primvars:displayColor = [(1, 0, 0)] (
                interpolation = "constant"
            )


        }
        "blake" (
        ) {
            color3f[] primvars:displayColor = [(0, 0, 1)] (
                interpolation = "constant"
            )


        }
        "sally" (
        ) {
            color3f[] primvars:displayColor = [(0, 1, 0)] (
                interpolation = "constant"
            )


        }
    }
}

コンポジションに関する考察

USDでのコンポジションは、非常に奥深いテーマなので、この概念が浸透し始めるまでにしばらく時間がかかることに驚かないでください。 Sublayers(サブレイヤー)、References(リファレンス)/Payloads(ペイロード)、VariantSets(バリアントセット)からかなり多くの利用価値が得られます。 すべてのコンポジションアークを理解するのも良いでしょうが、これら3つのコンポジションアークは間違いなく一番使用頻度が高いです。 しかし、コンポジションの全体像を理解しやすくするために、優先度が最も強い順で以下に(Specializesを除く)コンポジションアークの概要を載せています:

名前

説明

Layer Stack(レイヤースタック)

Layer Stackは、レイヤーのローカルオピニオンとサブレイヤーを含みます。 キャラクタアニメーションやカメラなどのショットへの寄与は、通常ではサブレイヤーに含めます。 USDドキュメントを参照してください。

Inherits(継承)

Inheritsを使用することで、デフォルト値を再定義することができますが、それはショットまたはセットのコンテキスト内に限定されます。 Inheritsはローカル参照と同様ですが、複数レベルの参照に至って“活動”させたままにすることができます。 マテリアルは“Inherits”と“Specializes”を主によく使用します。 USDドキュメントを参照してください。

VariantSets(バリアントセット)

シーンの重要な部分をMutate(変異)させる必要なく、シーンやアセットの一部の変更またはバリエーションを事前に定義することができます。 例えば、本のアセットに“タイトル”違いのバリエーションをいくつか含めることができます。 これによって、アーティストはターブル上の本のネームスペースを変えることなくその本のタイトルを変更することができます(この結果、シーン内の本の各インスタンスのライトリンクやトランスフォームなどはそのまま維持されます)。 USDドキュメントを参照してください。

References(リファレンス)

(アセットをセットに取り込むといったように)シーンの小さなユニットを大きなユニットで参照する単純な仕組みです。 Referenceは、シーン記述をコンパクトに再利用するための1種の“マクロ”と考えてください。 Referenceは、例えば本棚に本をしまう際に使用します。 本棚と本は、それぞれ本棚アセットと本アセットを参照します。 USDドキュメントを参照してください。

Payload(ペイロード)

まったReferenceと同様ですが、アンロードして最適化することができます。 そのため、通常ではアセットの非常に重い部分(つまりジオメトリ)をアセット内でPayloadとして参照します。 USDドキュメントを参照してください。

Specializes(特別化)

Inheritsと同様で、オリジナルソースを変更することなくショットやセットのデフォルト値を再定義することができます。 Specializesは、“Inheris”オピニオンをオーバーライドせずに、これらの変更を伝搬させる方法です。 マテリアルは“Inherits”と“Specializes”を主によく使用します。 USDドキュメントを参照してください。

詳細は、USD用語集のLIVRPS Strength Ordering(LIVRPS順番決め)を参照してください。

Hydra(ハイドラ)

Hydraとは、ビューポート内でシーン記述を描画する際に使用される仕組みのことです。 画像を表示するためにHydraが通信するプラグインのことを“デリゲート”と呼びます。 まるで複数の頭を持った怪物のように、Hydraは複数のレンダラーに対応することができます。 つまり、スイッチの切り替えで、いくつものレンダラーを使って合成ステージを見ることができます。 デフォルトでは、USDはhdStorm(HoudiniではHydra GL)と呼ばれるOpenGLレンダラーを使用しますが、他にもRenderMan用のレンダーデリゲート(hdPrman)やEmbreeデリゲートなどもあります。 これらのレンダラーすべてがUSDに同梱されているusdviewアプリケーションを使って表示することができます。 LOPsまたはHoudiniに同梱されているusdviewを使用すると、Karmaレンダーデリゲートも使用することができます。

明らかにUSDにはもっと多くの機能がありますが、これらの基本機能だけでもSolarisを始めるのに十分だと思っていただければ嬉しいです。 USDの詳細は、SIGGRAPH 2019 USDコースの素晴らしいPDFスライドをチェックしてください。 他にもopenusd.orgをチェックしてください。 特に用語集は、手元に置いておきたい素晴らしいリソースです。

Solaris

Houdiniの新しいレイアウト、ルックデブ、ライティングのコンテキストがLOPsです。 これはLighting Operatorsの略です。 LOPネットワークはSOPネットワークに似ていますが、Houdiniのジオメトリモデルを使用するのではなくて、LOPsはUSDを使用します。 こういった理由で、HoudiniとUSDの両方の理解が必要不可欠です。

概要

ほとんどのUSD編集アプリケーションでは、セッションレイヤーまたはEdit Targetに対して作業を行ないます。 それとは対照的に、Houdiniはプロシージャルなクックをし、USDがLOPsの言語/データであることから、LOPグラフ内で行なう事は、シーンに寄与するレイヤーの編集がすべてです。

(リファレンスまたはサブレイヤーで)ディスクからレイヤーを読み込む時、または、Cube LOPやSphere LOPなどを使ってPrimを作成する時、 LOPsは、用意したデータを格納したりアクセスできるようにそれ独自のレイヤーを作成します。 通常では一番強い暗黙レイヤーがLOPノードの書き出し先のレイヤーになりますが、LOPsはレイヤースタック内の他のレイヤーに書き出すこともできて、さらには新しい暗黙レイヤーを追加することもできます。 たいていの場合、アーティストがそれらの暗黙レイヤーについて気にする必要はありません。 “ディスクへの出力”セクションでは、LOPsのレイヤーに関する詳細を載せているので、アーティストが悩んだ時に参考にしてください。

Scene Viewer用のセッションレイヤーとステージが別に存在しますが、現在のところ、Scene Graph Treeを介して設定されたアクティベーション/可視性のオピニオンのみ編集することができます。 Scene Viewerのステージは、LOPグラフのクックチェーン全体が完了した後で、ディスプレイフラグが設定されたLOPノードのステージの内容をコピーします。

Siggraph 2019のScott Keating氏によるこのプレゼンテーションは、Solarisの概要を説明した素晴らしい動画です。

ターゲットプリミティブパターン

1つ以上のPrimsをターゲットにする最も直接的な方法は、手動でそれらのパスを入力することです。 これは明らかに面倒くさいので、Primパスをもっと簡単にターゲットにする方法がいくつか存在します:

  • ドラッグアンドドロップ - Scene Graph Treeからパス(s)をPrim Pathパラメータ上にドラッグします。

  • (パラメータの右側にある白い矢印の)セレクターをクリックすると、ビューポート内で選択をするように促されます。

  • セレクターをCtl + クリックすると、プリミティブツリーから選択をするように促されます。

フルPrimパスの用意とは別に、Primパスをもっと簡単でもっと表現しやすくターゲットにできるようにするための便利な追加構文があります。 パターンマッチングの詳細は、技術メモを参照してください。

ほとんどのLOPsでは、Primパスのデフォルトが`opinput(“.”, 0)`に設定されています。 このエクスプレッションは、何度も何度もPrimパスを入力し直す面倒くささを軽減するために便宜的にそのように設定されています。 LOPがクックされると、そのLOPが直近に変更されたかのように操作/生成されたPrim(s)をそこに格納することができます。 lopinputprims()は、lastmodifiedprims()を便利にしたエクスプレッションです。 このエクスプレッションは、上流のパスが変わるとLOPノードはその変更されたPrimパスを自動的にターゲットし直すので便利です。

コンフィグレーション系ノード

LOPsには、シーンの色々な部分のコアプロパティを設定するための一連のノードが用意されています。

  • Configure Layer

    • 保存パス、デフォルトPrim、平坦化などのレイヤープロパティを設定します。

  • Configure Primitives

    • PrimのPurposeを設定したり、プロキシのセットアップをしたり、アセット情報を追加することができます。 現在のところ、このPrimは、Prune LOPよりもPruneが非常に堅牢なので、アクティベーション/可視性の設定で使用します。

  • Configure Properties

    • Prims上のプロパティとアトリビュートに関する特定のメタデータを追加します。

  • Configure Stage

    • シーンに対してレイヤーミュートやポピュレーションマスクを設定します。

マージ

LOPsはUSDシーン記述を扱うので、入力のマージはSOPsや他のコンテキストよりも重要事項です。 マージには3つのモードがあります:

  • Separate Layers - 各入力のレイヤースタックをマージして、それらすべてを新しいレイヤースタックに結合します(デフォルト)。

  • Flattened Layers - 各入力のレイヤースタック内のすべてのレイヤーを1レイヤーに平坦化します。

  • Flattened Inputs - 各入力をレイヤーに平坦化します。

Separate Layers モード自体は、Layer Breakでマークされたレイヤーを除外しません。2つのFlatteningモードのみがそれを行ないます。

以下のテーブルでは、各Mergeスタイルの挙動について説明しています:

Mergeスタイル

入力の数

入力あたりのレイヤー数

結果のサブレイヤー

Separate Layers

3

3

9

Flattened Layers

3

3

1

Flattened Inputs

3

3

3

MergeはLayerStack、Sublayersのリストであることを知っておくことが重要です。 つまり、入力の順番が重要で、1番目の入力が一番弱く、最後の入力が一番強いです。 この順番は、Scene Graph DetailsのLayer Stackタブで確認することができます。

コンテキストオプション

コンテキストオプションは、LOPネットワークのコンテキストを修正する際に使用可能な特別な変数です。 例えば、コンテキストオプションを使用することで、いくつかの異なるショット間でグラフを切り替えたり、異なるライティングセットアップをWedge化することができます。 コンテキストオプションは、グローバルに設定することができますが、特別なブロックをネットワーク内でセットアップすることでコンテキストオプションをローカルで設定することもできます。 ForEach LOPsは、特殊な味を持ったコンテキストオプションと考えることができます。

Edit ▸ Context Options には、コンテキストオプションを定義するためのリッチなインターフェースが備えた Contexts Options Editor もあります。

VEX、Wrangles、VOPs

詳細は、USDでVEXを使う方法を参照してください。

VEXとは、シェーダからソルバまで至るところで使用されているプログラミング言語です。 VEXはSIMD言語なので、そのコード/ネットワークスニペットは、ターゲットの“エレメント”に対して実行するように設計されています。 LOPsでは、デフォルトでそのエレメントはPrimを指します。 つまり、各ターゲットPrimを反復処理させるためにループを追加する必要がなく、自動的にループになります。 @構文またはBind VOPsを使ってPrimの各アトリビュートにアクセスすることができます。

Wrangle LOPとVOP LOPには、さらに Run on Elements of Array Attributes のセカンドモードがあります。 この場合、コードを走らせるエレメントは、Prim上の配列プロパティのエレメントになります。 これによって、PointInstancerまたはPoints Primsさらには重いメッシュのポイントに対して処理を高速化することができます。

コレクション

USD CollectionsはPrimsのグループと考えることができます。 LOPsには、コレクションを便利に扱うための仕組みがいくつか備わっています。 コレクション指定子は、3つの形式を受け取ることができます:

  • /foo/bar.collection:collection_name

  • %/foo/bar/collection_name

  • %collection_name

Include(包含)パターンには、コレクションをターゲットにすることができます。 しかし、現在のところExclude(排他)パターンは他のコレクションをターゲットにすることはできません。明示的なパスのみを排他することができます。 Primパス(s)を見るほとんどのパラメータは、コレクション指定子も受け取ることができます。

ステージマネージャ

非常に面白いユーティリティLOPのStage Manager LOPは、ディスクからアセットを参照し、それらのアセットを3D空間でトランスフォームし、シーン階層を調整するといった工程を1箇所で操作できるように設計されています。 UX部分を扱うためにカスタムQtインターフェースとPythonステートが用意されていますが、このノード自体がPrimsの作成、移動、コピー、削除をすることができます。 USDではレイヤーが既存のPrimパス/ネームスペースを再定義することを許可しないので、これらの処理のほとんどは、ステージマネージャが動作している同じレイヤー/LOPネットワーク内で定義されたPrimsに対してのみ動作します。

Graft StagesとGraft Branches

Graft(接ぎ木)は別の動物です。 GraftはローレベルのUSD機能を使って、USDだと通常では上手く処理できないような処理を行なって、異なる入力ステージを結合し、それをシーングラフ内の任意の場所に配置します。

以下に、開発者からの詳しい説明を載せます:

1番目の入力は、変更なしでそのまま渡されます。 2番目以降の入力は、それぞれレイヤーを単一レイヤーに平坦化されます(入力あたり1レイヤー)。 次に、各平坦化されたレイヤーのルートPrimが(SdfCopySpecを使って)ステージ上の場所にコピーされます。 各入力をまったく異なる場所に配置することができます。 各入力のルートとして指定されるパスは、Primitive Pathパラメータで評価された文字列とそこにパラメータダイアログの下部にあるInputsウィジェット内で指定された入力毎の文字列を追加して計算されます。 指定した入力に何も値が指定されていなかった場合、代わりにPrimitive Pathパラメータで評価された文字列に“Destination Path Default”パラメータで評価された文字列が追加されます(Destination Path Defaultは入力別に評価されます)。

SdfCopySpecを使用して入力の内容をステージ上にコピーしているという事、そして、各入力のレイヤーが平坦化されている事は、非常に負荷が高い処理が発生することを意味します。 しかし、効率的に膨大な別々のステージを各ステージに結合していって最終シーングラフツリー内の任意の場所に配置することができます。 このシーングラフ階層の操作は、USDだと通常ならあっさりと簡単にできるようなものではありません。

ディスクへの出力

ROP USD Output LOPを使用することでUSDレイヤーをディスクに書き出すことができます。 この操作は単純で、平坦化されたステージをディスク上の単一USDレイヤーに書き出します。 USDコンポジションアークは複雑になってしまうので、USDエクスポートは、高度な複数ファイルのエクスポートに対応しています。 それについての説明は非常に難しくなるので、このセクションでは深く触れませんが、USD ROPが行なっている事を理解するのに十分な説明がしたいと思います。

USD ROP

ROP USD Output LOPは、USDレイヤーをディスクに書き出す主要エンジンです。 これには、フレーム単位でファイルを書き出したり、サブレイヤーを保存するディレクトリを指定したり、開始/終了タイムコードのメタデータを含めないオプションがあります。 さらにレンダリング時に適用されるコンテキストオプションにも対応しています。 ですが、ここで主要なパラメータはSave Styleです。 Save Styleパラメータは、LOPグラフとそこから生成されるシーン記述をディスク上でどのように表現するのかを決定します。

  • Flatten Implicit Layers - Configure Layer LOPsまたは“Save Path”パラメータで示されたレイヤーを平坦化します。任意のSOPレイヤーやFileレイヤーを平坦化するオプションも用意されています。参照は維持されます。

  • Flatten All Layers - すべてのサブレイヤーをOutput Fileに平坦化し、暗黙レイヤーを無視します。参照は維持されます。

  • Flatten Stage - ステージ上に合成されたすべてのシーン記述をOutput Fileに平坦化します。これはデバッグや移植に役立ちますが、一般的には使用しません。これは、大規模プロダクションシーンでは極端に膨大なファイルを生成してしまって非常に長い時間がかかってしまいます!

  • Separate Layers - Layer Stack上のすべてのレイヤーをディスクに保存し、各レイヤーがOutput Fileではサブレイヤーになります。すべてのサブレイヤーとリファレンスが維持されます。

一度に複数レイヤーを書き出すと、.usd拡張子が付いたレイヤーは、ROPのOutput Fileと同じレイヤー拡張子を使用します。 Save Pathレイヤーをアスキーまたはバイナリのどれかに強制したいのであれば、それぞれ.usdaまたは.usdcを使用する必要があります。

  • .usd - バイナリまたは出力ファイルの拡張子を使用します。

  • .usda - アスキー

  • .usdc - バイナリ

Implicit Layers(暗黙レイヤー)

Implicit Layers(暗黙レイヤー)とは、LOPネットワークがメモリ内で生成したレイヤーのことです。 このレイヤーを他のExplicit Layers(明示レイヤー:これもLOPネットワークで生成します)に平坦化することができます。 その場合、保存処理時に独立したエンティティとして消えます(ただし、暗黙レイヤーで表現されたオピニオンは平坦化しても維持されます)。

Layer Break(レイヤー分離)

Layer Break LOPは、USD ROPがレイヤーをディスクに書き出す時に、上流のシーン記述をレイヤーに書き出されないようにブロックします。 下流のLOPsでシーングラフに加えた変更は、そのLayer Breakより上流のシーン記述に影響を影響を与えるオーバーレイとして編集されるようになります。 Layer Breakによって、アーティストはUSDレイヤーを編集する時にもっと外科手術的に編集することができます。 Layer Breakは、何かしらのオペレーションがステージ上のレイヤーを平坦化した時にのみ効果があります。 例えば、ROPがレイヤーをディスクに書き出した時やMerge/Configure Layersに何かの形式の平坦化を設定した時です。

以下の例では、Layer Breakより下流には、displayColorを追加したAttribute Wrangle LOPによるシーン記述のみがあります。 このレイヤーをディスクに書き出すと、Layer Breakは、上流のレイヤーを除外して、下流のレイヤーだけを残します。 これは、不意にサブレイヤーをいじらないように、または、無駄に他のシーンの部分を使わずに、アーティストが自身の所属する部署のレイヤーに特定のオーバーライドを適用したい場合に重宝します。

SOP Layers(SOPレイヤー)

SOPレイヤーをリファレンスまたはサブレイヤーとしてシーンに取り込むことができます(SOPレイヤーの名前は“.sop”で終わります。このレイヤーはScene Graph DetailsペインのLayer StackタブまたはCompositionタブで確認することができます)。 デフォルトでは、SOPレイヤーのノードパスは、(Output FileまたはSublayer Directoryを基準とした)ディスク上のパスになります。 USD Configure SOPを使用することで、このレイヤーの出力パスを特定のディスク上の場所にオーバーライドすることができます。

SOP I/O

LOP Import

LOP Import SOPは、シーンの一部またはすべてをSOPsに取り込みます。 プリミティブパターンとPurposeに基づいて、USD PrimsをUSD Packed PrimsとしてSOPsに取り込むことができます。 デフォルトでは、Layer Breakを無視します。 他にも、Primsが取り込まれたTimeがデフォルトでシーンの開始フレームになります。 もしアニメーションジオメトリを取り込む必要があれば、Timeを$FFに設定すると良いでしょう。 しかし、たいていの場合、これによって遅くなり、無駄に処理が重たくなります。 WrangleまたはVOPを介してシーン内のUSD Packed PrimsのusdFrameIntrinsicをアニメーションさせた方が非常に高速に結果を得ることができます。

setprimintrinsic(0, “usdFrame”, @primnum, @Frame);

SOP Import

SOPデータをLOPsに戻すには、SOP Import LOPを使用します。 SOPコンテキストで出力するレイヤーとオプションをセットアップできるように、このLOPと同じすべてのオプションを持ったUSD Configure SOPが存在します。 このUSD Configure SOPは、SOP Import LOPの Load as Reference が有効な時に使用します。 注意してほしいのは、USDのデフォルトは右手向きメッシュであるのに対して、Houdiniは左手向きメッシュです。 あなたのメッシュが右手向きの場合、SOPsでそのジオメトリを編集する時は Reverse Polygon Vertex Ordering を有効にすることを忘れないでください。 さらに、メッシュPrimsに適切にSubdivsが設定されているかどうか確認しておくと良いでしょう。

USDで新しいPrimsを作成する際にSOPsでのポイントに基づいて使用可能なPointアトリビュートがいくつかあります:

  • s@usdprimtype - USD Primタイプを設定します。

  • s@path - Primパスを設定します。

  • s@name - Prim名を設定します。

  • s@usdkind - Kindを設定します。

  • 標準のHoudiniトランスフォーム系アトリビュート(P、Nなど)をPrimのトランスフォームに設定することができます。

SOPジオメトリをLOPsに変換する時は、できるだけ効率的に変換されるように試みてください。 デフォルトでは、アトリビュートはタイムサンプルになるのですが、アトリビュートを Set Default Values に追加することで、それらのアトリビュートをタイムサンプルにしないように指定することができます。 他にも Topology AttributesStatic に設定することで、タイムサンプルでないアトリビュートを取得することができることを忘れないでください。 USD(と特にHydra)は、たとえ値が単一タイムサンプル値であったとしても、値がタイムサンプルになっていると処理が重くなります。 セットアップの規模が小さいと、おそらくその違いはわからないですが、大規模シーンになると、かなり違いが出ます。

以下に、HoudiniジオメトリアトリビュートとUSD Primvars補間の変換を載せます:

Houdini

USD

Detail

Constant

Primitive

Uniform

Vertex

faceVarying

Point

Vertex

以下の標準Houdiniアトリビュートはデフォルトでそれに呼応するUSD標準アトリビュートに変換されます:

Houdini

USD

Cd

primvars:displayColor

Alpha

primvars:displayOpacity

widths, width, pscale

widths

P

points

N

normals

bounds

extents

v

velocities

id

ids

Note

幅系アトリビュートに関しては、その優先度は高い順に@widths@width@pscaleです。

SOPsからジオメトリを取り込む際に注意すべき事を説明します。

メッシュ/ポイントPrim(s)をUSD Unpack SOPでアンパックした後は、usdxform Pointアトリビュートが追加されます。 このPointアトリビュートは、そのポイントの大元であるUsdPrimで計算されたワールドトランスフォームを表現しています。 アンパックされたポイントは、その計算されたワールド空間ポジション内に存在するので、@usdxformを使用することで、それらのポイントをUsdPrim空間に戻すことができます。 これは、 Invert Transformation トグルを有効にしたTransform by Attributeを使って処理することができます。

SOP Modify/Create

これは、簡単にジオメトリを編集/作成できるようにSOPネットワークとLOP/SOPインポートをラップしたHDAです。 SOP Modify LOPは、LOP-SOP-LOPのサイクルでPrimsをやり取りする汎用的で非常に実用的なノードです。 ポイントをUsdPrim空間に自動的にトランスフォームするための機能が組み込まれています。

Point Instancers

Point Instancerスキーマは、大量のジオメトリを可能な限り高速に描画できるように設計されています。 大量の瓦礫をシミュレーションしてアニメーションすることがよく求められるFXアーティスト用に主に設計し実装されました。 Point Instancer LOPは、Houdini標準のインスタンスPointアトリビュートを使って、各インスタンスのトランスフォームを調整します。

ポイント上にインスタンス化された各モデルのことを“プロトタイプ”と呼び、Point Instancer Primsはたくさんのプロトタイプを割り当てることができます。 Point Instancer Primsのアトリビュートを介してインスタンス毎のバリエーションを表現することができないのであれば、別のプロトタイプを使用する必要があります。 プロトタイプには、アニメーションジオメトリを含めることができ、Point Instancer Primsは他のPoint Instancersのプロトタイプを指定することができます。

この欠点は、Point Instancersはパイプラインで何かを処理する場合の柔軟性が非常に低いことです。 個々のPoint Instancerインスタンスを親子化するには、余計な作業が必要になり、個々のインスタンスへの変更は、そのスキーマから利用可能なアトリビュートに制限されています。 さらに、いくつもの固有なプロトタイプを使用することができるものの、あまりにもプロトタイプが多すぎると、Point Instancersを使用することによるパフォーマンスのメリットを相殺しかねないです。

LOPsでは、便宜的にPoint InstancersとNative Instancesを使って動作するLOPをいくつか用意しています:

  • Modify Point Instances - 個々のインスタンスをトランスフォームさせ、SOPsを使って修正します。

  • Extract Instances - インスタンスを抽出して昇格させます。

  • Material Variation - シェーディングバリエーション用にPrimvarsを編集します。

インターフェース

ネットワークエディタ

LOPsのネットワークエディタはHoudiniのSOPsと非常に似ています。 現行表示に寄与していないノードのスタイルが異なります。 デフォルトでは、たいていの場合でDescriptive ParameterはターゲットのPrimパス(s)を表示し、さらに表示されているレイヤーの数を示したラベルが追加されます。 これらのスタイルは、ネットワークエディタのDisplay Options( View ▸ Display Options ▸ Text Badges )で無効にすることができます。

LOPノードには Debugフラグ があり、その機能は、LOPネットワークがクックされる方法に関係します。 通常では、各LOPは、スタック内で一番強いレイヤーのコピーを作成し、その作業コピーに対して処理を行ってから、その内容をスタック内の一番強いレイヤーにコピーして戻します。 LOPノードのDebugフラグを有効にすると、一番強いレイヤーにコピーして戻すのではなくて、その作業レイヤーをスタックの上に追加します。 これによって、LayerStackの数が一定にならずに、ノード毎に数が増えます。

ネットワークエディタは、同じレイヤーを編集していることを示せるようにLOPノードの輪郭に色を付けることもできます。 その色自体はランダムで、編集可能レイヤーが同じである事だけを示しています。 これは、ネットワークエディタの View ▸ Show LOP Layer Colors で無効にすることができます。

Scene View

デフォルトでは、LOPsは、Primsを選択したりハンドルを使ってシーンを編集することを可能にする独自のHoudiniGLデリゲートを持っています。 選択ツールは、Kindを使ってシーンのエレメントを選択することができます。 ドロップダウンメニューから色々なレンダラー(現在のところ、Houdini GLとHydra GLのみが実用的です)を選択することができ、カメラ視点やライト視点に切り替えることができます。

現在のところ、現行ノードがCamera LOPになっていれば、LOPsでなくとも可能ですが(機能の違いはあれど)ビューをカメラにロックしてビューを操作することができます。 しかし、この方法でライトを制御するには、まだ少し面倒です。

Scene Graph Treeのコンテキストメニューをカスタマイズしたいのであれば、$HOUDINI_PATH上にUsdStagePrimMenu.xmlを作成します。 これと同じメニューがScene Graph Treeにも使用されています。

Scene Graph Tree

上図では合成されたUSDステージを表示し、下図ではコレクションを表示しています。 ここで表現されているVisibility/ActiveオピニオンとDraw Modeオピニオンは、セッションレイヤー内に保存されていますが、ディスクに書き出されません。 いくつかのオペレーション(例えば、バリアントの変更)は、実際にシーングラフ内に新しいノードを作成します。 Scene Graph Treeは、ペイロードのロード/アンロードをすることもできます。 Scene Graph Treeには、Prims/コレクションをフィルタリング、異なるPrimメタデータを表示するための色々なオプションも用意されています。 さらには、コレクションを表示するためのセクションもあります。

Scene Graph Treeに表示されるステージは、デフォルトではノード選択によって決まり、必ずしもディスプレイフラグが付いたノードである必要はありません。 しかし、この挙動を変更するためのプリファレンス(Edit > Preferences > Lighting)があります。

Primsのテキストは、シーンに関する情報をもっと示すために、そのカラー/スタイルを変更します:

オレンジ

暗いオレンジ

暗い青

赤いドット

Reference、Specialize、Inherit

Payload、Payload設定されたReference

アンロードされたPayload

インスタンス

マスターPrims(インスタンスの子)

ビューポートオーバーライド

Scene Graph Treeのコンテキストメニューをカスタマイズしたいのであれば、Scene Viewで使用されているのと同じUsdStagePrimMenu.xmlを編集/作成することができます。

Scene Graph Details

選択されたPrimのプロパティ、メタデータ、そのPrimのオピニオンに寄与しているレイヤーを表示します。 Compositionタブは、選択されたPrim/アトリビュートに寄与しているすべてのコンポジションアーク(それぞれPrimStacksとPropertyStacksと呼びます)を表示します。 PrimStacks/PropertyStacksは、LayerStacksとは少し異なりますが、原理的には同じです。

Scene Graph Layers

シーンで使用されているレイヤーを検査することができます。 他にも、レイヤーをミュートする仕組みがありますが、この限定的なミュートはビューポートにのみ影響し、Configure Stageによるレイヤーのミュートと同じようにシーングラフ内で持続されるわけではありません。

Edit Properties

非常に強力なLOPであるEdit Properties LOPは、USD Primsの作成/編集に使用します。 このインターフェースは、UI上の Edit Properties ボタンをクリックして定義し、特定のPrimスキーマに基づいてプロパティを選択して適用したり、一般的なUSDプロパティタイプのみを選択して適用することもできます。 Edit Properties を直接デジタルアセットに変換することもできます。 実際にLight、Cameraなどのいくつかのネイティブノードとすべての“Primitive”系LOPs(例えば、CubeやConeなど)は、 Edit Properties によって生成されたHDAです。

Preferences

LOPs用に用意されたプリファレンスがいくつかあります。 これらのプリファレンスは、 Edit ▸ Preferences ▸ Lighting にあります。

Solaris

USD

ジオメトリ

  • SOPをUSDに取り込む方法

    HoudiniがSOPジオメトリをUSDに変換する方法、その工程を制御する方法の詳細。

  • Component Builder

    Component Builderツールは、マテリアル、バリアント、ペイロード、レイヤーをサポートし、SOPからUSDモデルを作成するためのネットワークスニペットを配置します。

レイアウト

  • Editノード

    ビューア内でインタラクティブにPrimsをトランスフォームさせます。物理衝突を使用して、プロップを現実的に配置することができます。

  • Layoutノード

    インスタンス化されたUSDアセットをシーンに取り込むツールが備わっています。個々にコンポーネントを配置したり、カスタマイズ可能なブラシを使って色々な方法でコンポーネントをペイント/スキャッターしたり、既存のインスタンスを編集することができます。

  • カスタムレイアウトブラシ

    Layout LOPの挙動をカスタマイズして利用可能なレイアウトブラシデジタルアセットの作成方法。

シェーディング

  • シェーダフレームワーク

    シェーダノードのUSDプリミティブへの変換を含む、Solarisシェーディングフレームについて説明しています。

  • SolarisでのMaterialXの使い方

    HoudiniにはMaterialXシェーダノードに呼応させたVOPノードが用意されています。これらのノードを使用してシェーダネットワークを構築したり、既存のMaterialXシェーダをインポートすることで、(HoudiniのUSDレンダラーの)KarmaでMaterialXシェーダノードを利用することができます。

  • UDIM

    テクスチャ空間の異なるタイルを、それぞれ別の解像度で、異なるテクスチャファイルにエンコードすることができます。その後、kaiju.exrといったテクスチャファイル名を指定すると、Houdiniがロード時にそのトークンを特定のタイルアドレスに置き換えてくれます。

Karmaレンダリング

チュートリアル