| 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 SOPや
Scatter and Align SOPによる散乱ポイント
-
Primitive Type が Points に設定されたベースジオメトリ
-
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")`_@elemnumstage レベルに戻ると、散乱ポイントの位置にライトのギズモが出現します。 プレビューレンダリングを開始したいのであれば、ビューポートの右上コーナーにある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のアクティブなアトリビュートをランダム化します。
この場合では、 Color と Intensity をランダム化したいです。
実際には、アトリビュートにランダムさを加える方法は無数にあります。
その一つが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 までのランダムな強度を定義することができます。
例えば、2と6に設定します。
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 LOP、
Area 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ベースのメソッドと同様の操作が可能で、orientationやpscaleを作成することができます。
しかし、カラーや強度などのライト独自のプロパティを変更したい場合は、別の方法(例えば、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に追加することができます。
括弧内の処理は、別のリマッピング処理です。
このコードは、インスタンス化されたライト毎に乱数を生成します。
この値に基づいて、カラーが選択され、適用されます。
ここで重要なのは、@primvarにv接頭辞を付けることで、それがベクトルとして明示的に取り入れられるということです。
カラーは3つのコンポーネントから構成され、ベクトルと見なされます。
chramp()の部分にはvector()の型変換が付けられています。
このちょっとしたテクニックで、そのパラメータのUIには浮動小数点数ランプの代わりにカラーランプが追加されます。