HTMLでレイトレーシング (2回目)
2021/6/10(木)
HTMLでレイトレーシング (2回目)
by ULproject for HTML(JavaScript, canvas)
参考記事
複数の球から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)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
次回