HTMLでレイトレーシング (8回目)

2021/6/16(水)

HTMLでレイトレーシング (8)

 

by ULproject for HTML(JavaScript, canvas)


ray008.html


式変形など詳しくは

N88-BASICでレイトレーシング (8回目)









透過を追加します

透過は屈折光と反射光に分けて追跡します

 

物質1から2へ光が進む時、物質1,2の絶対

屈折率をn1n2、相対屈折率を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)は

以下のリンクからダウンロードできます

VL-BASIC(N88-BASIC互換?)ホームページ

Readme.txtを読んで遊んで下さい


VL-BASICのホームページのHTML項目内に

htmlが大きすぎて貼れませんでしたので動画を貼りました




このブログの人気の投稿

NEWS

N88-BASICでゲーム (1回目)