N88-BASICでレイトレーシング (3回目)
2021/6/3(木)
N88-BASICでレイトレーシング (3回目)
(by ULproject for N88-BASIC, NL-BASIC)
(NL-BASICはAlt+6で高速化します)
表示用の色指定をDATA文に追加しました
BASICの8色モードでの色は次の通りです
0:黒 1:青 2:赤 3:紫 4:緑 5:水色 6:黄 7:白
まずスクリーン上の任意の視点Vからの
視線ベクトルを生成します
スクリーンを1回目の図1のx,y,zの
長さで定義します。変数名をVXYZとすると
VXYZ(0) = 16 ' Screen 幅 / 2
VXYZ(1) = 10 ' Screen 高 / 2
VXYZ(2) = 40 ' Screenから視点までの距離
32×20で視線が集まる焦点距離が40の
z=0の平面になります。手前がz軸です
任意のx,y(-1.0≦x,y≦1.0)でスクリーンの
任意の点Vを表すことにします
V = (VXYZ(0)×x , VXYZ(1)×y , 0)
x= 1,y= 1のとき一番右上です。
視線Eは焦点からスクリーン上の視点へ
と向かう方向なので、焦点をV’とすると、
V’= (0 , 0 , VXYZ(2))
E = V - V’= (VXYZ(0) × x, VXYZ(1) × y, -VXYZ(2))
E = E / |E| (|E|はx,y,z成分の2乗の和の平方根)
(三平方の定理の3次元版です)
V(0) = VXYZ(0) * X: V(1) = VXYZ(1) * Y: V(2) = 0
E(0) = V(0) : E(1) = V(1) : E(2) = -VXYZ(2)
A = SQR(E(0)*E(0) + E(1)*E(1) + E(2)*E(2))
E(0) = E(0) / A : E(1) = E(1) / A : E(2) = E(2) / A
上記SQRの中は2乗の和なので常に正で
A>0 (VXYZ(2)>0より)なので、SQR(負)
や/0のエラーチェックは不必要です
ラベルは*RAY.VIEWにしました
更にスクリーンを走査して球の存在を色で描画します
以下のような画面になります
まず、下準備は以下の通りです。
CLS 3
DIM RES(2), VXYZ(2), V(2), E(2), V0(2)
RES(0) = 80 ' x dots
RES(1) = 50 ' y dots
RES(2) = 4 ' dot size
VXYZ(0) = 16 ' Screen 幅 / 2
VXYZ(1) = 10 ' Screen 高 / 2
VXYZ(2) = 40 ' Screenから視点までの距離
GOSUB *RAY.TRACE
END
CLS 3
は、テキストとグラフィックの画面消去です
DIMがなければ配列変数は11個確保されます
DIM V(2)はV(0),V(1),V(2)の宣言です
RES(0)×RES(1)の点の数(解像度)で構成される
スクリーンということにします
RES(2)で1dotの大きさを指定しておきます
解像度を小さくすると画面が小さくなるので
1dot(点)の大きさを指定できるようにしました
今回作るサブルーチンは*RAY.TRACEです。
*RAY.TRACE
IW = RES(0): IH = RES(1): IZ = RES(2)
X0 = (640 - IW*IZ) / 2: Y0 = (400 - IH*IZ) / 2
LINE(X0 - 1, Y0 - 1)-STEP(IW*IZ + 1, IH*IZ + 1),7,B
IW = IW - 1: IH = IH - 1
FOR IY = 0 TO IH
Y = 1 - 2 * IY / IH
FOR IX = 0 TO IW
X = 2 * IX / IW - 1
GOSUB *RAY.VIEW
GOSUB *DISTANCE
IF T >= 0 THEN LINE(X0+IX*IZ, Y0+IY*IZ)-STEP(IZ-1, IZ-1),SC(SI),BF
NEXT
NEXT
RETURN
RESの値を一時的にiw,ih,izに代入して
使用しています。
大きさiz×izの正方形の点がiw×ih個
で構成されたスクリーンになります
(wはwidth幅、hはheight高さです)
x0、y0はPCの画面を640×400として
スクリーンが中央に表示するための
左上のPC画面座標です。
LINEのB(box)オプションで白色の
長方形を描くことでスクリーンが
分かるようにしてあります
以下、RES(0),RES(1)=3,2として
説明すると
iw=2 (RES(0)-1)
ih=1 (RES(1)-1)
ix=0~iw
iy=0~ih
つまり
(ix,iy)=(0,0),(1,0),(2,0),
(0,1),(1,1),(2,1)
と変化させてスクリーン上のすべて
の点を描いていきます
x = 2 * ix / iw
y = 1 - 2 * iy / ih
で、-1.0≦x,y≦1.0の値を得ます
(x,y)=(-1, 1),( 0, 1),( 1, 1),
(-1,-1),(-1, 0),(-1, 1)
となります
上記で作った*RAY.VIEWでV, Eを作り
以前作った*DISTANCEでtを得ます
tが0以上なら見えている球の色
で点を描きます
PC画面座標(10, 5)に大きさ(8, 4)
色4の塗潰した箱を描く命令は、
LINE(10,5)-STEP(8-1,4-1),4,BF
です
NL-BASICとblg~.zip(ray003.bas)は
以下のリンクからダウンロードできます
Readme.txtを読んで遊んで下さい
次回