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

2021/6/13(日)

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

 

by ULproject for HTML(JavaScript, canvas)


参考記事

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

今回は、次の画面のように陰を描きます。


















3 点Pが陰になる場合

 

陰は視線と見えている球との交点Pから光源表面

までの間に、光源と自身を除く球があれば点Pに

光が当たっていないので暗くすれば陰になります

 

自身の球が検索されないように点Pを少し光源に

近づけて点Pを球表面から浮かす必要があります

 

検索時に自身を除くという方法は、球やポリゴン

のみのに使用できますが、トーラス(ドーナツ型)

などの自身の陰がうつる形に対応できません

 

今回は球のみですのでどちらでもかまいませんが、

検索部分(distance)を変更しなくてよい、点Pを

浮かす方法にしました

 

また光源自身が含まれないように光源表面までの

距離も少し短めで判定します

 

今回、陰がうまく出る位置に球を移動しました

 

また、解像度を多くして画面を大きくしました

 

shade関数を変更していきます

 

V0[0] = P[0]  + SP[si][0];

V0[1] = P[1]  + SP[si][1];

V0[2] = P[2]  + SP[si][2]; // V0 = P (元の座標)

E0[0] = SP[0][0] - V0[0];

E0[1] = SP[0][1] - V0[1];

E0[2] = SP[0][2] - V0[2];

 

球表面の点PをV0、点Pから光源方向をE0にして

distanceを呼ぶ準備をします。

 

b = Math.sqrt(E0[0]*E0[0] + E0[1]*E0[1] + E0[2]*E0[2]);

t1 = b - Sr[0]; // 光源表面までの距離

 

光源中心までの距離から光源の半径を引いて表面

までの距離をt1とします。

 

if (b != 0) b = 1/b; else b = 0;

E0[0] *= b;

E0[1] *= b;

E0[2] *= b; // E0 = L(光源方向)

 

E0=E0/|E0|でE0を単位ベクトルにします。

 

b   = 0.1;// 1.0E-8; // 少し手前

t1 -= b*2; // 光源表面までより短く

V0[0] += E0[0] * b;

V0[1] += E0[1] * b; // 点Pと重ならないように

V0[2] += E0[2] * b; // V0を少し光源に寄せる

 

光源表面までの距離の両端を少し短くし、

P (V0) を表面から少し浮かせます。

 

distance(_t, V0, E0);

t = _t[0];

b = E0[0]*N[0] + E0[1]*N[1] + E0[2]*N[2]; // b = L・N

if (0 < t && t < t1) b = 0; // 陰

if (b < Am) b = Am; // ambient

_CL[0] *= b; _CL[1] *= b; _CL[2] *= b;

 

distanceを呼ぶと一番近いtが得られ、0<t<t1

なら光が遮られているので、明るさをb=0にし、

あとは、前回と同じです。

 

 

ray005.htmlはMicrosoft Edgeに重ねると

動き、メモ帳でコードを見ることが出来ます

 

blg~.zip(ray005.html)は

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


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

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


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

htmlの動作を見ることが出来ます

https://vlbasic.amebaownd.com/pages/3605089/page_202002222051


次回

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


このブログの人気の投稿

NEWS

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