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などのマニュアルを見て下さい。
8ピースのスライドパズルの解答検索プログラムです
この記事はリニューアルしました
https://ulprojectmail.blogspot.com/2022/02/n88-basicpuzzle-3.html
N88-BASICでスライドパズル (3回目)