Houdini 21.0 SolarisとKarma

ライトのインスタンス化

散乱ポイントから何千ものライトを作成する。

On this page

ライトのインスタンス化は、何百、何千もの個々のライトでシーンを照明する便利な方法です。 ポイントを使用して、それらのライトの出現場所を決めます。 この方法は、街路、建物、遊園地、空港、その他多数のライトを必要とする場面に適しています。 また、ライトの強度や色などのプロパティを制御したり、ランダム化することも可能です。

基本的な考察

Houdiniではいつもそうですが、目的を達成するためにいくつかの方法があり、ライトのインスタンス化も例外ではありません。 例えば、Instancer LOPにプロトタイプの光源を使用して、VEXによってプロパティを制御することができます。 他にさらに便利な方法は、SOPネットワーク内でシーンをセットアップし、USD Configure Prims from Points SOPを使用して光源をランダム化することです。

このUSD Configure Prims from Points SOPは、アトリビュート/Primvarの編集だけでなく、プリミティブタイプの決定にも使えます。 これは、ポイントクラウドがSolarisで特定のタイプのプリミティブ(例えば、ライトやキューブ)を作成する情報を持っていることを意味します。 プリミティブのタイプを選択すると、このノードにはそのプリミティブのアトリビュートを調整するためのパラメータが用意されます。ライトの場合、色や強度を直接決めることができます。

HoudiniのScatteringに詳しいのであれば、この工程は基本的にUSD固有のアトリビュートを散乱ポイントに追加していることがすぐに分かることでしょう。

散乱ポイント

Solarisの stage コンテキストで、SOP Create LOPを配置します。 次に、そのノードの Import Path Prefix パラメータを見つけて、それを必要なものに変更して、Scene Graph Treeにエントリを作成します。 すべての光源は、このパス下にグループ化されます。 この例では、パスは/World/lightsです。

SOP Create LOPをダブルクリックして中に入ります。 最初の手順は、ポイントソースの配置です。 それらのポイントが最終的にライトが出現する場所を決定します。 ポイントソースには どのようなポイントも 使うことができますが、USDのConfigure Prims from Points SOPで使用するには、すべてのポイントソースが浮遊ポイントであるという共通条件を満たしている必要があります。 浮遊ポイントソースの典型的な例:

  • Scatter SOPScatter and Align SOPによる散乱ポイント

  • Primitive TypePoints に設定されたベースジオメトリ

  • POPシミュレーションのポイント

このガイドの画像は、Circle (Polygons) SOPでポイントを作成しました。 Circle SOPにはポイントモードがないため、(例えば、Primitive Wrangle SOPを使用して)ポリゴンを手動で削除する必要がありました。 以下の一行コードは、Primitive Wrangle SOPの 1番目 の入力のオブジェクトのポリゴンを削除します:

removeprim(0, @primnum, 0);

ライト

さらに、そのSOP Create SOPの中で、USD Configure Prims from Points SOPを追加し、その入力を最後の上流ノードの出力に接続します。 Prim Type ドロップダウンメニューを開いて、利用可能なプリミティブを確認します。 そのリストから RectLight を選択して、矩形エリアライトを作成します。 Prim Type Attributes セクションを見ると、そこにあるパラメータが修正可能であることが分かります。 Color トグルと Intensity トグルをオンにします。

そして、 Path パラメータと Name パラメータの どちらか がオンになっていることを確認してください。 それがUSD Configure Prims from Points SOPの必須要件です。 デフォルトのパスを使用したくない場合は、その Path パラメータも入力してください。 接頭辞は、SOP Create LOPの _Path Prefix に合わせてください。 この例のシーンでは、正しいパスは以下のとおりです:

/World/lights/`chs("primtype")`_@elemnum

stage レベルに戻ると、散乱ポイントの位置にライトのギズモが出現します。 プレビューレンダリングを開始したいのであれば、ビューポートの右上コーナーにある1番目のドロップダウンメニュー(デフォルトでは Perspective に設定されています)からKarmaデリゲートを選択します。 最終的にライトを確認するには、グリッドなどの背景に対してレンダリングする必要があります。

Scene Graph Treeには、そのUSD Configure Prims from Points SOPの Path 下にグループ化されたライトのコピーが表示されます。 現在、それらのコピーはどれも同じ色と強度を持っています。 もしかしたら、ライトの向きにも不満がありますか?

向き

ライトの向きを変えるために、再びSOP Create LOPの中に入ります。 便利な方法の1つは、USD Configure Prims from Points SOPの 上流に Scatter and Align SOPを使用することです。 Scatter and Align SOPの面白いところは、向きだけでなくスケールも調整できることです。 もちろん、VEXスクリプトや他の方法を適用することもできます。

  • Scatter and Align SOPを配置して、その 両方 の入力にポイントソースを接続します。そして、そのScatter and Align SOPの出力をUSD Configure Prims from Points SOPの入力に接続します。

  • そのScatter and Align SOPの Mode ドロップダウンメニューを開いて、 Add Attributes to Existing Point Clouds を選択します。

  • Orientation タブのパラメータを使用して、回転角度と整列軸を調整します。

ランダム化

これから、USD Configure Prims from Points SOPのアクティブなアトリビュートをランダム化します。 この場合では、 ColorIntensity をランダム化したいです。 実際には、アトリビュートにランダムさを加える方法は無数にあります。 その一つがAttribute Adjust系SOPを使う方法です。これらのSOPには様々な設定が事前に用意されています。 Prim Type Attributes セクションの各パラメータの横にアイコンがあります。 これをクリックすると、USD Configure Prims from Points SOPがそのパラメータに適切なAttribute Adjust SOPを作成します。 例えば、Attribute Adjust Color SOPが作成され、intensityのようなアトリビュートにはAttribute Adjust Float SOPが作成されます。 このボタンは、アトリビュートのシグネチャを気にする必要がないので、とても便利です。

Color 値の場合、ボタンをクリックすると、下流にAttribute Adjust Color SOPが作成されて接続されます。

作成されたAttribute Adjust Color SOPの Adjustment Value セクションの Pattern Type パラメータを Random に変更します。 これで、 Color Ramp を定義したり、 Presets のいずれかを適用することができます。

Intensity 値の場合、ボタンをクリックすると、新しくAttribute Adjust Float SOPが作成されます。 General セクションの Attribute Name パラメータにintensityと入力します。 次に、 Adjustment Value セクションに進み、 Pattern Type パラメータを Random に設定します。 Min Value から Max Value までのランダムな強度を定義することができます。 例えば、26に設定します。 Remap Ramp を使用すると、強度をより細かく制御することができます。 USD Configure Prims from Points SOPの Intensity パラメータは、ランダム値の乗数として作用します。

もちろん、Color、Intensity、その他の利用可能なパラメータを組み合わせて、完全にランダムなライトの配列を得ることができます。

選択的なランダム化

散乱ポイントは、他のポイントソースと同様に扱うことができ、グループを作成することができます。 USD Configure Prims from Points SOPには、 Groups パラメータが備わっています。 グループを使用してポイントソースを分割することで、各部分を個別に扱うことができます。 適切な数(グループ毎に1個)のUSD Configure Prims from Points SOPが必要です。 Group SOPの高度な Keep by パラメータを使用すれば、法線やエッジのような特定のプロパティに基づいてグループを定義することができます。

Note

Group SOPはUSD Configure Prims from Points SOPから 上流 に追加する必要があります。

例えば、異なるカラーのライトを作成するために、複数のグループを扱う場合は、ライトを分けるために Path を変更する必要があります。 その理由は、デフォルトでは、ライトプリミティブにインデックス(@lemenum)が付与されるからです。 ライトを分けなかった場合、それらのインデックスが上書きされ、一部のライトがレンダリングに表示されなくなります。 青色と黄色のライトがあるシーンを想像してみてください。 このような場合、以下のようなパス定義が考えられます:

/World/lights/`chs("primtype")`_B_@elemnum
/World/lights/`chs("primtype")`_Y_@elemnum

あるいは、以下の例のようにライトに2つのブランチを作成することもできます:

/World/lights/blue/`chs("primtype")`_@elemnum
/World/lights/yellow/`chs("primtype")`_@elemnum

以下の画像は、Group by Range SOPを適用した結果の例です。 2つおきに光源が黄色になっています。

インスタンス化

Houdiniに詳しい方であれば、各光源はインスタンスではなく、本当のコピーであることにお気づきでしょう。 物理的なコピーは常に多くのリソースを必要とします。 また、Instancer LOPArea Light LOP、何かしらのVEXを使用する高度(だけど不便)な方法もあります。 光源はいわゆるプロトタイプです。 プロトタイプとは、インスタンス化されるプリミティブのことです。

このワークフローでは、SOPネットワークで散乱ポイントを作成する必要もあります(例えば、Instancer LOPの中で直接ポイントを作成します)。 それから、ライトノードをそのInstancer LOPの 2番目 の入力に接続することで、ライトとポイントの接続を確立します。 Instancer LOPには、 Primitive Path パラメータも備わっており、そこでインスタンスをScene Graph Tree内のどこに(例えば、/World/lightsの下に)表示させるのかを定義することができます。 Scene Graph Treeでは、SOPベースで配置したライトとインスタンス化メソッドで配置したライトの表示に違いがあります。 インスタンス化メソッドで配置したライトは、Scene Graph Treeにライトプリミティブを含んだ長いリストの代わりに、/World/lights/Prototypes/lights/arealight1のような短いエントリのみが表示されます。

Pointアトリビュートに関しては、純粋にSOPベースのメソッドと同様の操作が可能で、orientationpscaleを作成することができます。 しかし、カラーや強度などのライト独自のプロパティを変更したい場合は、別の方法(例えば、VEXスクリプト)が必要です。

ライト固有のPrimvars

VEXスクリプトは、前の章でUSD Configure Prims from Points LOPが行なってくれたこと(ライト固有のPrimvarsの追加)を行ないます。

インスタンスをカスタマイズするには、Attribute Wrangle LOPが必要です。 そのノードを追加し、その 1番目 の入力をInstancer LOPの出力に接続します。 VEXコードを追加する前に、Wrangleの準備をする必要があります。

  • Run on Elements of Array Attributes をオンにします。 このオプションは、ライトインスタンス毎にVEXコードが実行されるようにします。 副次的な効果として、elemnumPrimvar(インスタンス毎に固有の識別子)にアクセスできるようになります。 この番号は、各インスタンスに個別に対応するために重要です。

  • アトリビュートを含んだ配列の長さも定義する必要があります:ライトの数を決定するのもポイントの数です。 Array Length ドロップダウンメニューから Number of Point Instances を選択します。

強度

以下のコードは、カスタマイズ可能な最小値と最大値の間で強度を変更します。

int intensity_seed = @elemnum + chi("intensity_seed");
@primvars:light:intensity = fit(random(intensity_seed), 0, 1, ch("min_intensity"), ch("max_intensity"));

⌃ Ctrl + Cで上記のコードをコピーして、⌃ Ctrl + VでAttribute Wrangle LOPの VEXPression 入力フィールドにペーストします。

このスクリプトは、ch()コマンドで閉じられた3つのカスタムパラメータから値を取得します。 これらのパラメータをUIに追加するために、 Creates spare parameters for each unique call of ch() ボタンをクリックします。 elemnumに基づいて、このスクリプトはrandom()関数を駆動するインスタンス毎に個別のシードを計算します。 random()は、0から1の間の数値を生成します。 一方、fit()関数は、乱数をmin_intensityからmax_intensityの範囲にリマップします。

重要なステートメントは@primvars:light:intensityです。 この定義は、intensityPrimvar/アトリビュートをポイント上に作成します。 この記法を用いると、以下のような他のいくつかのライトパラメータを扱うことができます:

  • 露出(exposure)

  • 幅(width)

  • 高さ(height)

  • 色(color)

  • 色温度 (colorTemperature)

  • 拡散乗数(diffuse)

  • スペキュラ乗数(specular)

カラー

ランダムなカラーを適用したいのであれば、以下のコードをコピー&ペーストしてください:

int color_seed = @elemnum + chi("color_seed");
v@primvars:light:color = vector(chramp("color_ramp", random(color_seed)));

chramp()関数は、新しいカスタムパラメータを記述し、ボタンでそのパラメータをUIに追加することができます。 括弧内の処理は、別のリマッピング処理です。 このコードは、インスタンス化されたライト毎に乱数を生成します。 この値に基づいて、カラーが選択され、適用されます。

ここで重要なのは、@primvarv接頭辞を付けることで、それがベクトルとして明示的に取り入れられるということです。 カラーは3つのコンポーネントから構成され、ベクトルと見なされます。 chramp()の部分にはvector()の型変換が付けられています。 このちょっとしたテクニックで、そのパラメータのUIには浮動小数点数ランプの代わりにカラーランプが追加されます。

SolarisとKarma

SolarisとUSD

  • USDの基本

    いくつかUSDの概念について取り上げ、それらの概念とHoudini USD対応との関係性について説明します。

  • LOPの挙動

    Solaris LOP(Lighting Operator)がUSDを生成/変更する際の挙動について説明します。

  • Solarisユーザインターフェース

    LOPネットワークとUSDデータを操作するためのユーザインターフェースの使い方を案内します。

  • プリミティブマッチングパターン

    USDプリミティブマッチング構文の使い方。

  • LOPとUSDの用語集

    USDわかりますか?

  • Solarisシーンビューア

    Houdiniオブジェクト/SOPビューアと比較したSolarisビューアの違い/拡張について説明します。

  • USDでのVEXの使い方

    スクリプトによってSolaris/USDをカスタマイズする。

  • USDへ書き出す方法

    USDデータをディスクに保存します。

  • SOP Geometry I/O

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

  • Component Builder

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

  • パフォーマンスTips

    Solarisのインタラクティブなワークフローを向上させます。

  • サンプルシーン

    SolarisとUSDを学習するのに役立つシーンとアセットを紹介します。

Karma

  • Karma

    Houdiniの物理ベースのUSDレンダラー。

  • Karma XPU

    Houdiniの高速でモダンなXPUレンダーエンジン。

  • カラーマネージメント

    OCIO、カラー空間、ガンマ、トーンマッピングについて詳しく学習します。

  • レンダリング統計

    進行中のレンダリングやレンダリング画像のレンダリングプロセスに関して、様々な統計情報を表示する方法。

Karmaユーザガイド

ルック開発

  • MaterialX

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

  • UDIMパス

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

  • シェーダ変換

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

  • Shotbuilderツール

    マルチショットパイプライン用便利ツール。

プロシージャル

補足ドキュメント