$リアルタイムCGの基礎+Android


大気モデルライティング(Atmospheric model lighiting)

太陽が真上の場合と真横に来た場合で、光が届くまでの大気の厚さに差がある。

写真は、真横(真正面)に光源がある場合を比較している。

左は宇宙空間のように大気が存在しない場合、右は大気の厚さに比例して減衰分を計算に入れた場合




~ライトモデルを作る~

$リアルタイムCGの基礎+Android


観察者の視線をE

観察者の位置をP

大気圏までの半径をr

求める座標をQ

地球の中心Sは(0,0,0)

とする。

PQ間が太陽光が地表に届くまでの距離

PQ間の距離tを求める。


Q = E*t + P ...(1)

Qx^2 + Qy^2 + Qz^2 = r^2 ...(2)

の連立方程式をtについて解く。

式(1)を式(2)へ代入

(Ex*t + Px)^2 + (Ey*t + Py)^2 + (Ez*t + Pz)^2 = r^2

展開
(Ex*t)^2 + 2*(Ex*t)*Px + Px^2
+ (Ey*t)^2 + 2*(Ey*t)*Py + Py^2
+ (Ez*t)^2 + 2*(Ez*t)*Pz + Pz^2
= r^2

(Ex^2)*t^2 + 2*t*(Ex*Px) + Px^2
+ (Ey^2)*t^2 + 2*t*(Ey*Py) + Py^2
+ (Ez^2)*t^2 + 2*t*(Ez*Pz) + Pz^2
= r^2

tでまとめる
(Ex^2 + Ey^2 + Ez^2)*t^2
+ 2*t*(Ex*Px + Ey*Py + Ez*Pz)
+ (Px^2 + Py^2 + Pz^2)
= r^2

Eは単位ベクトルなので1
t^2
+ 2*t*(Ex*Px + Ey*Py + Ez*Pz)
+ (Px^2 + Py^2 + Pz^2)
= r^2

簡略化
b = (Ex*Px + Ey*Py + Ez*Pz) = E・P
c = (Px^2 + Py^2 + Pz^2)
t^2 + 2*t*b + c = r^2
t^2 + 2*t*b = r^2 - c

因数分解
(t + b)^2 - b^2 = r^2 - c
(t + b)^2 = r^2 - c + b^2

両辺を√
t + b = sqrt( r^2 - c + b^2 )

bを右辺に移動
t = sqrt( r^2 - c + b^2 ) - b

まとめ
b = (Ex*Px + Ey*Py + Ez*Pz)
c = (Px^2 + Py^2 + Pz^2)
t = sqrt(r^2 - c + b^2) - b


モデル化
r = 1.0にする。
観察者の座標は、『地表』をイメージしたP(0,p,0)にする。

b = Ey*p
t = (sqrt(1.0 - p^2 + b^2) - b)