光のモデリング
レイトレーシングを用いてコンピュータグラフィックを生成する場合,
それらしく見せることが目的であれば,Phongの反射モデルなどを用いると,より少ない計算コストでグラフィックを生成できる.ただ,今回はある程度計算コストがかかっても,現実の物理現象に合うようなモデル化をしたいので,まずは光の物理現象について少し考えてみよう.
光がある物体の表面にぶつかった時,そのうち一部は透過され,一部は吸収され,その他は反射される.反射については理想的な鏡面反射と拡散反射の組み合わせとして表現するものとする.ここで,以下のようなパラメタを考えることで,それぞれの割合を表そう.
- α (absorptance) : 吸収される割合
- ρd (diffuse reflectance) : 拡散反射される割合
- ρs (specular reflectance) : 鏡面反射される割合
- σ (specularity) : 反射光のうち鏡面反射される割合
- τ (transmittance) : 透過される割合
これらのパラメタには以下の関係が成り立つ.
α+ρd+ρs+τ=1
σ=ρd+ρsρs
本来,これらのパラメタをスペクトルの関数として定義して,スペクトルごとにレイトレースをすれば物理現象に沿ったシミュレーションができるはずだが,これは計算量が膨大になってしまうので現実的でない.
そこで,シミュレーションをする場合には表面特性のパラメタとしては,σ,τ,およびRGBを用いることとして,σ,τはスペクトルによらないパラメタと仮定する.
absorptanceおよびスペクトル依存性に関しては,RGBを0.0–1.0の範囲で表したパラメタで代用し,反射光のRGBを,入射光と反射面のRGBを成分ごとに掛け算することで決定する.以下にいくつか例を示しておこう.
- 白い光[1.0, 1.0, 1.0]が赤い物体[1.0, 0.0, 0.0]にぶつかって反射された場合には,赤い光[1.0, 0.0, 0.0]が出てくる.
- 青い光[0.0, 0.0, 1.0]が白い物体[1.0, 1.0, 1.0]にぶつかって反射された場合には,青い光[0.0, 0.0, 1.0]が出てくる.
- 赤い光[0.0, 0.0, 1.0]が黒い物体[0.0, 0.0, 0.0]にぶつかって反射された場合には,黒い光[0.0, 0.0, 0.0]が出てくる.
鏡面反射(Specular Reflection)
鏡面反射の場合,入射光の方向がrin, 反射面の垂直方向がnと表されれば,
反射光の方向routは(3)のように表される.
rout=rin−2n(rin⋅n)
拡散反射(Diffuse / Lambertian Reflection)
拡散反射の仮定の下では,反射光の分布はランベルトの余弦則に従い,単位立体角に対してIcosθと表される.
このとき反射光の方向は入射光に独立で,次のようにモデル化できる.
まず微小表面上に,ローカル基底 (RX, RY, RZ) をとる.
微小表面の垂直方向n=(nx,ny,nz)は与えられており,
ローカル基底のZ軸RZをnに一致させるものとする.
このときRX,RYは以下のようにとればよい.
RX=nx2+nz21⎣⎡nz0−nx⎦⎤, RY=RZ×RX=nx2+nz21⎣⎡nynxnz2−nx2−nynz⎦⎤
ただしn=(0,1,0)の場合は以下のようにとる.
RZ=⎣⎡010⎦⎤, RX=⎣⎡001⎦⎤, RY=⎣⎡100⎦⎤.
次に,設定したローカル座標上で光線の方向を極座標パラメタ (θ,φ) を用いて表す.
極座標パラメタ (θ,φ) はランベルトの余弦則に従った確率分布になるように発生させる必要がある.
一様乱数からランベルトの余弦則に従った確率分布への変換については後ほど解説するので,
ここではある極座標パラメタ (θ,φ) が与えられたものとしよう.
このとき,ローカル座標系における光線の方向 (X, Y, Z) は次のように表される.
⎣⎡XYZ⎦⎤=⎣⎡sinθcosφsinθsinφcosθ⎦⎤
ローカル座標系 (X, Y, Z) からグローバル座標系 (x, y, z) への変換は次のように表される.
これにより,拡散反射による光線方向を表すことが出来た.
⎣⎡xyz⎦⎤=[RXRYRZ]⎣⎡XYZ⎦⎤
球面上の一様分布
Lambertの余弦則に基づいた分布について議論する前に,単位球面上に一様に点を分布させる方法について考えよう.
単位球面上の位置を極座標 (θ,φ) で表すとき,各パラメタに対応する微小表面(微小立体角)は sinθdφdθ で表される.
この微小な表面積は θ に応じて変化する(北極・南極付近で小さくなり,赤道付近で大きくなる)ため,
球面上に一様に点をばらまくためには,表面積に比例するよう緯度方向について密度を調整する必要がある.
一様にばらまかれた点から1つ選んで,それが 0≤θ≤θ の範囲に含まれている確率pは次のように求められる.
p=∫0π∫02πsinθdφdθ∫0θ∫02πsinθdφdθ=[−cosθ]02π[−cosθ]0θ=21−cosθ
この式を逆に解いてやると,0–1の値に対して球面上のパラメタ θ を対応させることが出来る.
θ=arccos(1−2p)
ただ球面上の一様分布は,逆三角関数を使わないもっと雑な方法でも作ることが出来る.
具体的には, [−1:1]3 の立方体内にランダムに点を発生させて,点が単位球の外部であればやり直し,内部であれば正規化して値を返す,という手順を行えばよい.
半球面上のコサイン分布
Lambertの余弦則に基づいた分布を得るには,微小表面に cosθ の重みをのせた sinθcosθdφdθ を確率密度関数と考えればよい.
今回は半球上での分布を考えたいので,以下のように確率分布を求める.
p=∫0π/2∫02πsinθcosθdφdθ∫0θ∫02πsinθcosθdφdθ=[−cos2θ]0π/2[−cos2θ]0θ=21−cos2θ
この式を逆に解いてやると,0–1の値に対して半球上のパラメタ θ を対応させることが出来る.
θ=2arccos(1−2p)
Lambertの余弦則に基づいた分布を得たい場合,光の反射する点上に単位球面(単位半球ではない)を描いて,球面上一様にばらまかれた点からランダムに1点選び反射方向を決める,という方法も可能である.
実際,単位球面の緯度方向パラメタ θ′ と半球状の緯度方向パラメタ θ の関係式(12)を用いて,式(9)を式(11)に変形出来る.
cosθ′+1sinθ′=tanθ
式(9)よりcosθ′=1−2pなので,これを式(12)に代入して全体2乗すると次のように整理できる.
1−pp=tan2θ
tan2θ=cos2θ1−1と,倍角の公式 2cos2θ−1=cos2θ を用いて変形すると以下の式が得られる.
cos2θ=1−2p
先ほど述べたように,球面上の一様分布は逆三角関数を使わなくても作れるので,
Lambertの余弦則に従った分布も逆三角関数を使わずに作ることが出来る.