N88-BASICでレイトレーシング (6回目)
2021/6/6(日)
N88-BASICでレイトレーシング (6回目)
(by ULproject for N88-BASIC, NL-BASIC)
(NL-BASICはAlt+6で高速化します)
次にspecular(鏡面)反射ですが、鏡のように
はっきりとモノが映るのではなく、光源の色
が反射して見える程度でハイライトとも言われ
ていたと思います。
Shininess(輝かしさ)はハイライト部分を、
鋭く(小さく明るく)するか鈍く(広く暗く)
するかの程度を表します。
ハイライトの色は光源の色が大きく関係して
来るのですが、このシリーズではプログラムが
複雑になりすぎないよう光源から出る光の色
を白に限定していますので、ハイライト
も白になります。
まず、反射ベクトルを求めます。
図4 反射ベクトルS
図のEの反射がSです。
-Eと球の法線ベクトルNの内積
-E・N つまり -(E・N)は、Eの
始点からNに下した垂線の交点
とNの始点までの距離になり、
-2(E・N)は、Nの始点から、
Eと始点を同じにしたSの終点
までの長さになり、Nをその長さ
にしたのが、-2(E・N)Nです。
Eに-2(E・N)Nを足せばSに
なります。
S = E - 2(E・N)N
で反射ベクトルSを求められます。
SpecularはSが光源方向Lと同じ
方向の時最も明るく、方向がずれる
ほど暗くなりますので、内積で表す
事ができます。
値を0~1にするためS,Lを
単位ベクトルとして、
sp = S・L
shininessをshで表すと、
ハイライトはh
h = sp^sh
です。
BASICではaのb乗をa^bと書きます。
NL-BASICとblg~.zip(ray006.bas)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
次回