Utility ノード 3

Light Info ノード

Light Info ノードによってサンプル点に対するライトの情報を得ることができます。
主なアトリビュートは以下のとおりです。

pointCamera
サンプル点の位置
lightPosition
光源の位置
lightDirection
光源からサンプル点への向き
SampleDistance
光源からサンプル点までの距離

その他の Utility ノード

Distance Between
2 点間の距離を出力
Plus Minus Average
複数の値を加減算
Multiply Divide
3 つまでの値を乗除算
Clamp
入力値を一定の範囲にして出力する

Light Info ノードの使用例

Light Info ノードを使って、 Raytracing のソフトシャドーをシュミレーションするシェーディングネットワークを Depth Map Shadow によって作成してみましょう。

Raytracing のソフトシャドーのように、 オブジェクトから遠ざかるにつれて影の色とボケ具合が変化してゆくようにするために、 ロケーターを 3 つ作り、 ライトと同じ位置に 1 つ、オブジェクトのある床に 2 つを配置しておきます。 サンプリングされている点までの距離(sampleDistance)が ライトから他の 2 つのロケーターまでの距離(startDistance, endDistance)の間にあるときに 徐々に影の色とボケ具合を変化させてゆきます。

ソフトシャドーの原理

(sampleDistance - startDistance) ÷ (endDistance - startDistance ) の計算結果を Ramp ノードの入力として使用して、 影の色とボケ具合をコントロールします。

  1. 適当にシーンを作成します。
    サンプルシーン
  2. ライトを作成し、Depth Map Shadow にチェックをいれておきます。
    ライトのあるシーン
    ライトのあるシーン
  3. Locator を 3 つ作成し、それぞれに lightLocator, startLocator, endLocator という名前をつけておきます。
    Outliner
  4. lightLocator はライトに Point Constrain して同じ位置になるようにしておき、 startLocator はオブジェクトと同じ位置、 endLocator はライトの反対側の板上に配置します。
    Locator のあるシーン
  5. distanceBetween ノードを作成します。
    作成された distanceBetween ノードの名前を startDistance に変更しておきます。
  6. lightLocator と startLocator を startDistance にコネクトします。
    lightLocator の Center(または worldPosition[0]) を startDistance の point1 に、 startLocator の Center(または worldPosition[0]) を startDistance の point2 にコネクトします。
    startDistance ノード
  7. 2 つ目の distanceBetween ノードを作成します。
    作成された distanceBetween ノードの名前を endDistance に変更します。
  8. lightLocator と endLocator を endDistance にコネクトします。
    lightLocator の Center(または worldPosition[0]) を endDistance の point1 に、 endLocator の Center(または worldPosition[0]) を endDistance の point2 にコネクトします。
    endDistance ノード
  9. Light Info ノードを作成します。
  10. ライトの worldMatrix を Light Info ノードの worldMatrix にコネクトします。
    Light Info ノード
  11. Plus Minus Average ノードを作成します。
    名前を startEndDistance に変更しておきます。
  12. endDistance ノードと startDistance ノードを startEndDistance にコネクトします。
    endDistance ノードの distance アトリビュートを startEndDistance の input1D[0] に、 startDistance ノードの distance アトリビュートを startEndDistance の input1D[1] にコネクトします。
    Connection Editor でうまくいかないときは、 以下の MEL コマンドを実行します。
    connectAttr endDistance.distance startEndDistance.input1D[0];
    connectAttr startDistance.distance startEndDistance.input1D[1];
    startEndDistance ノード
  13. startEndDistance の Operation を Subtract にしておきます。
  14. 2 つ目の Plus Minus Average ノードを作成します。
    名前を startSampleDistance に変更しておきます。
  15. startDistance ノードと Light Info ノードを startSampleDistance にコネクトします。
    Light Info ノードの sampleDistance アトリビュートを startSampleDistance の input1D[0] に、 startDistance ノードの distance アトリビュートを startSampleDistance の input1D[1] にコネクトします。
    Connection Editor でうまくいかないときは、 以下の MEL コマンドを実行します。
    connectAttr lightInfo1.sampleDistance startSampleDistance.input1D[0];
    connectAttr startDistance.distance startSampleDistance.input1D[1];
    startSampleDistance ノード
  16. startSampleDistance の Operation を Subtract にしておきます。
  17. Multiply Divide ノードを作成します。
    アトリビュートエディタを開き、Operation を Divide にしておきます。
  18. startEndDistance ノードと startSampleDistance ノードを Multiply Divide ノードにコネクトします。
    startEndDistance ノードの output1D と startSampleDistance ノードの output1D を Multiply Divide ノードの input1X と intpu2X にコネクトします。
    Multiply Divide ノード
  19. Clamp ノードを作成します。
    Multiply Divide ノードの出力からは 1.0 以上と 0.0 以下の値が出力されてしまうので Ramp ノードに入力するために Clamp ノードを使用します。
  20. Multiply Divide ノードの output を Clamp ノードの input にコネクトします。
    Clamp ノード
  21. Clamp ノードの Max を (1.0, 0.0, 0.0) にしておきます。
    これによって、入力値が 1.0 以上の場合は出力が 1.0 に、 0.0 以下の場合は出力が 0.0 になります。
  22. Ramp ノードを作成します。
    このノードは影の色をコントロールします。
  23. Clamp ノードの outputR を Ramp ノードの vCoord にコネクトします。
    Clamp ノードと Ramp ノード
  24. Ramp ノードの vCoord が 0.0 の場合の色を RGB で (-0.5, -0.5, -0.5) に、 vCoord が 1.0 の場合の色を RGB で (0.5, 0.5, 0.5) にしておきます。
    Ramp ノード
  25. Ramp ノード の outColor をライトの shadowColor にコネクトします。
  26. 2 つ目の Ramp ノードを作成します。
    このノードはボケ具合をコントロールします。
  27. Clamp ノードの outputR を Ramp ノードの vCoord にコネクトします。
    Clamp ノードと 2 つ目の Ramp ノード
  28. Ramp ノードの vCoord が 0.0 の場合の色を RGB で (32, 32, 32) に、 vCoord が 1.0 の場合の色を RGB で (2, 2, 2) にしておきます。
    Ramp ノード
  29. Ramp ノード の outColorR をライトの dmapFilterSize にコネクトします。
    Ramp ノード
  30. ここまででシェーディングネットワークは以下のようになります。
    Ramp ノード
  31. レンダリングを実行します。
    Ramp ノード
    (普通の Depth Map Shadow)
    Ramp ノード
    (Raytracing のソフトシャドー)
    Ramp ノード

参考


Index | Home
Mail