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)は

以下のリンクからダウンロードできます

NL-BASIC(N88-BASIC互換?)ホームページ

Readme.txtを読んで遊んで下さい


次回

N88-BASICでレイトレーシング (4回目)


このブログの人気の投稿

NEWS

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