《 このプログラムでできること 》 |
ACLS:CLEAR:PNLTYPE "OFF" V_MAX=999:L_MAX=999:P_MAX=999 DIM VX(V_MAX),VY(V_MAX),VZ(V_MAX) DIM WX(V_MAX),WY(V_MAX),WZ(V_MAX) DIM SX(V_MAX),SY(V_MAX) DIM L1(L_MAX),L2(L_MAX) DIM P1(P_MAX),P2(P_MAX),P3(P_MAX) DIM PC(P_MAX),PZ(P_MAX),PN(P_MAX) GPAGE 1 FOR I=1TO 11 GLINE I*21.3,0,I*21.3,191,13-(I==6) GLINE 0,I*16,255,I*16,13-(I==6) NEXT FOR I=0TO 3 READ C$ SPPAGE 1 CHRSET "SPS",I,C$ SPPAGE 0 CHRSET "SPU",I,C$ NEXT FOR I=0TO 1 SPPAGE !I SPSET 0,0,0,0,0,0 SPHOME 0,8,8 SPOFS 0,!I*137-9,!I*96 NEXT @LIGHTING BG=0:AM=3 RL=255:GL=255:BL=255 GPAGE 0 FOR I=1TO 15 COLREAD("GRP",I),R0,G0,B0 FOR J=0TO 15 R=R0*(AM+15-J)/(AM+16)*RL/255 G=G0*(AM+15-J)/(AM+16)*GL/255 B=B0*(AM+15-J)/(AM+16)*BL/255 C$=HEX$(R,2)+HEX$(G,2)+HEX$(B,2) COLSET "GRP",J*16+I,C$ NEXT NEXT @INIT FL=200:CL=FL PL=0:PP=0:SH=1:RX=0:RY=0:LZ=1 BGMPLAY RND(23)+7 MD$(0)="CUBE" MD$(1)="SOLID24" MD$(2)="TRIFORCE" MD$(3)="ANDORGENESIS" IF MD$(MD)>""THEN RESTORE "@"+MD$(MD)ELSE RESTORE "@"+MD$(0) READ VT VT=VT-1 FOR I=0TO VT READ VX(I),VY(I),VZ(I) NEXT READ LN,LC LN=LN-1 FOR I=0TO LN READ L1(I),L2(I) NEXT READ PG PG=PG-1 FOR I=0TO PG READ P1(I),P2(I),P3(I),PC(I) NEXT @MAIN GPAGE 0,N,2-N:N=2-N TC=TCHST:BT=BUTTON() IF !BT THEN SPOFS 0,-16,0 IF !TC*!BT THEN@VT PX=TX:PY=TY:TC=TCHST:TX=TCHX:TY=TCHY BT=BUTTON():TR=BT-(PB AND BT) IF TR AND 3THEN PL=!(2-(TR AND 2)) IF TR AND 12THEN PP=!(8-(TR AND 8)) IF TR AND 1568THEN SH=!(1024-(TR AND 1024)) IF TR AND 240THEN MD=0OR LOG(TR)*1.45-4:MEM$=STR$(MD):GOTO @INIT IF !BT*(TX>223)THEN CL=CL+(TY-PY)*TC*PT*FL/200:IF CL IF BT AND 256THEN GOSUB @LIGHT ' VERTEX ROUTINE @VT SN=SIN(RAD(RY))CS=COS(RAD(RY)) SI=SIN(RAD(RX))CO=COS(RAD(RX)) FOR I=0TO VT V=CS*VZ(I)-SN*VX(I) WX(I)=CS*VX(I)+SN*VZ(I) WY(I)=CO*VY(I)-SI*V WZ(I)=SI*VY(I)+CO*V SX(I)=0OR 128+WX(I)*FL/(CL+WZ(I)*PP) SY(I)=0OR 96-WY(I)*FL/(CL+WZ(I)*PP) NEXT GCLS BG ON PL GOSUB@WIRE,@POLY FPS=FPS+1IF MAINCNTL-CNT>59THEN LOCATE 0,0?"FPS"FPS,:FPS=0CNT=MAINCNTL PT=TC:PB=BT GOTO @MAIN @LIGHT A=SIN(PI()/256*(128-TX))*TC LY=SIN(PI()/192*(TY-96))*TC B=SQR(1-LY*LY) LX=A*B:LZ=SQR(1-A*A)*B SPPAGE 1 IF TC THEN UX=TX:UY=TY ELSE UX=128:UY=96 SPOFS 0,UX,UY SPPAGE 0 SPOFS 0,(144-LX*96)*PL-16,LY*96+96 SPSCALE 0,LZ*100+100 RETURN ' WIRE FRAME DRAW @WIRE FOR I=0TO LN GLINE SX(L1(I)),SY(L1(I)),SX(L2(I)),SY(L2(I)),LC NEXT RETURN @POLY ' Z SORT FOR I=0TO PG Z(0)=WZ(P1(I)) Z(1)=WZ(P2(I)) Z(2)=WZ(P3(I)) SORT 0,3,Z PZ(I)=Z(0)+Z(2)*2 PN(I)=I NEXT RSORT 0,PG+1,PZ,PN ' POLYGON DRAW FOR K=0TO PG B=PN(K)A=P1(B) X0=WX(A)Y0=WY(A)Z0=WZ(A) X(0)=SX(A)Y(0)=SY(A) A=P2(B) X1=WX(A)Y1=WY(A)Z1=WZ(A) X(1)=SX(A)Y(1)=SY(A) A=P3(B) X2=WX(A)Y2=WY(A)Z2=WZ(A) X(2)=SX(A)Y(2)=SY(A) NZ=(X0-X2)*(Y1-Y0)-(Y0-Y2)*(X1-X0) IF !PP*(NZ>=0)THEN NEXT:RETURN NX=(Y0-Y2)*(Z1-Z0)-(Z0-Z2)*(Y1-Y0) NY=(Z0-Z2)*(X1-X0)-(X0-X2)*(Z1-Z0) NS=SQR(NX/4096*NX+NY/4096*NY+NZ/4096*NZ)*64 IF PP THEN VS=SQR(X0*X0+Y0*Y0+(Z0+CL)*(Z0+CL))ELSE VS=1 IF(NX/NS*X0/VS+NY/NS*Y0/VS)*PP+NZ/NS*(Z0+CL)/VS>=0THEN NEXT:RETURN LV=NX/NS*LX+NY/NS*LY+NZ/NS*LZ IF LV<-0.99THEN LV=-0.99ELSE IF LV>0THEN LV=0 C=PC(B)+SH*(0OR 15.9+LV*16)*16 GOSUB @TRI NEXT RETURN @TRI SORT 0,3,X,Y:P=X(2)-X(0) SORT 0,3,Y,X:Q=Y(2)-Y(0) IF Q>P THEN @T X=X(0)Y=Y(0)M=Y-Y(2) Q=(X(0)-X(2))/(M+!M)Z=X FOR J=0TO 1 M=Y(J)-Y(J+1) P=(X(J)-X(J+1))/(M+!M) X=X+(X(1)-X(0))*!M A=Y(J)B=Y(J+1)-1 FOR I=A TO B GLINE X,I,Z,I,C X=X+P:Z=Z+Q NEXT NEXT RETURN @T SORT 0,3,X,Y X=X(0)Y=Y(0)M=X-X(2) Q=(Y(0)-Y(2))/(M+!M)Z=Y FOR J=0TO 1 M=X(J)-X(J+1) P=(Y(J)-Y(J+1))/(M+!M) Y=Y+(Y(1)-Y(0))*!M A=X(J)B=X(J+1)-1 FOR I=A TO B GLINE I,Y,I,Z,C Y=Y+P:Z=Z+Q NEXT NEXT RETURN ' SUN CHR DATA DATA 2000000202000002002000000002002200000200000020000000200200020020 DATA 0000002000000200000020002200000000200000000200002000200002002000 DATA 2202002000020002000020000000020000020022002000000200000220000002 DATA 0020202200202000002020000200200020020000000002000000002000000002 ' OBJECT DATA @SOLID24 ' VERTEX DATA DATA 14 DATA 0,50,0,-10,10,-10 DATA 10,10,-10,10,10,10 DATA -10,10,10,-10,-10,-10 DATA 10,-10,-10,10,-10,10 DATA -10,-10,10,-50,0,0 DATA 0,0,-50,50,0,0 DATA 0,0,50,0,-50,0 ' LINE DATA DATA 36,11 DATA 0,1,0,2,0,3,0,4 DATA 1,2,2,3,3,4,4,1 DATA 5,6,6,7,7,8,8,5 DATA 1,5,2,6,3,7,4,8 DATA 9,1,9,4,9,5,9,8 DATA 10,1,10,2,10,5,10,6 DATA 11,2,11,3,11,6,11,7 DATA 12,3,12,4,12,7,12,8 DATA 13,5,13,6,13,7,13,8 ' POLYGON DATA DATA 24 DATA 0,2,1,2,0,3,2,2 DATA 0,4,3,2,0,1,4,2 DATA 9,4,1,4,9,8,4,4 DATA 9,5,8,4,9,1,5,4 DATA 10,1,2,10,10,2,6,10 DATA 10,6,5,10,10,5,1,10 DATA 11,2,3,5,11,6,2,5 DATA 11,7,6,5,11,3,7,5 DATA 12,3,4,12,12,7,3,12 DATA 12,8,7,12,12,4,8,12 DATA 13,5,6,15,13,6,7,15 DATA 13,7,8,15,13,8,5,15 @CUBE ' VERTEX DATA DATA 8 DATA -32,-32,-32,-32,32,-32 DATA 32,-32,-32,32,32,-32 DATA -32,-32,32,-32,32,32 DATA 32,-32,32,32,32,32 ' LINE DATA DATA 12,15 DATA 0,1,1,3,2,3,2,0,0,4,1,5 DATA 2,6,3,7,4,5,5,7,6,7,6,4 ' POLYGON DATA DATA 12 DATA 0,1,2,15,1,3,2,15 DATA 2,3,6,15,6,3,7,15 DATA 0,6,4,15,0,2,6,15 DATA 0,4,5,15,0,5,1,15 DATA 1,5,7,15,1,7,3,15 DATA 4,6,5,15,5,6,7,15 @TRIFORCE ' VERTEX DATA DATA 12 DATA 0,60,0,-23.1,20,0 DATA 23.1,20,0,-46.2,-20,0 DATA 0,-20,0,46,-20,0 DATA 0,60,10,-23.1,20,10 DATA 23.1,20,10,-46.2,-20,10 DATA 0,-20,10,46.2,-20,10 ' LINE DATA DATA 24,12 DATA 0,1,1,2,2,0,1,3,3,4,4,1 DATA 2,4,4,5,5,2,6,7,7,8,8,6 DATA 7,9,9,10,10,7,8,10,10,11,11,8 DATA 0,6,1,7,2,8,3,9,4,10,5,11 ' POLYGON DATA DATA 18 DATA 0,2,1,12,1,4,3,12 DATA 2,5,4,12,6,7,8,12 DATA 7,9,10,12,8,10,11,12 DATA 0,11,5,8,11,0,6,8 DATA 0,9,6,8,9,0,3,8 DATA 3,11,9,8,11,3,5,8 DATA 1,8,7,7,8,1,2,7 DATA 1,10,4,7,10,1,7,7 DATA 2,10,8,7,10,2,4,7 @ANDORGENESIS ' VERTEX DATA DATA 98 DATA 0,0,-20,-30,72,0 DATA 30,72,0,72,30,0 DATA 72,-30,0,30,-72,0 DATA -30,-72,0,-72,-30,0 DATA -72,30,0,-12,29,-15 DATA 12,29,-15,29,12,-15 DATA 29,-12,-15,12,-29,-15 DATA -12,-29,-15,-29,-12,-15 DATA -29,12,-15,-15,72,0 DATA 15,72,0,72,15,0 DATA 72,-15,0,15,-72,0 DATA -15,-72,0,-72,-15,0 DATA -72,15,0,-6,29,-15 DATA 6,29,-15,29,6,-15 DATA 29,-6,-15,6,-29,-15 DATA -6,-29,-15,-29,-6,-15 DATA -29,6,-15,-15,26,-15 DATA 15,26,-15,26,15,-15 DATA 26,-15,-15,15,-26,-15 DATA -15,-26,-15,-26,-15,-15 DATA -26,15,-15,40,51,-3 DATA 51,40,-3,51,-40,-3 DATA 40,-51,-3,-40,-51,-3 DATA -51,-40,-3,-51,40,-3 DATA -40,51,-3,20,29,-14 DATA 27,36,-11,36,27,-11 DATA 29,20,-14,29,-20,-14 DATA 36,-27,-11,27,-36,-11 DATA 20,-29,-14,-20,-29,-14 DATA -27,-36,-11,-36,-27,-11 DATA -29,-20,-14,-29,20,-14 DATA -36,27,-11,-27,36,-11 DATA -20,29,-14,-4,33,-10 DATA 4,33,-10,33,4,-10 DATA 33,-4,-10,4,-33,-10 DATA -4,-33,-10,-33,-4,-10 DATA -33,4,-10,-15,26,-10 DATA 15,26,-10,26,15,-10 DATA 26,-15,-10,15,-26,-10 DATA -15,-26,-10,-26,-15,-10 DATA -26,15,-10,-5,12,-16 DATA 5,12,-16,12,5,-16 DATA 12,-5,-16,5,-12,-16 DATA -5,-12,-16,-12,-5,-16 DATA -12,5,-16,-30,72,10 DATA 30,72,10,72,30,10 DATA 72,-30,10,30,-72,10 DATA -30,-72,10,-72,-30,10 DATA -72,30,10,0,0,10 ' LINE DATA DATA 128,10 DATA 1,2,2,3,3,4,4,5 DATA 5,6,6,7,7,8,8,1 DATA 9,10,10,11,11,12,12,13 DATA 13,14,14,15,15,16,16,9 DATA 1,33,2,34,3,35,4,36 DATA 5,37,6,38,7,39,8,40 DATA 17,25,18,26,19,27,20,28 DATA 21,29,22,30,23,31,24,32 DATA 34,41,41,42,42,35,36,43 DATA 43,44,44,37,38,45,45,46 DATA 46,39,40,47,47,48,48,33 DATA 49,50,50,51,51,52,52,49 DATA 53,54,54,55,55,56,56,53 DATA 57,58,58,59,59,60,60,57 DATA 61,62,62,63,63,64,64,61 DATA 17,65,65,66,66,18,25,65 DATA 26,66,19,67,67,68,68,20 DATA 27,67,28,68,21,69,69,70 DATA 70,22,29,69,30,70,23,71 DATA 71,72,72,24,31,71,32,72 DATA 1,73,48,73,33,73,2,74 DATA 41,74,34,74,3,75,42,75 DATA 35,75,4,76,43,76,36,76 DATA 5,77,44,77,37,77,6,78 DATA 45,78,38,78,7,79,46,79 DATA 39,79,8,80,47,80,40,80 DATA 81,82,82,83,83,84,84,85 DATA 85,86,86,87,87,88,88,81 DATA 89,90,90,91,91,92,92,93 DATA 93,94,94,95,95,96,96,89 DATA 1,89,2,90,3,91,4,92 DATA 5,93,6,94,7,95,8,96 ' POLYGON DATA DATA 152 DATA 9,10,81,13,10,82,81,13 DATA 10,11,82,13,11,83,82,13 DATA 11,12,83,13,12,84,83,13 DATA 12,13,84,13,13,85,84,13 DATA 13,14,85,13,14,86,85,13 DATA 14,15,86,13,15,87,86,13 DATA 15,16,87,13,16,88,87,13 DATA 16,9,88,13,9,81,88,13 DATA 1,17,9,13,17,25,9,13 DATA 17,18,65,13,18,66,65,13 DATA 18,2,26,13,2,10,26,13 DATA 2,3,74,13,3,75,74,13 DATA 3,19,11,13,19,27,11,13 DATA 19,20,67,13,20,68,67,13 DATA 20,4,28,13,4,12,28,13 DATA 4,5,76,13,5,77,76,13 DATA 5,21,13,13,21,29,13,13 DATA 21,22,69,13,22,70,69,13 DATA 22,6,30,13,6,14,30,13 DATA 6,7,78,13,7,79,78,13 DATA 7,23,15,13,23,31,15,13 DATA 23,24,71,13,24,72,71,13 DATA 24,8,32,13,8,16,32,13 DATA 8,1,80,13,1,73,80,13 DATA 1,89,2,13,89,90,2,13 DATA 2,90,3,13,90,91,3,13 DATA 3,91,4,13,91,92,4,13 DATA 4,92,5,13,92,93,5,13 DATA 5,93,6,13,93,94,6,13 DATA 6,94,7,13,94,95,7,13 DATA 7,95,8,13,95,96,8,13 DATA 8,96,1,13,96,89,1,13 DATA 34,41,49,13,41,50,49,13 DATA 41,42,50,13,42,51,50,13 DATA 42,35,51,13,35,52,51,13 DATA 49,52,34,13,52,35,34,13 DATA 36,43,53,13,43,54,53,13 DATA 43,44,54,13,44,55,54,13 DATA 44,37,55,13,37,56,55,13 DATA 53,56,36,13,56,37,36,13 DATA 38,45,57,13,45,58,57,13 DATA 45,46,58,13,46,59,58,13 DATA 46,39,59,13,39,60,59,13 DATA 57,60,38,13,60,39,38,13 DATA 40,47,61,13,47,62,61,13 DATA 47,48,62,13,48,63,62,13 DATA 48,33,63,13,33,64,63,13 DATA 61,64,40,13,64,33,40,13 DATA 17,65,25,13,65,66,25,13 DATA 66,26,25,13,18,26,66,13 DATA 19,67,27,13,67,68,27,13 DATA 68,28,27,13,20,28,68,13 DATA 21,69,29,13,69,70,29,13 DATA 70,39,29,13,22,30,70,13 DATA 23,71,31,13,71,72,31,13 DATA 72,32,31,13,24,32,72,13 DATA 2,74,34,13,2,34,10,13 DATA 3,35,75,13,3,11,35,13 DATA 4,76,36,13,4,36,12,13 DATA 5,37,77,13,5,13,37,13 DATA 6,78,38,13,6,38,14,13 DATA 7,39,79,13,7,15,39,13 DATA 8,80,40,13,8,40,16,13 DATA 1,33,73,13,1,9,32,13 DATA 50,51,49,2,51,52,49,2 DATA 54,55,53,2,55,56,53,2 DATA 58,59,57,2,59,60,57,2 DATA 62,63,61,2,63,64,61,2 DATA 81,82,0,2,82,83,0,2 DATA 83,84,0,2,84,85,0,2 DATA 85,86,0,2,86,87,0,2 DATA 87,88,0,2,88,81,0,2 DATA 89,97,90,1,90,97,91,1 DATA 91,97,92,1,92,97,93,1 DATA 93,97,94,1,94,97,95,1 DATA 95,97,96,1,96,97,89,1 |
(ボタンを押さず)上下左右にスライド | |
(ボタンを押さず)右端を上下にスライド | |
@TRIANGLE | 他で使用していないラベルを付ける |
' VERTEX DATA | 頂点データを示す注釈(無くても可) |
DATA 3 | 頂点データ数が3個であるということを示すデータ |
DATA 0,0,0,0,-50,50,50,50,0 | 頂点データのX、Y、Z座標をそれぞれ入力 |
' LINE DATA | ワイヤー(線)データを示す注釈(無くても可) |
DATA 3,4 | 線の数が3本、線の色が青色であるということを示すデータ |
DATA 0,1,1,2,2,0 | 頂点0と1、頂点1と2、頂点2と0を繋ぐということを示すデータ |
' POLYGON DATA | ポリゴン(三角形)データを示す注釈(無くても可) |
DATA 1 | 三角形の数が1つということを示すデータ |
DATA 0,1,2,4 | 頂点0と1と2を繋いで青色で塗りつぶした三角形ということを示すデータ |
X軸回転 | x'=x | y'=y cos Rx - z sin Rx | z'=y sin Rx + z cos Rx |
Y軸回転 | x'=x cos Ry + z sin Ry | y'=y | z'=-x sin Rx + z cos Ry |
(x1,y1,z1)、(x2,y2,z2)、(x3,y3,z3)を3点に持つポリゴン面においてベクトルV1=(x1-x3,y1-y3,z1-z3)、ベクトルV2=(x2-x1,y2-y1,z2-z1)としたときにその外積を計算すればポリゴン面に垂直なベクトルのX成分、Y成分、Z成分は下記のようになる。 Nx=(y1-y3)(z2-z1)-(z1-z3)(y2-y1) Ny=(z1-z3)(x2-x1)-(x1-x3)(z2-z1) Nz=(x1-x3)(y2-y1)-(y1-y3)(x2-x1) 単位ベクトル化(長さ1のベクトルにする)のためX、Y、Z成分をそれぞれSQR(Nx^2+Ny^2+Nz^2)で割れば法線ベクトルとなる。 |
ポリゴン面の法線ベクトル=(Nx,Ny,Nz) ※これは単位ベクトル化する前のもの 視線ベクトル=(0,0,1) ※パースOFFの場合 法線ベクトルと視線ベクトルの内積より cosθ=Nz/SQR(Nx^2+Ny^2+Nz^2) 分母は必ず正数になるためパースOFF時はNzの値のみでポリゴンの裏表の判断が可能になる |