Houdini 20.0 Solaris

Karma Room Mapシェーダ

インテリアマップを窓に投影し、3次元の部屋の印象を作成します。

On this page

Karma Room Map VOPシェーダは、十字型のインテリアマップをサーフェスに投影し、3次元の部屋のような印象を作成します。またスライスを通して深度も追加できます。スライスには、家具、人、カーテン、ランプや植物などのプロップを含めることができます。このような投影の利点は、完全な部屋をモデリングする必要がなく、マップで代用できることです。ビュー角度に基づき、シェーダのマッピングメソッドに応じて、部屋の各部分が表示されます。Karma Room Mapシェーダを使用すると、リアルなインテリアを効果的に建物全体に追加できます。

従来のインテリアマッピングは通常、単一平面のみで動作します。しかしKarma Room Mapシェーダは、タイル化されたサーフェスやカーブのあるサーフェスもサポートしています。この柔軟性を実現するには、シェーダがインテリアマップを適切に整列させたりスケールできるようにするための、特定のセットアップが必要です。また、複雑なネットワークを作成しなくても、単一のシェーダを通して複数の窓に異なるマップを適用することができます。

Karma Room Lens VOPを使用すると、3Dの部屋のモデルをスライス付きのインテリアマップとしてレンダリングできます。例えば、様々なライティング状況を作成したり、カーテンが開いたり閉じたりしている部屋や、様々な壁の色やインテリアの部屋などをレンダリングできます。

単一の窓のセットアップ

基本のセットアップでは、1つの平面に投影される1つのマップを使用します。シェーダセットアップとマップの両方が、適切に動作するための特定の要件を満たす必要があります。インテリアマップは、アルファチャンネルと固定のパターンを含むEXRファイルであり、各部屋の要素が適切な壁に表示されるようになっています。下の の画像は、壁とスライスの順序を示しています。 の図は、実際のインテリアマップです。アルファマップにより、スライスを透明に表示できます。

以下は、レンダリングしたいくつかのビューです。

ジオメトリ要件

Karma Room Mapシェーダは、使用されているジオメトリ上で様々な計算を実行し、マップの寸法や方向を決定します。これは、ネイティブのHoudiniジオメトリでは単純な処理ですが、外部ソースからのオブジェクトはシェーダの要件を満たさない場合があります。他のDCCからのジオメトリでは、頂点順が一貫していなかったり、ベクトルの向きが様々であったりする問題が起こりがちです。

ジオメトリに不具合がある場合の詳しいトラブルシューティングについては、このリンクを参照してください。

SOPセットアップ

SOPノードは、 obj ネットワークだけでなく、 stage ネットワークでもSOP Create LOPを介して作成することができます。これ以降の例では、ジオメトリノードはすべて obj ネットワークにあります。

  1. ⇥ Tabを押してタブメニューを開き、Geometry OBJを作成します。ノードをダブルクリックして、その中に入ります。

  • Grid SOPを追加します。このノードが窓を表現します。

  1. グリッドの OrientationXY Plane に変更します。

  2. Size に、2, 1と入力します。

  3. RowsColumns をそれぞれ2に設定し、投影ジオメトリを簡素化します。

  4. Room Map Frame SOPを追加し、その入力をグリッドノードの出力に接続します。Karma Room Mapシェーダには、マップを適切にスケールして方向付けるための情報が必要です。このノードが、適切なアトリビュートを作成します。

  5. Visualize をオンにして、最も重要なアトリビュートを確認します。

  6. 短いネットワークを終了するために、Null SOPを追加して、Room Map Frame SOPの出力に接続します。Nullの名前をGEO_WINDOWなどに変更し、青の Display/Render フラグをオンにします。

上の図では、それぞれ頂点に3つの軸があり、赤のtangentu (Utan)ベクトルと緑のtangentv (Vtan)ベクトルを表しています。青のベクトルは、tangentutangentvの外積で、グリッドの法線を表します。青のベクトルの方向が示すのは、グリッドのどちら側にマップが示されるのかといったことです。ノードの様々なチェックボックスを使用して、オブジェクトのジオメトリを変更することなく、マップの方向を変更できます。ただし Use Up Vector を使用すると、頂点順が一貫していない場合に起こる多くの問題を解決することができます。

ステージセットアップ

以下では、ごく基本的なLOPセットアップでSOPネットワークをUSD ステージ にインポートして、プレビューを作成します。

  1. stage レベルで、⇥ Tabを押してSOP Import LOPを作成します。

  2. SOP Path には、 obj ネットワークのGEO_WINDOW Nullを指定する必要があります。上記の手順に従った場合、パスは/obj/geo/GEO_WINDOWになります。または、ノード選択アイコンをクリックし、GEO_WINDOWに移動します。

  3. Material Library LOPを追加し、その入力をSOP Import LOPの出力に接続します。

また最終レンダリングには、Camera LOPKarma Render Settings LOPUSD Render ROPノードも必要です。

The Karma Room Mapシェーダ

Houdini 20では、マテリアルは特定のSubnet VOP内部で作成されます。サブネットを作成してその中に入ると、タブメニューに表示されるのは選択したサブネットで動作するシェーダノードのみです。全体的なシェーダネットワークはこのようになります(作成の手順は以下で説明します)。

画像をクリックすると拡大します。
  1. Material Library LOPをダブルクリックして、その中に入ります。

  2. タブメニューから、Karma Material Builderを選択します。このノードもダブルクリックして、その中に入ります。サブネットが複数のノードによって事前設定されています。mtlxdisplacementノードは削除してもかまいません。

  3. Karma Room Map LOPを追加し、out出力をMaterial_Outputs_and_AOVsノードのnext入力に接続します。

  4. File パラメータでマップを選択することができます。デフォルトでは、karma/roommap_debug.exrエントリがあります。現時点では、このマップにしておきます。

    ノードの最初の3つの入力には、Room Map Frame SOPからのジオメトリアトリビュートが必要です。インテリアマップの正確な投影のために、SOPノードが窓のスケール、位置、方向を分析します。

  5. 窓のアトリビュートをシェーダにバインドするには、 3つMtlX Geometry Property Value VOPを追加します。それらのoutピンをシェーダのpositiontangentbitangent入力に接続します。

  6. 3つすべてのMtlX Geometry Property Value VOPで、 SignatureVector 3 に設定します。

  7. 3つの Geomprop パラメータは、roomPtangentutangentvです。

MtlX Standard Surface

これで、Karma Room MapシェーダをMtlX Standard Surface VOPに接続できるようになりました。マテリアルによって、反射、色、明るさがライティング状況と一致する、リアルな印象を作成できます。

  1. Karma Room Mapシェーダのout出力を、マテリアルのbase_color入力に接続します。

  2. シェーダのnormal出力を、マテリアルのnormal入力に接続します。

  3. 窓のガラスの効果を作成するために、MtlX Normal VOPを追加して、マテリアルのcoat_normal入力に接続します。

  4. Karma Room Map VOPの Mix Normals パラメータが各部屋の壁にフェイク法線を追加し、インテリアのDiffuse(拡散反射)の様子を再現します。このようにして、部屋のルックを環境光の状況に合わせることができます。

タブメニューからKarma Material Builderサブネットを作成した場合、MtlX Standard MaterialノードはMaterial_Outputs_and_AOVsノードに既に接続されているため、マテリアルを窓のオブジェクトに適用する準備が整っています。

Tip

照明されたインテリアマップを使って夜のシーンを作成したい場合は、マテリアルの Emission パラメータを上げます。夜のショットに適したマップが必要なことに注意してください。ほどんどの場合、商用パッケージには昼 および 夜のマップが含まれています。

結果をプレビューする

ここで stage レベルに戻り、結果をプレビューします。ビューポートで、レンダーデリゲートを Karma CPU または Karma XPU に設定します。少しすると、以下のような画像が表示されるはずです。

次は、部屋のカスタマイズを開始します。シェーダVOPには、マップをスケールしたり、部屋の深度を変更したり、スライスをオンにするためのパラメータがあります。

  • Scale パラメータを使用して、仮想の部屋の寸法を制御することができます。例えば、Z値を2にすると、部屋により奥行きがあるように見えます。

  • Slice パラメータをオンにすると、部屋の内側に4色のカードが表示されます。 Slice PositionSlice Scale を使用して、スライスの外観を定義します。

  • インテリアを変更するには、 File で独自のファイルをロードします。

複数の窓枠

単一の窓のセットアップでは、1つの窓を扱う方法を示しましたが、窓は複数の要素で構成されることもあります。Karma Room Boxシェーダは、複雑で非平面の配置にもインテリアを投影することができます。roomID Primitiveアトリビュートが、同じ窓に属する要素をシェーダに伝えます。シェーダはこのアトリビュートを探すため、追加のMtlX Geometry Property Value VOPを接続する必要はありません。

Note

このシーンは、単一の窓のセットアップをベースにしています。先に進む前に、このガイドの上記の手順に従ってください。

SOPセットアップ

この例では、元のグリッドをコピーして合計3つの窓枠を作成します。

  1. obj レベルで、geo1ノードの中に入り、grid1を選択します。

  2. Scale1, 2に変更し、縦長の長方形にします。

  3. タブメニューから、 2つTransform SOPを追加します。grid1の出力をtransform1 および transform2の入力に接続します。これで2つのブランチができ、各ブランチ/トランスフォームノードには元のグリッドのコピーが含まれています。

  4. 1番目の トランスフォームで、 Translate-1, 0, -0.25Rotate0, -30, 0に設定します。

  5. 2番目の トランスフォームで、 Translate1, 0, -0.25Rotate0, 30, 0に設定します。

  6. Merge SOPを追加し、その入力にグリッドノードとトランスフォームノードを接続します。

  7. Merge SOPの出力をroommapframe1の入力に接続します。すると、以下のようになるはずです。

roomIDアトリビュート

Solarisに切り替えてプレビューレンダリングを行なうと、すべての窓枠に独自のテクスチャがあることが確認できますが、マップはガラスの前面全体に広げる必要があります。

  1. Attribute Wrangle SOPを追加し、それをmerge1roommapframe1の間に配置して、 1番目 の入力に接続します。

  2. VEXpression フィールドでi@roomID = 100;と入力し、同じIDをすべての窓枠に割り当てるアトリビュートを作成します。

  3. Run Over ドロップダウンメニューから、 Primitives を選択してroomIDアトリビュートをガラスの窓枠に適用します。

  4. roommapframe1を選択します。 Window ModeAttribute に変更し、 Primitive Attribute をロック解除します。デフォルトのエントリはroomIDで、これはWrangleのアトリビュートと一致します。また、青と赤のベクトルの方向が変わっていることが分かります。

  5. ガラス前面の凸型の面にインテリアマップが表示されるようにするには、 Invert U をオンにします。

LOPの部分は変更する必要がなく、プレビューのレンダリングを開始することができます。以下のような画像が表示されるはずです。画像は、3つの異なる表示角度を示しています。

複数の階

前の例のガラス前面をコピーして、オフィスビルのような複数の階を作成し、それぞれの階に異なるインテリアが表示されるようにします。窓のジオメトリから始めます。以下のようなネットワークを作成します。

画像をクリックすると拡大します。
  1. obj レベルでgeo1ノードの中に入ります。

  2. Line SOPを追加し、階数を決定します。この例では、 Length6.25で、 Points4です。

  3. 既存のAttribute Wrangleを削除し、新しいノードを1つ作成します。その 1番目 の入力をLine SOPの出力に接続します。

  4. VEXpressioni@roomID = @ptnum + 200です。新しい@ptnumアトリビュートにより、Lineのポイント数が追加されます。現在、roomIDは窓のポイントにコピーされています。これは、後の手順で変更します。

  5. Copy to Points SOPを追加します。その 1番目 の入力をmerge1の出力に接続します。 2番目 の入力をcopytopoints1の出力に接続します。

  6. Attribute Promote SOPは、roomIDアトリビュートを窓にコピーします。その入力をcopytopoints1の出力に接続します。

  7. Original Name に、roomIDと入力します。

  8. New ClassPrimitive に設定します。

  9. roommapframe1の出力をattribpromote1の入力に接続します。

Null SOPの青の Display/Render フラグをオンにすると、4つの階が表示されます。各階に3つの窓があります。また、roomID番号も表示されています。表示されていない場合は、roommapframe1を選択して Visualize をオンにします。

マップをランダム化する

Karma Room Mapシェーダには、ファイルシーケンス内の別のテクスチャに切り替えるための {Slice} Offset UDIM パラメータがあります。ファイルシーケンスは、名前と拡張子は同じですが、UDIMインデックスが異なる複数のマップで構成されています。例えば、次のようになります。

  • interior.1001.exrinterior.1002.exrinterior.1003.exrinterior.1004.exr

レンダリングエンジンにファイルシーケンスを認識させるには、トークンでインデックスを置き換えます。

  • interior.<UDIM>.exr

この共通の表記方法をシェーダの File パラメータのファイル名として使用します(ファイルを指すパスも必要であることに注意してください)。 Offset UDIM スライダを使用してマップを変更すると、すべての階に同じマップが適用されていることも分かります。階毎に異なるマップを使用したい場合は、マップをランダム化する必要があります。

解決策の1つは、窓の位置を格納するroomPアトリビュートを通してボロノイノイズを駆動することです。デフォルトでは、同じマップが数回適用される可能性が高いです(特に窓がいくつかあるセットアップで)。それを修正するには、係数を用いてボロノイノイズを制御しますが、値が高いほどよりランダムになります。この概念を示したものが、以下の比較です。係数を使用しない場合、隣接したボロノイセルは同じ色になることが多く、同一のマップになる可能性が高まることが分かります。右の画像は係数が100で、ばらつきが多くなっています。

以下は、ノイズを使用してマップをランダム化する方法です。

  1. stage/materiallibrary1/karmamaterialの中に入ります。

  2. MtlX Multiply VOPを追加し、in1roomPアトリビュートを含むMtlX Geometry Property Valueノードのoutに接続します。

  3. Input 250, 50, 50と入力します。窓は4つだけなので、インテリアマップをランダム化するにはこのくらいの値から始めるのが良いでしょう。

  4. Karma Voronoi Nose 3D VOPを配置します。positionmtlxmultiply1ノードのoutに接続します。

    ボロノイセルの位置ベクトルは、p出力で利用可能です。シェーダのUDIMパラメータを駆動するには、ベクトルを再度コンポーネントに分割する必要があります。

  5. MtlX Separate Vector 3 VOPを追加して、コンポーネントを取得します。ノードのin入力をボロノイノイズのp3に接続します(通常、p3の方がよりランダムになります)。

  6. MtlX Range VOPを追加します。このノードは、入力値をリマップします。そのin入力をMtlX Separate VOPのoutxに接続します。MtlX Range VOPに、 Outhigh パラメータがあります。値は、利用可能なマップの数と一致する必要があります。この例では、4つの窓に4つのマップがあるため、パラメータの値は4です。

  7. outピンをシェーダのroom_offset入力に接続します。

以下の図のようなネットワークになっているはずです。

画像をクリックすると拡大します。

スライスをランダム化する

スライスでインテリアにレイヤーを追加すると、空間がより奥深い印象になります。シェーダのパラメータを開いて Slice {n} をオンにすると、 Slice Offset UDIM パラメータが表示されます。インテリアマップにスライスがある場合、スライダを使用してスライスをスワップすることができます。インテリアマップには最大4つのスライスを含めることができます。

マップをランダム化する方法を使用して、 Slice Offset UDIM パラメータを駆動することができます。

  1. 必要な作業は、MtlX Range VOPをさらに追加して、MtlX Separate 3ノードのout[xyz]出力に接続するだけです。

  2. その後、MtlX Range VOPの Outhigh パラメータを4(マップ毎の最大スライス数)に設定します。空のスライスには黒の背景があり、完全な透明とみなされます。

  3. MtlX Range VOPのoutピンを、シェーダのslice{n}_offset入力に接続します。

以下に示す3つのビューは、複数の窓と階でランダム化したインテリアマップです。

カーブした複数の窓枠

Karma Room Mapシェーダは、複雑なカーブのある窓もサポートします。近代的な建物や、有機的な形状をしたガラスの前面を作成することができます。以下の例では、カーブした窓をポリゴンカーブから作成しています。

SOPセットアップ

窓のジオメトリは、2つのポリゴンカーブで作成されます。カーブ間の空間がポリゴンで埋められて、ソリッドオブジェクトになります。なお、以下のガイドは、考え方を説明するための基本の方法です。

  1. obj レベルで、タブメニューを開いてGeometry OBJノードを作成します。ノードをダブルクリックして、その中に入ります。

  2. Geometryノード内で、Curve Bezier SOPを作成します。ビューポートにマウスカーソルを移動し、2を押して Top ビューを開きます。次に、Enterを押して描画モードに入ります。

  3. ノードの Primitive TypePolygon に設定されていることを確認します。

  4. を使用してポイントを描画します。ポイントが多いほど、滑らかなサーフェスになります。再度Enterを押して、カーブの描画を終了します。

  5. Line SOPを追加し、 Length2(またはその他の値)に設定します。

  6. Copy to Points SOPは、カーブをラインのポイントにコピーします。

  7. Copy to Points SOPの 1番目 の入力をカーブノードの出力に接続します。 2番目 の入力はラインの出力に接続します。

  8. Skin SOPを追加して、カーブ間にポリゴンを作成します。 1番目 の入力を、コピーノードの出力に接続します。

  9. Fuse SOPで、ポイント同士をスナップしてジオメトリをクリーンアップします。

    これで、マップの投影のためのソリッドオブジェクトが作成されました。残りの手順は、前の例と同じです。

画像をクリックすると拡大します。
  1. Karma Room Map Frame SOPは、関連するすべてのアトリビュートを追加します。そのノードを追加して、入力をネットワークの最後のノードの出力に接続します。ここでカスタムのroomIDアトリビュートを作成する必要はありません。すべてのポリゴンが共通のroomID値の0を持つようにする必要があります。

  2. Null SOPでチェーンを終了し、名前をGEO_WINDOWなどに変更します。

ステージセットアップ

Karmaを使用してレンダリングするためのLOPセットアップは、前に説明した通りです。Karma Room Mapシェーダには、Karma Room Map Frame SOPからのアトリビュートとインテリアマップが必要です。カーブした窓の複数のコピーがある場合、マップをランダム化する方法とスライスをランダム化する方法を再度使用することで、様々なマップを適用することができます。以下は、カーブした窓の2つのビューです。

考え方が理解できると、このシェーダは優れた堅牢性と柔軟性を備えていることが分かります。このシェーダは様々な形状でも動作して、関連するすべてのアトリビュートを制御できます。1つのシェーダノードだけで、建物全体に家具などを揃えることができます。

primbasisアトリビュート

方向を調整したり揃えるためのより高度なテクニックを紹介します。上の の画像は、3つの階のセットアップを示しています。青の法線および緑のtangentvベクトルが、窓のグループ毎に異なっていることが分かります。primbasisアトリビュートを使用すると、参照の窓の要素を使用してベクトルを揃えることができます。

  • roomIDアトリビュートの値は、100、101、102です。

  • それぞれの窓に6つの個別要素が含まれており、内部で0から5の番号が付けられています。

  • roomID値に基づいて、Karma Room Map Frame SOPはプリミティブグループを作成し、関連するベクトルを計算します。

この例では、窓の要素<0、3>、<1、4>、<2、5>は同じ向きになっています。primbasis0に設定すると、 の画像のように、すべてのベクトルが左下の窓の要素と揃います。primbasis = 2の場合、右下の要素から参照ベクトルが取得されます。

トラブルシューティング

Karma Room Frame SOPは、窓のジオメトリから複数のアトリビュートを作成します。アトリビュートは、インテリアマップを正確に投影するために欠かせません。エラーのよくある原因は、頂点順が正確でないことや、外部DCCからのジオメトリに不具合があることです。Room Map Frame SOPのオプションを使用して、多くの問題を修正することができます。以下を試してみましょう。

  • ジオメトリの頂点順が一貫していない場合、 Use Up Vector を使用する

  • マップが反転または回転している場合や、マップが窓の“反対”側に投影されている場合、接線ベクトルを反転およびスワップする

  • Reverse SOPを使用して、すべての面の頂点順を逆順または周回させる

  • 窓のジオメトリをできる限りクリーンおよびシンプルに保つ

  • Fuse SOPでジオメトリをクリーンアップする

Solaris

USD

ジオメトリ

  • SOP Geometry I/O

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

  • Component Builder

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

レイアウト

  • Editノード

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

  • Layoutノード

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

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

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

ルック開発

  • MaterialX

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

  • UDIMパス

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

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

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

Karmaレンダリング

チュートリアル