VL-BASICでCylinder 第1回

 

VL-BASICのリアルタイムレイトレーシング

(フォトンマッピング)で透明シリンダーを

描画しました。

計算はCPUのみで行っています

陰をぼかすため球光源にしました。

GPU MATERIAL(PHOTON.ON, PHOTONS)  '--- 光子を使用する(球光源)

GPU MATERIAL(PHOTON.ON, PHOTON )  '--- 光子を使用する(点光源)

 

VL-BASIC(N88-BASIC互換?)ホームページへのリンク

ホームページに書いてあるパスワードを入力して、

Readme.txtを読んで、遊んで見て下さい。

vl20604(cyl001.bas)もダウンロードできます。

 

下記リストをマウスで選択しCtrl+cでコピーし、

NL-BASICの画面でAlt+v(Ctrl+vではないので注意)

でプログラムを読込めます。

 

cyl001.bas

 

1000 '-----------------------------------------------------------------------

1010 ' Cylinder No.1 by ULproject for VL-BASIC

1020 '-----------------------------------------------------------------------

1025 DEF FNMOD(X, Y) = X - INT(X / Y) * Y
1030 CMD GPU ON                     '--- GPU命令を有効にする

1040 GPU SYNC(ON)                   '--- すべての表示をGPU描画に同期させる

1050 CLS 3

1060 COLOR 4

1070 '--- init

1080 T0 = 0                         '--- FPS用

1090 TC = 0                         '--- FPS用

1100 TA = 0.5

1110 D  = 0

1120 '--- Photon

1130 GPU TRACE(PHOTON.RAYS , 100000 )  '--- Photon総数

1140 GPU MATERIAL(PHOTON.ON, PHOTONS)  '--- 光子を使用する(球光源)

1150 GPU MATERIAL(PHOTON.N , 50*4   )  '--- 光子検索最大数をnにする

1160 GPU MATERIAL(PHOTON.R , 30*4   )  '--- 光子検索半径をrにする

1170 GOSUB *SUN

1180 GOSUB *WALL

1190 GOSUB *CYLINDER

1200 '--- main

1210 *START

1220 GPU MATRIX(IDENTITY)           '--- 単位行列(位置のリセット)にする

1230 GPU TRANSLATE(0, 0, -3000)     '--- 移動

1240 WHILE 1

1250   T1 = TIME(1000)              '--- fps

1260   GOSUB *FPS                   '--- fps表示

1270   GPU LIST(CALL, 0)            '--- 光源

1280   GPU LIST(CALL, 1)            '--- 壁

1290   GPU MATRIX(PUSH)             '--- 行列(位置)退避

1300     GPU TRANSLATE(0, 100, 0)

1310     GPU ROTATE(D, 1, 0, 0)     '--- x軸周りの回転

1320     D = FNMOD(D + TA, 360)
1330     GPU LIST(CALL, 2)          '--- cylinder

1340   GPU MATRIX(POP)              '--- 行列(位置)戻す

1350   GOSUB *TRACE

1360 WEND

1370 END                            '--- 不必要(気休め)

1380 '---

1390 *FPS

1400 TC = TC+1

1410 IF T1-T0 < 1000 THEN RETURN

1420 TC = CINT((TC*1000)/(T1-T0))

1430 CLS

1440 PRINT TC;"fps ";

1450 TC = 0

1460 T0 = T1

1470 RETURN

1480 '---

1490 *SUN

1500 GPU MATRIX(IDENTITY)

1510 GPU MATERIAL(PUSH)                       '--- 物体情報退避

1520 GPU LIST(NEW, 0)

1530   GPU TRANSLATE(800, 100, 300)           '--- x軸, y軸, z軸

1540   S = 1.0E+6

1550   GPU MATERIAL(LIGHT    , S,S*0.8,S*0.6) '--- 光源の光の色と強さ

1560   S = 1.44

1570   GPU MATERIAL(SPECULAR , S,S*0.8,S*0.6) '--- 反射した光の色と強さ

1580   GPU MATERIAL(SHININESS, 20)            '--- 大:鋭く,小:鈍く輝く

1590   GPU MATERIAL(DIFFUSE  , 0,0,0)         '--- 無色(黒)

1600   GPU MATERIAL(CLARITY  , 1,1,1)         '--- 完全に透明

1610   GPU MATERIAL(REFRACT  , 1)             '--- 屈折率1.0

1620   GPU SPHERE(50)                         '--- 球を置く

1630 GPU LIST(END)

1640 GPU MATERIAL(POP)                        '--- 物体情報戻す

1650 RETURN

1660 '---

1670 *WALL

1680 GPU MATRIX(IDENTITY)

1690 GPU MATERIAL(PUSH)

1700 GPU LIST(NEW, 1)

1710   GPU TRANSLATE(1000,  750,  500)

1720   GPU MATERIAL(DIFFUSE, 1.0, 1.0, 1.0)  '--- 拡散反射係数

1730   GPU PRIM(OP , NOT)                    '--- 内側を表にする

1740   GPU PRIM(BOX, 1800, 1500, 3000)       '--- Boxの内側を置く

1750 GPU LIST(END)

1760 GPU MATERIAL(POP)

1770 RETURN

1780 '---

1790 *CYLINDER

1800 GPU MATRIX(IDENTITY)

1810 GPU MATERIAL(PUSH)

1820 GPU LIST(NEW, 2)

1830   GPU ROTATE(-90, 1, 0, 0)

1840   GPU BOUND(BEGIN, 200)

1850   GPU MATERIAL(DIFFUSE, 0.2, 0.4, 1.0) '--- 色

1860   GPU MATERIAL(CLARITY, 0.2, 0.4, 1.0) '--- 完全に透明

1870   GPU MATERIAL(REFRACT, 1.2)           '--- 屈折率

1880   GPU PRIM(DISK, 0, 140, 150)          '--- water

1890   GPU BOUND(END)

1900 GPU LIST(END)

1910 GPU MATERIAL(POP)

1920 RETURN

1930 '--- レイトレース開始

1940 *TRACE

1950 GPU CLEAR                   '--- 描画バッファをクリア

1960 GPU TRACE(BEGIN)            '--- レイトレーシングの準備

1970   GPU TRACE                 '--- レイトレーシング

1980 GPU TRACE(END)              '--- レイトレーシングの後始末(画面表示)

1990 RETURN

 

 

 

 

N88-BASICでクマ

 

nl20603.zip(kuma1.bas)とNL-BASICは、

下記リンクよりダウンロードできます。

NL-BASIC(N88-BASIC互換?)ホームページへのリンク

Readme.txtを読んで、遊んで見て下さい。

 

下記リストをマウスで選択しCtrl+cでコピーし、

NL-BASICの画面でAlt+v(Ctrl+vではないので注意)

でプログラムを読込めます。

 

kuma1.bas

 

100 '----------------------------------------------------------------------

110 ' くま by ULproject for N88-BASIC

120 '----------------------------------------------------------------------

130 DEF FNR(X) = X * PI / 180  '--- 度をラジアンへ

140 PI = ATN(1) * 4            '--- π(arctan(1) = π/4)

150 B$ = CHR$(0)+CHR$(&H55)+CHR$(0)+CHR$(0)+CHR$(&HAA)+CHR$(0) '--- 黒赤

160 CLS 3                      '--- 画面消去(1:文字 2:CG 3:両方)

170 X = 320                    '--- 顔の中心位置x

180 Y = 200                    '--- 顔の中心位置y

190 CIRCLE(X-60, Y-60), 40, 0,         ,         ,    , F, B$  '--- 左耳

200 CIRCLE(X+60, Y-60), 40, 0,         ,         ,    , F, B$  '--- 右耳

210 CIRCLE(X-60, Y-60), 20, 7,         ,         ,    , F      '--- 左耳中

220 CIRCLE(X+60, Y-60), 20, 7,         ,         ,    , F      '--- 右耳中

230 CIRCLE(X   , Y   ), 80, 0,         ,         ,    , F, B$  '--- 顔

240 CIRCLE(X   , Y+20), 45, 7,         ,         ,    , F      '--- 顔中

250 CIRCLE(X-30, Y-20), 15, 0,         ,         , 1.2, F      '--- 左目

260 CIRCLE(X+30, Y-20), 15, 0,         ,         , 1.2, F      '--- 右目

270 CIRCLE(X-30, Y-20),  5, 7,         ,         , 1.5, F      '--- 左目中

280 CIRCLE(X+29, Y-20),  5, 7,         ,         , 1.5, F      '--- 右目中

290 CIRCLE(X-25, Y-16),  2, 7,         ,         , 1.5, F      '--- 左目小

300 CIRCLE(X+34, Y-16),  2, 7,         ,         , 1.5, F      '--- 右目小

310 CIRCLE(X   , Y+ 5), 10, 0,         ,         ,    , F      '--- はな

320 CIRCLE(X   , Y+20), 25, 0, FNR(210), FNR(329)              '--- くち

330 LINE(X-21, Y+32)-(X-22, Y+35), 0                           '--- くち左

340 LINE(X+21, Y+32)-(X+22, Y+35), 0                           '--- くち右

 

 

NL-BASIC,VL-BASICについての注意点とお知らせ

扇形の塗潰しは、はみ出しや塗残しなどの不具合が

でる可能性があります。

その時はPAINTなどで代用して下さい。

塗潰しの円や扇を描く過程を見る見ないを、

Alt+'-' , Alt+'^' で切替えることができます。

(NLBasic01.txt,VLBasic01.txtでも可能です。)

 

ここから、解説です。

N88-BASICのグラフィック座標は

(0,  0) … (639,  0)

(0,399) … (639,399)

のように左上が原点になっています。

(右下はSCREENモードにより変わります)

色は0:黒 1:青 2:赤 3:紫 4:緑 5:水色 6:黄 7:白

です。

 

N88-BASICのCIRCLE命令について説明します。

CIRCLE(320, 200), 50, 7

で半径50の白い円が画面中央に描かれます。

 

CIRCLE(x, y), r, c, a1, a2, e, F, b/t$

(x, y) … 円の中心座標

r      … 円の半径

c      … 円弧の色

a1, a2 … 円弧の開始,終了角(0~2π)(負の時半径描画)

e      … 楕円の縦の半径に対する横の半径の割合

          半径rの円を縦,横に潰した形になる。

          e = 0.5 → 横r , 縦0.5r で横長

          e = 2.0 → 横r/2  , 縦r で縦長

F      … Fを指定すると円内部をc色で塗潰す

b/t$   … bを指定するとcの代わりにb色で塗潰す

          bの代わりにt$を指定するとタイルパターン

          で塗潰す

 

8色モードのタイルパターンの説明

150 B$ = CHR$(0)+CHR$(&H55)+CHR$(0)+CHR$(0)+CHR$(&HAA)+CHR$(0) '--- 黒赤

    16進  2進

Blue  00  00000000 1の位(この位が1なら1)

Red   55  01010101 2の位(この位が1なら2)

Green 00  00000000 4の位(この位が1なら4)

          02020202 … 合計

Blue  00  00000000 1の位(この位が1なら1)

Red   AA  10101010 2の位(この位が1なら2)

Green 00  00000000 4の位(この位が1なら4)

          20202020 … 合計

よって、B$は、

黒赤黒赤黒赤...

赤黒赤黒赤黒...

...

というタイルパターンで塗潰します。

 

N88-BASICの関数の定義

BASICでは1つの数式を関数として定義できます。

(IFなどの命令文を書くことはできません)

DEF FN関数名(x, y, ...) = ...

です。

 

130 DEF FNR(X) = X * PI / 180  '--- 度をラジアンへ

 

を実行しておくと、

FNR(90)は90 * PI / 180という計算が行われます。

 

CIRCLEの角度はラジアン単位なので、

この関数を使えば度(0~360)で指定できます。

 

140 PI = ATN(1) * 4            '--- π(arctan(1) = π/4)

は、円周率の代入です。

PI = 3.141592653589793

としてもかまいません。

Tan-1(1) = π/4なので4倍しています。

 

CLS nは画面消去です。

nが1または省略 → テキスト画面の消去

nが2           → グラフィック画面の消去

nが3           → 上記両画面の消去

 

N88-BASICのLINE

LINE(x1, y1)-(x2, y2), c

座標(x1, y1)から(x2, y2)にc色の線を引く

 

その他、箱や塗り潰し、破線など、

詳しくはNL-BASICなどのマニュアルを見て下さい。