HTMLでレイトレーシング (8回目)
2021/6/16(水)
HTMLでレイトレーシング (8回目)
by ULproject for HTML(JavaScript, canvas)
式変形など詳しくは
透過を追加します
透過は屈折光と反射光に分けて追跡します
物質1から2へ光が進む時、物質1,2の絶対
屈折率をn1、n2、相対屈折率をn = n12 = n2/n1
とし、入射光E,屈折面の法線N、反射光S、
屈折光Rとする
|E|=|N|=|R|=1
図5 屈折光R = (1/n)(E - d N)
光が当たった部分の長さを1にして
幅のある光が屈折する様子を書いた
のが図5です
物質1 : 物質2 = sinθ : sinα は、
単位時間当たりの光が進む距離の比
つまり、進みやすさの比です。
屈折率n1, n2は光の進みにくさなので
進みやすさの比は、
sinθ : sinα = n2 : n1 = n : 1
sinθ = nsinα
よって、図5の角αを持つ2つの
直角三角形は大が小のn倍になって
いる
R’= E - d Nと置くと、
R = (1/n)R’
= (1/n)(E - d N)
となり、dを求める、
d = ncosα - cosθ
ncosα = n√(1-sin2α) = √{n2-(nsinα)2}
= √(n2-sin2θ) = √{n2-(1-cos2θ)}
d = √{n2-(1-cos2θ)} - cosθ
屈折光Rと前回やった反射光Sは
R = (1/n)[E-[√{n2-(1-cos2θ)}-cosθ]N]
ただし、cosθ= -E・N
S = E+(2cosθ)N = E - 2(E・N)N
次に、入射光が屈折光(1-k)と反射光kに
分かれる割合
反射率k =
[ {sin(θ-α)/sin(θ+α)}2
+ {tan(θ-α)/tan(θ+α)}2 ] / 2
を、加法定理等で変形すると
反射率k =
[ {( ncosα- cosθ)/( ncosα+ cosθ)}2
+ {(n2cosθ-ncosα/(n2cosθ+ncosα)}2 ] / 2
より、まとめ
c = -E・N = cosθ
S = E + (2c)N
もし c < 0 なら c = -c, n = 1/n, N = -N
a = n2-(1-c2)
もし a < 0 なら全反射(k = 1)で以下無効
b = √(a) = √{n2-(1-c2)} (= ncosα)
R = (1/n){E - N(b - c)}
k = (1/2)[ {(b-c)/( b+c)}2+{(n2c-b)/(n2c+b)}2 ]
以上、反射と屈折を再帰的に呼び出し描画します
前回に下記を追加しています
sl1 = Sl[si];
sc1 = Math.sqrt(Sc[si]);
if (sl1 + sc1 <= 0.0) return;
if (sc1 > 0.0)
{
k = vector_refract(S, E, N, Se[si]);
sl1 += sc1 * k;
if (k < 1.0)
{
b = 0.1;//1.0e-8; // 少し手前
V0[0] = P[0] + S[0] * b;
V0[1] = P[1] + S[1] * b;
V0[2] = P[2] + S[2] * b;
slc *= sc1 * (1.0 - k);
shade(CL0, V0, S, slc, li);
if (CL0[3] >= 0.0)
{
_CL[0] += CL0[0]; _CL[1] += CL0[1]; _CL[2] += CL0[2];
}
sl1 = Sl[si] + Sc[si] * k;
}
}
これで屈折を再帰的に追跡しています
反射の成分は、前回のプログラムで処理しています
sc1 = Math.sqrt(Sc[si]);
は透明球の表面を光線が2回通過するので、
2回分の透明度をSc[si]で表しています
1表面の透明度をc=0.5半分透過なら
Sc[si]=c2 になるのでc = √Sc[si]にしています
以上で終了です
かなり簡略化した最小限の
レイトレーシングプログラムに
なっていると思います
もっと、色々なレイトレーシングの機能
(一部フォトンマッピング)は
VL-BASICの拡張命令という形で公開しています
VL-BASICは下記ホームページからダウンロード
できます
また、ホームページのHTMLページでray008.html
の動作を見ることができます
ray008.htmlはMicrosoft Edgeに重ねると
動き、メモ帳でコードを見ることが出来ます
blg~.zip(ray008.html)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
VL-BASICのホームページのHTML項目内に
htmlが大きすぎて貼れませんでしたので動画を貼りました