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

2021/6/10(木)

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

 

by ULproject for HTML(JavaScript, canvas)

 

参考記事

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

 

複数の球から1番近い交点までの距離を求る関数

function distance(_t, V, E)

を作ります

値が返る変数(要素数1の配列変数)は_0を付けて

分かり易いようにしています

 

Snが球の数で配列要素0~2の3個の球を定義します

 

var Sn = 3 // 球の個数

//        光源           大球         小球

var SP = [[-12, 8, -5], [5, 0, -40], [0, 5, -20]];// center

var Sr = [ 2          ,  12        ,  4         ];// radius

 

 

SP[0][0],SP[0][1],SP[0][2]は0番の球の中心座標です

座標の向きは、1回目の図1を見て下さい

Sr[0]は0番の球の半径です

 

c番の球までの距離t0を求めるには

視点Vから球の中心座標(SP[c][0],SP[c][1],SP[c][2])を

引き、球を原点に移動させた視点をV0として

交点までの距離を求めます

 

V0[0] = V[0] - SP[c][0];

V0[1] = V[1] - SP[c][1];

V0[2] = V[2] - SP[c][2];

t0    = distance_sphere(V0, E, Sr[c]);

 

t0に距離が入ります

;(セミコロン)は終止符の様なもので

必ず必要です

 

c=0,1,2のt0で一番近いもの

tにすれば良いので、

 

t = -1.0;

si = -1;

for (c = 0; c < Sn; c++)

{

  V0[0] = V[0] - SP[c][0];

  V0[1] = V[1] - SP[c][1];

  V0[2] = V[2] - SP[c][2];

  t0    = distance_sphere(V0, E, Sr[c]);

  if (t0 >= 0)

  {

    if (t0 < t || t < 0) { t = t0; si = c; }

  }

}

 

一番近い距離tとその球番号siを-1にしておきます

for (c = 0; c < Sn; c++)

は、0からc < Snまで1ずつ{}間を繰返します

 

今回Sn=3なのでc=0,1,2の3回繰返します

 

if (t0 >= 0)

{

  if (t0 < t || t < 0) { t = t0; si = c; }

}

 

は、t0<0 なら前方に交点がないので無視し

t0≧0 なら前方に交点があるので以下を実行します

 

if (t0 < t || t < 0) { t = t0; si = c; }

 

t<0ならt0は初めての前方の距離なので

無条件にtをt0にし、siをcにします

または、t0<t なら、t0の方が近いので

tをt0にし、siをcにします

 

これで、tに前方の一番近い距離(負なら無し)

siにその球番号(0~sn-1)が入ります

 

ray002.htmlはMicrosoft Edgeに重ねると

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

 

blg~.zip(ray002.html)は

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

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

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


次回

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


このブログの人気の投稿

NEWS

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