2009年01月02日

光の距離減衰モデル

光源の減衰モデルについて考えてみる。

と、その前にもう年が明けていたんだった。あけましておめでとうございます。本年も地道なバグフィックスと改良のバージョンアップを続けていければと思っていますので、よろしくお願いします。

で、結局年末年始に行うある程度大きな改良項目は複数光源への対応ということになりました。単一の平行光源だけでは拡散光が0、つまり光源と反対側の陰となる部分の凹凸がわかりづらく、純粋なモデラーとしても不都合であるという意見は昔からあったので、その対応ということになります。

ですが、どうせなら他の統合ソフトやレンダラーへ光源情報を持っていきやすい形式にしたほうがいいでしょう。そこで問題になるのが点光源の距離による減衰が各ソフトでどのようになっているか。
自然界での物理モデルでは距離の2乗に反比例して減衰するとされていますが、まずリアルタイムプレビューでのDirect3DとOpenGLを見てみましょう。

Direct3D(シェーダ以前の固定パイプラインのライト)やOpenGLでは距離Dに対して3つの減衰パラメータa,b,cを用いて
A = 1 / (a + D*b + D*D*c)
の計算式が適用され、Direct3Dでrangeで最大距離を指定できる他は同一なようです。cのみを用いてれば自然界のモデルと同等に扱うことができます。しかしこの式ではどれくらいの距離で光がどの程度減衰するかが直感的にわかりづらく、ユーザーにとってパラメータ指定するのが難しい気がします。

次、Mayaの場合、
http://me.autodesk.jp/wam/maya/docs/Maya2009/index.html?url=Lighting_nodes_Area_Light_Attributes.htm,topicNumber=d0e560836
距離が1単位未満なら減衰なし、それ以上なら1〜3乗のいずれかを選択して減衰率の値に応じて減衰する、とある。式に表すと
A = 1 / max(1, a * pow(D, power_num))
となるのだろうか。3乗も選択できる以外には、OpenGLとおおむね同じと言える。
あと、強度カーブを自由に編集して好きな減衰度合いを適用もできるらしい。

PovRayの場合、
http://www.arch.oita-u.ac.jp/povjp/povjp/html/pov35ref_light.html#sec7500
距離の2乗に固定されず、face_distanceとface_powerの2つのパラメータを用いて
A = 2 / (1 + (D / face_distance) ^ face_power)
で表現される。
自由度は高いがやはり直感的ではないような?

XSIの場合、
http://www.f-tai.com/school/archive/cad3/memo04.htm
減衰をlinearにした場合は開始位置と終了位置を指定するようだ。linearだと物理モデルには反するが、明示的に距離を指定できるのでわかりやすい。linear以外は何があるのだろうか?

Blenderの場合、
http://wiki.blender.org/index.php/Manual/Lamp
減衰モデルは1次線形、2乗式、1次線形と2次式の両方、カスタムカーブの4種類。両方のモデルの場合、
A = energy * (d / (d + a*D)) * (d*d / (d*d + b*D*D))
OpenGLとやや似ていますが、単位距離dを設定できること、1次と2次の項は独立していて積算されること点などで違いがあることが分かります。

と、少し調べただけで減衰の計算モデルに色々あることがわかりました。XSIのlinear以外はどれも直感的ではなく、結局のところ慣れが必要なのでしょうか。さて一体どれを採用したものやら。
posted by O.Mizno at 17:58| Comment(0) | TrackBack(0) | CG
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/25079825

この記事へのトラックバック