DECLARE FUNCTION arctan! (s1!, s2!) edit: SCREEN 9, , 1, 1 COLOR 2 CLS PRINT " Cool 3D Stuff by John": PRINT : PRINT PRINT "1 load built in cube": PRINT PRINT "2 load a shape from 'c:\qbasic71\3dtest2.txt'": PRINT PRINT "3 quit": PRINT DO button$ = INKEY$ LOOP UNTIL button$ <> "" IF button$ = "2" THEN OPEN "c:\qbasic71\3dtest2.txt" FOR INPUT AS 1 INPUT #1, numberoflines REDIM threeDdat(numberoflines, 7) FOR l = 1 TO numberoflines FOR c = 1 TO 7 INPUT #1, threeDdat(l, c) NEXT c NEXT l CLOSE GOSUB display END IF IF button$ = "1" THEN REDIM threeDdat(12, 7) numberoflines = 12 RESTORE FOR p = 1 TO numberoflines FOR c = 1 TO 7 'read into array READ threeDdat(p, c) NEXT c NEXT p GOSUB display END IF IF button$ = "3" THEN END GOTO edit 'OPEN "c:\qbasic71\3dtest2.txt" FOR OUTPUT AS 1 'FOR l = 1 TO numberoflines ' WRITE #1, threedDat(l, 1), threedDat(l, 2), threedDat(l, 3), threedDat(l, 4), threedDat(l, 5), threedDat(l, 6), threedDat(l, 7) 'NEXT l 'CLOSE display: KEY 15, CHR$(0) + CHR$(72) KEY 16, CHR$(0) + CHR$(75) KEY 17, CHR$(0) + CHR$(77) KEY 18, CHR$(0) + CHR$(80) KEY 19, CHR$(0) + CHR$(1) KEY 20, CHR$(0) + CHR$(71) KEY 21, CHR$(0) + CHR$(73) KEY 22, CHR$(0) + CHR$(30) KEY 23, CHR$(0) + CHR$(44) ON KEY(15) GOSUB up ON KEY(16) GOSUB left ON KEY(17) GOSUB right ON KEY(18) GOSUB down ON KEY(19) GOSUB quit ON KEY(20) GOSUB yawleft ON KEY(21) GOSUB yawright ON KEY(22) GOSUB zoomin ON KEY(23) GOSUB zoomout FOR i = 15 TO 23 KEY(i) ON NEXT i depth = 200 CONST pi = 3.141593 SCREEN 9, , 0, 1 '640*350, writing page 0, seeing page 1 CLS COLOR 2 top: DO frame = frame + 1: IF frame > 10 THEN frame = 1 IF frame = 1 THEN timestartrender = TIMER IF rotx <> 0 THEN FOR l = 1 TO numberoflines y1a = threeDdat(l, 2) z1a = threeDdat(l, 3) y2a = threeDdat(l, 5) z2a = threeDdat(l, 6) y1b = SQR(y1a ^ 2 + z1a ^ 2) * SIN(arctan(y1a, z1a) + rotx) z1b = SQR(y1a ^ 2 + z1a ^ 2) * COS(arctan(y1a, z1a) + rotx) y2b = SQR(y2a ^ 2 + z2a ^ 2) * SIN(arctan(y2a, z2a) + rotx) z2b = SQR(y2a ^ 2 + z2a ^ 2) * COS(arctan(y2a, z2a) + rotx) threeDdat(l, 2) = y1b threeDdat(l, 3) = z1b threeDdat(l, 5) = y2b threeDdat(l, 6) = z2b NEXT l 'rotx = 0 END IF IF roty <> 0 THEN FOR l = 1 TO numberoflines x1a = threeDdat(l, 1) z1a = threeDdat(l, 3) x2a = threeDdat(l, 4) z2a = threeDdat(l, 6) x1b = SQR(x1a ^ 2 + z1a ^ 2) * COS(arctan(z1a, x1a) + roty) z1b = SQR(x1a ^ 2 + z1a ^ 2) * SIN(arctan(z1a, x1a) + roty) x2b = SQR(x2a ^ 2 + z2a ^ 2) * COS(arctan(z2a, x2a) + roty) z2b = SQR(x2a ^ 2 + z2a ^ 2) * SIN(arctan(z2a, x2a) + roty) threeDdat(l, 1) = x1b threeDdat(l, 3) = z1b threeDdat(l, 4) = x2b threeDdat(l, 6) = z2b NEXT l 'roty = 0 END IF IF rotz <> 0 THEN FOR l = 1 TO numberoflines x1a = threeDdat(l, 1) y1a = threeDdat(l, 2) x2a = threeDdat(l, 4) y2a = threeDdat(l, 5) x1b = SQR(x1a ^ 2 + y1a ^ 2) * SIN(arctan(x1a, y1a) + rotz) y1b = SQR(x1a ^ 2 + y1a ^ 2) * COS(arctan(x1a, y1a) + rotz) x2b = SQR(x2a ^ 2 + y2a ^ 2) * SIN(arctan(x2a, y2a) + rotz) y2b = SQR(x2a ^ 2 + y2a ^ 2) * COS(arctan(x2a, y2a) + rotz) threeDdat(l, 1) = x1b threeDdat(l, 2) = y1b threeDdat(l, 4) = x2b threeDdat(l, 5) = y2b NEXT l 'rotz = 0 END IF LINE (0, 14)-(640, 350), 0, BF 'clear display FOR l = 1 TO numberoflines 'display figure x1 = threeDdat(l, 1) y1 = threeDdat(l, 2) z1 = threeDdat(l, 3) x2 = threeDdat(l, 4) y2 = threeDdat(l, 5) z2 = threeDdat(l, 6) 'PALETTE 1, INT((threeDdat(l, 6) + threeDdat(l, 3)) / 2) c = 1 'threeDdat(l, 7) LINE (320 + x1 * 2 ^ (-z1 / depth), 175 + (35 / 48) * (y1 * 2 ^ (-z1 / depth)))-(320 + x2 * 2 ^ (-z2 / depth), 175 + (35 / 48) * (y2 * 2 ^ (-z2 / depth))), c NEXT l IF frame = 10 THEN LOCATE 1, 1 PRINT "fps ", 10 / (TIMER - timestartrender) END IF PCOPY 0, 1 LOOP 'horizontal lines, then vertical lines DATA -50,-50,-50, 50,-50,-50, 1 DATA -50,-50, 50, 50,-50, 50, 2 DATA -50,-50,-50,-50,-50, 50, 3 DATA 50,-50,-50, 50,-50, 50, 4 DATA -50, 50,-50, 50, 50,-50, 5 DATA -50, 50, 50, 50, 50, 50, 6 DATA -50, 50,-50,-50, 50, 50, 7 DATA 50, 50,-50, 50, 50, 50, 8 DATA -50, 50,-50,-50,-50,-50, 9 DATA 50, 50,-50, 50,-50,-50, 10 DATA -50, 50, 50,-50,-50, 50, 11 DATA 50, 50, 50, 50,-50, 50, 12 ' x1 y1 z1 x2 y2 z2 color ' 1 2 3 4 5 6 7 up: rotx = rotx + .01 RETURN down: rotx = rotx - .01 RETURN left: roty = roty - .01 RETURN right: roty = roty + .01 RETURN yawleft: rotz = rotz + .01 RETURN yawright: rotz = rotz - .01 RETURN zoomin: FOR l = 1 TO numberoflines threeDdat(l, 3) = threeDdat(l, 3) - 1 threeDdat(l, 6) = threeDdat(l, 6) - 1 NEXT l RETURN zoomout: RETURN quit: GOTO edit RETURN FUNCTION arctan (s1, s2) IF s2 = 0 THEN IF s1 > 0 THEN arctan = pi / 2 ELSE arctan = 3 * pi / 4 ELSEIF s2 < 0 THEN IF s1 > 0 THEN arctan = ATN(s1 / s2) + pi ELSE arctan = ATN(s1 / s2) + pi ELSEIF s2 > 0 THEN IF s1 > 0 THEN arctan = ATN(s1 / s2) ELSE arctan = ATN(s1 / s2) + 2 * pi END IF END FUNCTION