| On this page |
太陽光が照射されている領域を特定し、その結果をマスクレイヤとして保存することができます。 この情報は、散乱効果、テクスチャリング、煙霧や霧のような大気現象に役立ちます。 基本的な考え方は、光源の方向を取得して、それが地形上のどこに当たって照射しているのかを調べることです。 下図では、マスクされた領域に散布ポイントがあるのが分かります。
Note
この解は、地平線からの太陽の高度などのいくつかの要素が考慮されていないので、近似値に過ぎません。 かといって、それらを考慮する方法は存在するものの、より複雑な手法が求められてしまいます。
任意のHeight Fieldを作成します。 ここでは、地形の高低差は問題ではありません。 地形データの作成方法について学びたいのであれば、Height FieldイントロダクションのゼロからHeight Fieldを生成するの章をお読みください。
光源 ¶
マップを計算するには光源も必要になります。 これは物理的な光源ではなくて、光線の方向を決定する単なるオブジェクトです。
-
Sphere SOPまたは任意のジオメトリを追加します。
-
Center パラメータで、そのオブジェクトの位置を設定します。 このパラメータをアニメーションさせることで、時間の経過に伴ってマップがどのように変化するのかを確認することができます。
-
そのオブジェクトがシーン内で特定しにくい場合は、 Uniform Scale パラメータを上げてください。
スクリプト ¶
以下のスクリプトは、volumegradient関数によって地形の法線を計算します。
法線ベクトルと光源方向を用いて内積を計算します。
その内積は、2つのベクトル間の角度を算出し、スカラー値を返します。
そのスカラー値を用いてマスクを定義することができます。
以下のスクリプトを適用するために、まずHeightField Wrangle SOPを配置します。
その 1番目 の入力を、地形を生成したノード(例えば、
HeightField Noise SOPや
HeightField Erode SOP)の出力に接続します。
次に、⌃ Ctrl + Cと⌃ Ctrl + Vを使用して、以下のスクリプトをそのHeightField Wrangle SOPの VEXpression パラメータにコピー&ペーストします。
// カスタム光源パラメータ vector light_pos = chv("light_pos"); float light_intensity = chf("light_intensity"); vector pos = @P; // 光源の方向を取得します。 vector to_light = normalize(light_pos - pos); // Height Fieldの法線と照明を計算し、 // その最大値のみを使用します。 vector normal = volumegradient(0, "height", pos); float illumination = max(0, dot(normal, to_light)); // 照明と強度を乗算します。 // マスクを反転させて、日照領域を取得します。 @mask = 1 - illumination * light_intensity;
カスタムパラメータのlight_posとlight_intensityを作成するために、そのHeightField Wrangle SOPの Create spare parameters for each unique call of ch() ボタンをクリックします。
Light Pos パラメータには、光源の Center 値を転送するのが良いでしょう。
-
Sphere SOPの Center パラメータを右クリックします。 コンテキストメニューから Copy Parameter を選択します。
-
次に、HeightField Wrangle SOPの Light Pos パラメータを右クリックして、 Paste Relative References を選択します。 この選択によって、その球体の位置をその Light Pos パラメータに転送するエクスプレッションが追加されます。 球体の位置を変更すると、その Light Pos パラメータも自動的に更新されます。
Light Intensity パラメータは、マスク値をスケールさせる係数です。
マスクの処理 ¶
マスクの柔らかさやサイズを制御できるように、HeightField Mask Blur SOPをネットワークに追加することを推奨します。
また、HeightField Copy Layer SOPを使用してカスタムマスクを新規レイヤ(例えば、
lightmap)に保存することもできます。
これによって、a)マスクを分離して上書きを防ぐこと、b)必要に応じてレイヤを可視化することができます。