3D bouncing cube with retro background
Posted: Mon Mar 06, 2017 2:19 am
Just some fun as I waiting for an appointment.
Code: Select all
REM 3d cube with retro background
REM iPhone 6+ / 10.3 b4
REM I havent added texture to the cube
REM yet. I got lazy...
REM you can change the object to the amiga ball. :)
REM enjoy...
GRAPHICS
GOSUB setup
LOOP:
REFRESH OFF
GRAPHICS CLEAR 0,0,0
GOSUB background
sizez=15*SIN(mm*10)
GOSUB rotate
GOSUB construct
REFRESH
GOTO LOOP
'Draw The Object
construct:
FOR a=1 TO faces
GOSUB drawface
NEXT a
RETURN
'Draw A Face Of The Object
drawface:
vx1= tx(f1(a))-tx(f2(a))
vy1= ty(f1(a))-ty(f2(a))
vx2= tx(f3(a))-tx(f2(a))
vy2= ty(f3(a))-ty(f2(a))
n= vx1*vy2-vx2*vy1
IF n<0 THEN
n=-(n/3000)
FILL COLOR (r(a)+n)/255,(g(a)+n)/255,(b(a)+n)/255
FILL TRI tx(f1(a)),ty(f1(a)) , tx(f2(a)),ty(f2(a)) , tx(f3(a)),ty(f3(a))
FILL TRI tx(f1(a)),ty(f1(a)) , tx(f4(a)),ty(f4(a)) , tx(f3(a)),ty(f3(a))
IF clss(a)=1 THEN
DRAW COLOR 25/255,25/255,25/255
DRAW LINE tx(f1(a)),ty(f1(a)) TO tx(f2(a)),ty(f2(a))
DRAW LINE tx(f2(a)),ty(f2(a)) TO tx(f3(a)),ty(f3(a))
DRAW LINE tx(f3(a)),ty(f3(a)) TO tx(f4(a)),ty(f4(a))
DRAW LINE tx(f4(a)),ty(f4(a)) TO tx(f1(a)),ty(f1(a))
END IF
END IF
RETURN
rotate:
'Rotate And Scale Each Point. Store Result
FOR a=1 TO points
x1=x(a)
y1=y(a)
z1=z(a)
' X,Y,Z rotations!
xx=x1
yy=y1*cs(xr)+z1*sn(xr)
zz=z1*cs(xr)-y1*sn(xr)
y1=yy
x1=xx*cs(yr)-zz*sn(yr)
z1=xx*sn(yr)+zz*cs(yr)
zz=z1
xx=x1*cs(zr)-y1*sn(zr)
yy=x1*sn(zr)+y1*cs(zr)
'Apply Perspective!
dv=(zz/40)+1
xx=sizez*(xx/dv)+sw/2
yy=sizez*(yy/dv)+sh/2
tx(a)=xx
ty(a)=yy
tz(a)=zz
NEXT a
xr=xr+1
yr=yr+2
zr=zr+3
IF xr>720 THEN
xr=xr-720
END IF
IF yr>720 THEN
yr=yr-720
END IF
IF zr>720 THEN
zr=zr-720
END IF
RETURN
background:
mm=mm+.005
b1=1000*SIN(mm)
g1=1000*SIN(mm/2)
r1=1000*SIN(mm/3)
FOR a=1 TO SCREEN_HEIGHT() STEP res
FILL COLOR (r1+a)/1000,(g1+a)/1000,(b1+a)/1000
FILL RECT 0,a TO SCREEN_WIDTH(),a+res
NEXT a
RETURN
setup:
res=20 '12 'detail
DIM rs(1442)
FOR a=1 TO 1440
rs(a)=226+400*SIN((a/2)*PI/180)
NEXT a
'Define the necessary variables;
sizez=.1 ' how big do you want it?
points=8 ' The amount of points in the object
faces=6 ' The Amount of faces in the object
DIM x(points+1) ' Original X co-ordinate store
DIM y(points+1) ' Original Y co-ordinate store
DIM z(points+1) ' Original Z co-ordinate store
DIM tx(points+1) ' Transformed X co-ordinate store
DIM ty(points+1) ' Transformed Y co-ordinate store
DIM tz(points+1) ' Transformed Z co-ordinate store
DIM f1(faces+1) ' Connections definition
DIM f2(faces+1) ' Connections definition
DIM f3(faces+1) ' Connections definition
DIM f4(faces+1) ' Connections definition
DIM r(faces+1) ' Red Component
DIM g(faces+1) ' Green Component
DIM b(faces+1) ' Blue Component
DIM clss(faces+1) ' Cell Shade Face?
xr=1
yr=2
zr=3
'Define Sine Tables for faster matrix calculations;
DIM cs(721)
DIM sn(721)
sw = SCREEN_WIDTH()
sh = SCREEN_HEIGHT()
PI = 3.1415
FOR ang=1 TO 720
cs(ang)=COS(ang*(PI/360))
sn(ang)=SIN(ang*(PI/360))
NEXT ang
' Read in the object's points
FOR a=1 TO points
READ x(a),y(a),z(a)
NEXT a
'Read In Connections and face parameters
FOR a=1 TO faces
READ f1(a)
READ f2(a)
READ f3(a)
READ f4(a)
READ r(a),g(a),b(a),clss(a)
NEXT a
' The Object Description As Data!
' The Data Below Describes A Cube.
'Points definition
'Below are the points of the object defined as x,y,z;
DATA -10,10,10,10,10,10,10,-10,10,-10,-10,10
DATA -10,10,-10,10,10,-10,10,-10,-10,-10,-10,-10
'Connection definition;
'Below are the faces of the object defined as vertice
'numbers, specified in clockwise order. These are followed
'by r,g,b values for the face and finally cell shaded
'parameter (0)=off (1)=on.
DATA 1,2,3,4,30,0,0,1
DATA 5,8,7,6,30,0,0,1
DATA 6,2,1,5,0,30,0,1
DATA 8,4,3,7,0,30,0,1
DATA 2,6,7,3,0,0,30,1
DATA 8,5,1,4,0,0,30,1
RETURN