HTMLでレイトレーシング (7回目)
2021/6/15(火) HTML でレイトレーシング (7 回 目 ) by ULproject for HTML(JavaScript, canvas) 参考記事 N88-BASICでレイトレーシング (7回目) 反射は、 前回の specularの式 S = E - 2(E・N)N = E + (2cosθ)N が、そのまま使えます 視点 V、視線Eの交点Pでの反射Sを前回で求め ていますので、それらが保存されるように変更を 加えました P、Sを新たなV、Eとしてその先の交点の色を追加 するということを繰り返せば反射で映ったものを 描けます Level変数を追加し、反射回数を制限しています また、 slcに反射による減衰量を保存し、一定数以下なら 反射を制限するようにしています 表示する球を 4個(後ろにある光源を入れると5個) に増やすなど、ところどころ変更が加えてあります 今までの shade関数をshade_siに変更し shade関数からshade_siを呼び出しています shade関数では、新たに sl1 = Sl[si]; if (sl1 > 0.0) { vector_specular(S, E, N); 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 *= sl1; shade(CL0, V0, S, slc, li); if (CL0[3] >= 0.0) { _CL[0] += CL0[0]; _CL[1] += CL0[1]; _CL[2] += CL0[2]; } } を追加し、鏡面反射する表面 (Sl[si] > 0)は 表面を視点、反射ベクトル Sを視線として 再帰的に追跡をし、色を足していっています ray007.htmlはMicrosoft Edgeに重ねると 動き、メモ帳でコードを見ることが出来ます blg~.zip(ray007.html)は 以下のリンクからダウンロードできます VL-BASIC(N88-BASIC互換?)ホームページ Readme.