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 ネットワークにあります。
-
⇥ Tabを押してタブメニューを開き、Geometry OBJを作成します。ノードをダブルクリックして、その中に入ります。
-
Grid SOPを追加します。このノードが窓を表現します。
-
グリッドの Orientation を XY Plane に変更します。
-
Size に、
2, 1
と入力します。 -
Rows と Columns をそれぞれ
2
に設定し、投影ジオメトリを簡素化します。 -
Room Map Frame SOPを追加し、その入力をグリッドノードの出力に接続します。Karma Room Mapシェーダには、マップを適切にスケールして方向付けるための情報が必要です。このノードが、適切なアトリビュートを作成します。
-
Visualize をオンにして、最も重要なアトリビュートを確認します。
-
短いネットワークを終了するために、Null SOPを追加して、Room Map Frame SOPの出力に接続します。Nullの名前を
GEO_WINDOW
などに変更し、青の Display/Render フラグをオンにします。
上の図では、それぞれ頂点に3つの軸があり、赤のtangentu
(Utan)ベクトルと緑のtangentv
(Vtan)ベクトルを表しています。青のベクトルは、tangentu
とtangentv
の外積で、グリッドの法線を表します。青のベクトルの方向が示すのは、グリッドのどちら側にマップが示されるのかといったことです。ノードの様々なチェックボックスを使用して、オブジェクトのジオメトリを変更することなく、マップの方向を変更できます。ただし Use Up Vector を使用すると、頂点順が一貫していない場合に起こる多くの問題を解決することができます。
ステージセットアップ ¶
以下では、ごく基本的なLOPセットアップでSOPネットワークをUSD ステージ にインポートして、プレビューを作成します。
-
stage レベルで、⇥ Tabを押してSOP Import LOPを作成します。
-
SOP Path には、 obj ネットワークの
GEO_WINDOW
Nullを指定する必要があります。上記の手順に従った場合、パスは/obj/geo/GEO_WINDOW
になります。または、ノード選択アイコンをクリックし、GEO_WINDOW
に移動します。 -
Material Library LOPを追加し、その入力をSOP Import LOPの出力に接続します。
また最終レンダリングには、Camera LOP、Karma Render Settings LOP、USD Render ROPノードも必要です。
The Karma Room Mapシェーダ ¶
Houdini 20では、マテリアルは特定のSubnet VOP内部で作成されます。サブネットを作成してその中に入ると、タブメニューに表示されるのは選択したサブネットで動作するシェーダノードのみです。全体的なシェーダネットワークはこのようになります(作成の手順は以下で説明します)。
-
Material Library LOPをダブルクリックして、その中に入ります。
-
タブメニューから、
Karma Material Builder
を選択します。このノードもダブルクリックして、その中に入ります。サブネットが複数のノードによって事前設定されています。mtlxdisplacement
ノードは削除してもかまいません。 -
Karma Room Map LOPを追加し、
out
出力をMaterial_Outputs_and_AOVs
ノードのnext
入力に接続します。 -
File パラメータでマップを選択することができます。デフォルトでは、
karma/roommap_debug.exr
エントリがあります。現時点では、このマップにしておきます。ノードの最初の3つの入力には、Room Map Frame SOPからのジオメトリアトリビュートが必要です。インテリアマップの正確な投影のために、SOPノードが窓のスケール、位置、方向を分析します。
-
窓のアトリビュートをシェーダにバインドするには、 3つ のMtlX Geometry Property Value VOPを追加します。それらの
out
ピンをシェーダのposition
、tangent
、bitangent
入力に接続します。 -
3つすべてのMtlX Geometry Property Value VOPで、 Signature を Vector 3 に設定します。
-
3つの Geomprop パラメータは、
roomP
、tangentu
、tangentv
です。
MtlX Standard Surface ¶
これで、Karma Room MapシェーダをMtlX Standard Surface VOPに接続できるようになりました。マテリアルによって、反射、色、明るさがライティング状況と一致する、リアルな印象を作成できます。
-
Karma Room Mapシェーダの
out
出力を、マテリアルのbase_color
入力に接続します。 -
シェーダの
normal
出力を、マテリアルのnormal
入力に接続します。 -
窓のガラスの効果を作成するために、MtlX Normal VOPを追加して、マテリアルの
coat_normal
入力に接続します。 -
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 Position と Slice Scale を使用して、スライスの外観を定義します。
-
インテリアを変更するには、 File で独自のファイルをロードします。
複数の窓枠 ¶
単一の窓のセットアップでは、1つの窓を扱う方法を示しましたが、窓は複数の要素で構成されることもあります。Karma Room Boxシェーダは、複雑で非平面の配置にもインテリアを投影することができます。roomID
Primitiveアトリビュートが、同じ窓に属する要素をシェーダに伝えます。シェーダはこのアトリビュートを探すため、追加のMtlX Geometry Property Value VOPを接続する必要はありません。
Note
このシーンは、単一の窓のセットアップをベースにしています。先に進む前に、このガイドの上記の手順に従ってください。
SOPセットアップ ¶
この例では、元のグリッドをコピーして合計3つの窓枠を作成します。
-
obj レベルで、
geo1
ノードの中に入り、grid1
を選択します。 -
Scale を
1, 2
に変更し、縦長の長方形にします。 -
タブメニューから、 2つ のTransform SOPを追加します。
grid1
の出力をtransform1
およびtransform2
の入力に接続します。これで2つのブランチができ、各ブランチ/トランスフォームノードには元のグリッドのコピーが含まれています。 -
1番目の トランスフォームで、 Translate を
-1, 0, -0.25
、 Rotate を0, -30, 0
に設定します。 -
2番目の トランスフォームで、 Translate を
1, 0, -0.25
、 Rotate を0, 30, 0
に設定します。 -
Merge SOPを追加し、その入力にグリッドノードとトランスフォームノードを接続します。
-
Merge SOPの出力を
roommapframe1
の入力に接続します。すると、以下のようになるはずです。
roomIDアトリビュート ¶
Solarisに切り替えてプレビューレンダリングを行なうと、すべての窓枠に独自のテクスチャがあることが確認できますが、マップはガラスの前面全体に広げる必要があります。
-
Attribute Wrangle SOPを追加し、それを
merge1
とroommapframe1
の間に配置して、 1番目 の入力に接続します。 -
VEXpression フィールドで
i@roomID = 100;
と入力し、同じIDをすべての窓枠に割り当てるアトリビュートを作成します。 -
Run Over ドロップダウンメニューから、 Primitives を選択して
roomID
アトリビュートをガラスの窓枠に適用します。 -
roommapframe1
を選択します。 Window Mode を Attribute に変更し、 Primitive Attribute をロック解除します。デフォルトのエントリはroomID
で、これはWrangleのアトリビュートと一致します。また、青と赤のベクトルの方向が変わっていることが分かります。 -
ガラス前面の凸型の面にインテリアマップが表示されるようにするには、 Invert U をオンにします。
LOPの部分は変更する必要がなく、プレビューのレンダリングを開始することができます。以下のような画像が表示されるはずです。画像は、3つの異なる表示角度を示しています。
複数の階 ¶
前の例のガラス前面をコピーして、オフィスビルのような複数の階を作成し、それぞれの階に異なるインテリアが表示されるようにします。窓のジオメトリから始めます。以下のようなネットワークを作成します。
-
obj レベルで
geo1
ノードの中に入ります。 -
Line SOPを追加し、階数を決定します。この例では、 Length は
6.25
で、 Points は4
です。 -
既存のAttribute Wrangleを削除し、新しいノードを1つ作成します。その 1番目 の入力をLine SOPの出力に接続します。
-
VEXpression は
i@roomID = @ptnum + 200
です。新しい@ptnum
アトリビュートにより、Lineのポイント数が追加されます。現在、roomID
は窓のポイントにコピーされています。これは、後の手順で変更します。 -
Copy to Points SOPを追加します。その 1番目 の入力を
merge1
の出力に接続します。 2番目 の入力をcopytopoints1
の出力に接続します。 -
Attribute Promote SOPは、
roomID
アトリビュートを窓にコピーします。その入力をcopytopoints1
の出力に接続します。 -
Original Name に、
roomID
と入力します。 -
New Class を Primitive に設定します。
-
roommapframe1
の出力をattribpromote1
の入力に接続します。
Null SOPの青の Display/Render フラグをオンにすると、4つの階が表示されます。各階に3つの窓があります。また、roomID
番号も表示されています。表示されていない場合は、roommapframe1
を選択して Visualize をオンにします。
マップをランダム化する ¶
Karma Room Mapシェーダには、ファイルシーケンス内の別のテクスチャに切り替えるための {Slice} Offset UDIM パラメータがあります。ファイルシーケンスは、名前と拡張子は同じですが、UDIMインデックスが異なる複数のマップで構成されています。例えば、次のようになります。
-
interior.1001.exr
、interior.1002.exr
、interior.1003.exr
、interior.1004.exr
レンダリングエンジンにファイルシーケンスを認識させるには、トークンでインデックスを置き換えます。
-
interior.<UDIM>.exr
この共通の表記方法をシェーダの File パラメータのファイル名として使用します(ファイルを指すパスも必要であることに注意してください)。 Offset UDIM スライダを使用してマップを変更すると、すべての階に同じマップが適用されていることも分かります。階毎に異なるマップを使用したい場合は、マップをランダム化する必要があります。
解決策の1つは、窓の位置を格納するroomP
アトリビュートを通してボロノイノイズを駆動することです。デフォルトでは、同じマップが数回適用される可能性が高いです(特に窓がいくつかあるセットアップで)。それを修正するには、係数を用いてボロノイノイズを制御しますが、値が高いほどよりランダムになります。この概念を示したものが、以下の比較です。係数を使用しない場合、隣接したボロノイセルは同じ色になることが多く、同一のマップになる可能性が高まることが分かります。右の画像は係数が100
で、ばらつきが多くなっています。
以下は、ノイズを使用してマップをランダム化する方法です。
-
stage/materiallibrary1/karmamaterial
の中に入ります。 -
MtlX Multiply VOPを追加し、
in1
をroomP
アトリビュートを含むMtlX Geometry Property Valueノードのout
に接続します。 -
Input 2 に
50, 50, 50
と入力します。窓は4つだけなので、インテリアマップをランダム化するにはこのくらいの値から始めるのが良いでしょう。 -
Karma Voronoi Nose 3D VOPを配置します。
position
をmtlxmultiply1
ノードのout
に接続します。ボロノイセルの位置ベクトルは、
p
出力で利用可能です。シェーダのUDIMパラメータを駆動するには、ベクトルを再度コンポーネントに分割する必要があります。 -
MtlX Separate Vector 3 VOPを追加して、コンポーネントを取得します。ノードの
in
入力をボロノイノイズのp3
に接続します(通常、p3
の方がよりランダムになります)。 -
MtlX Range VOPを追加します。このノードは、入力値をリマップします。その
in
入力をMtlX Separate VOPのoutx
に接続します。MtlX Range VOPに、 Outhigh パラメータがあります。値は、利用可能なマップの数と一致する必要があります。この例では、4つの窓に4つのマップがあるため、パラメータの値は4
です。 -
out
ピンをシェーダのroom_offset
入力に接続します。
以下の図のようなネットワークになっているはずです。
スライスをランダム化する ¶
スライスでインテリアにレイヤーを追加すると、空間がより奥深い印象になります。シェーダのパラメータを開いて Slice {n} をオンにすると、 Slice Offset UDIM パラメータが表示されます。インテリアマップにスライスがある場合、スライダを使用してスライスをスワップすることができます。インテリアマップには最大4つのスライスを含めることができます。
マップをランダム化する方法を使用して、 Slice Offset UDIM パラメータを駆動することができます。
-
必要な作業は、MtlX Range VOPをさらに追加して、MtlX Separate 3ノードの
out[xyz]
出力に接続するだけです。 -
その後、MtlX Range VOPの Outhigh パラメータを
4
(マップ毎の最大スライス数)に設定します。空のスライスには黒の背景があり、完全な透明とみなされます。 -
MtlX Range VOPの
out
ピンを、シェーダのslice{n}_offset
入力に接続します。
以下に示す3つのビューは、複数の窓と階でランダム化したインテリアマップです。
カーブした複数の窓枠 ¶
Karma Room Mapシェーダは、複雑なカーブのある窓もサポートします。近代的な建物や、有機的な形状をしたガラスの前面を作成することができます。以下の例では、カーブした窓をポリゴンカーブから作成しています。
SOPセットアップ ¶
窓のジオメトリは、2つのポリゴンカーブで作成されます。カーブ間の空間がポリゴンで埋められて、ソリッドオブジェクトになります。なお、以下のガイドは、考え方を説明するための基本の方法です。
-
obj レベルで、タブメニューを開いてGeometry OBJノードを作成します。ノードをダブルクリックして、その中に入ります。
-
Geometryノード内で、Curve Bezier SOPを作成します。ビューポートにマウスカーソルを移動し、2を押して Top ビューを開きます。次に、Enterを押して描画モードに入ります。
-
ノードの Primitive Type が Polygon に設定されていることを確認します。
-
を使用してポイントを描画します。ポイントが多いほど、滑らかなサーフェスになります。再度Enterを押して、カーブの描画を終了します。
-
Line SOPを追加し、 Length を
2
(またはその他の値)に設定します。 -
Copy to Points SOPは、カーブをラインのポイントにコピーします。
-
Copy to Points SOPの 1番目 の入力をカーブノードの出力に接続します。 2番目 の入力はラインの出力に接続します。
-
Skin SOPを追加して、カーブ間にポリゴンを作成します。 1番目 の入力を、コピーノードの出力に接続します。
-
Fuse SOPで、ポイント同士をスナップしてジオメトリをクリーンアップします。
これで、マップの投影のためのソリッドオブジェクトが作成されました。残りの手順は、前の例と同じです。
-
Karma Room Map Frame SOPは、関連するすべてのアトリビュートを追加します。そのノードを追加して、入力をネットワークの最後のノードの出力に接続します。ここでカスタムの
roomID
アトリビュートを作成する必要はありません。すべてのポリゴンが共通のroomID
値の0
を持つようにする必要があります。 -
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>は同じ向きになっています。primbasis
を0
に設定すると、 右 の画像のように、すべてのベクトルが左下の窓の要素と揃います。primbasis = 2
の場合、右下の要素から参照ベクトルが取得されます。
トラブルシューティング ¶
Karma Room Frame SOPは、窓のジオメトリから複数のアトリビュートを作成します。アトリビュートは、インテリアマップを正確に投影するために欠かせません。エラーのよくある原因は、頂点順が正確でないことや、外部DCCからのジオメトリに不具合があることです。Room Map Frame SOPのオプションを使用して、多くの問題を修正することができます。以下を試してみましょう。
-
ジオメトリの頂点順が一貫していない場合、 Use Up Vector を使用する
-
マップが反転または回転している場合や、マップが窓の“反対”側に投影されている場合、接線ベクトルを反転およびスワップする
-
Reverse SOPを使用して、すべての面の頂点順を逆順または周回させる
-
窓のジオメトリをできる限りクリーンおよびシンプルに保つ
-
Fuse SOPでジオメトリをクリーンアップする