N88-BASICでRayTracingのしくみ

2022/5/12(木)
N88-BASICでRayTracingのしくみ
 
通常レイトレーシングは3次元空間に視線を飛ばし、
見えたものを2次元スクリーンに描画しますが、
2次元平面に視線を飛ばし、見えたものを1次元
スクリーンに描画する事で、レイトレーシングの
しくみを視覚化しました
 
今回は、プログラムを単純化する為、光源などは無しに
していますが、光源、反射、透過ありの、3次元
レイトレーシングについては、
ブログの
https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html
N88-BASICでレイトレーシング (1回目)
~(8回目)
を読んで下さい
 
ます、視点から円までの距離を求めます
ここで、数値(スカラー)を小文字、ベクトル
(x,y成分を持つ矢印)を大文字で描くこと
にします
 
P:任意の位置ベクトル
r:円の半径
V:視点の位置ベクトル
E:視線の方向単位ベクトル
t:任意の値
 
とします位置ベクトルPは点Pと同じような
ものだと思って下さいEは方向を表し、単位
ベクトルは距離(矢印の長さ)が1のベクトルで、
|E| = 1と書きます|E|はEベクトルの長さです
 
原点が中心で半径rの円は、
|P| = r
で表されます
原点から点Pまでの長さがrの点の集まりです
ので、円になります
 
視点VからE方向に向けた視線は、
P = V + Et
で表されます
 
任意の場所にある円は、中心の位置を点Cとすると、
|P - C| = rとなりますが、視線の方は視点が
移動してもP = V + Etと変わりませんので、
球と視線を移動して円を原点に持ってくれば、
|P| = rの式で求めることができます
よって、|P - C| = rは必要ありません
 
|P| = r
P = V + Et
 
この式から視点と円間の距離tを求めます
|P| = r にP = V + Etを代入します
|V + Et| = r    | |を外すため両辺を2乗
(V + Et)(V + Et) = r2 を展開
V・V + 2(V・E)t + (E・E)t2 = r2
ここでベクトル同士の積は内積になります
E・E = |E||E| = 1×1 = 1
同じベクトルの内積はベクトルの長さの2乗です
Eは単位ベクトルなので|E|=1です
V・V + 2(V・E)t + t2 = r2
 
t2 + 2(V・E)t + V・V - r2 = 0
となり、tの2次方程式になりました
解の公式で
 
t = -V・E±√( (V・E)(V・E) - V・V + r2)
 
となります
判別式D = (V・E)(V・E) - V・V + r2 
によって
 
交差しない   (tは虚数)
1点で接する  (距離tは1つ)
2点で貫く    (距離tは近い方と遠い方の2つ)
 
の3パターンを判別できます
 
ちなみにBASICでは
√(n) は、SQR(n)
rの2乗は、r^2 または r*r
と書きます
 
NL-BASICとblg~.zip(ray2d001.bas)は
以下のリンクからダウンロードできます

https://ulprojectmail.blogspot.com
Readme.txtを読んで遊んで下さい



















このブログの人気の投稿

NEWS

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