home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 10: Diskmags
/
nf_archive_10.iso
/
MAGS
/
ST_USER
/
1989
/
USER0889.MSA
/
FAST_BAS_RAYTRACE.BSC
< prev
next >
Wrap
Text File
|
1985-11-19
|
8KB
|
491 lines
\*********************
\* Ray Tracing *
\* By Haniff Dinn *
\* (c) Atari ST User *
\*********************
PROC_Initialise
PROC_Set_Colours
PROC_Set_World
PROC_Draw_Chessboard(0,Alpha,0)
PROC_Shadow(Radii,Originx,Originy,Originz)
PROC_Sphere(Radii,Originx,Originy,Originz)
BEEP
Key=GET
END
DEFPROC_Initialise
\ Set Full Screen
TXTRECT 0,0,320,200
GRAFRECT 0,0,320,200
HIDEMOUSE
CLS
\ For Triangle Procedure
DIM X&(2),Y&(2)
\ Perspective Parameters
\ p1 Is Scaling Factor
p1=600
\ p2 Is Distance From Origin
\ To Viewpoint Along -Z Axis
p2=300
\ Screen Origin
xo=160:yo=100
\ Calculation Data Arrays
DIM vx(3),vy(3),vz(3)
DIM px(2),py(2),pz(2)
\ Trace Ray Procedure Parameters
l=0:m=0:n=0
\ Rotation Procedure Parameters
i=0:j=0:k=0
ENDPROC
DEFPROC_Set_Colours
RESTORE Colours
FOR L=0 TO 15
READ Red,Green,Blue
PALETTE L,Red*1000/7,Green*1000/7,Blue*1000/7
NEXT L
ENDPROC
Colours:
\ Black
DATA 0,0,0
\ White
DATA 7,7,7
\ Dark Grey To Light Grey
DATA 2,2,2
DATA 4,4,4
DATA 5,5,5
DATA 6,6,6
\ Red To Light Red
DATA 7,0,0
DATA 7,3,3
DATA 7,4,4
DATA 7,5,5
DATA 7,6,6
\ Blue To Light Blue
DATA 0,0,7
DATA 3,3,7
DATA 4,4,7
DATA 5,5,7
DATA 6,6,7
DEFPROC_Set_World
\ Which Y,Z Plane Does Chessboard Exist?
Depth=80
\ Grid Parameters
\ nx,nz Are Number Of +ve & -ve Squares
\ dx,dz Are Length Of Squares
nx=6
nz=6
dx=50
dz=50
\ This Is Rotation Of Chessboard
\ Around 'Y' Axis
Alpha=45
\ Light Source Position
Sx=50
Sy=-100
Sz=-90
\ f is scaling factor For
\ Other Calculations
f=100
lx=Sx*f
ly=Sy*f
lz=Sz*f
\ Sphere Radius
Radii=79
\ Sphere Origin In World
Originx=0
Originy=0
Originz=0
ENDPROC
DEFPROC_Draw_Chessboard(a,b,c)
FOR X=-nx TO nx STEP 1
FOR Z= nz TO-nz STEP -1
I=X*dx
J=Depth
K=Z*dz
V1X=I
V1Y=J
V1Z=K
V2X=I
V2Y=J
V2Z=K-dz
V3X=I-dx
V3Y=J
V3Z=K
V4X=I-dx
V4Y=J
V4Z=K-dz
\Rotate Current Square
PROC_rot(a,b,c,V1X,V1Y,V1Z)
V1X=i:V1Y=j:V1Z=k
PROC_rot(a,b,c,V2X,V2Y,V2Z)
V2X=i:V2Y=j:V2Z=k
PROC_rot(a,b,c,V3X,V3Y,V3Z)
V3X=i:V3Y=j:V3Z=k
PROC_rot(a,b,c,V4X,V4Y,V4Z)
V4X=i:V4Y=j:V4Z=k
\Get 2D Co-Ordinates
V1X=FN_Xpers(V1X,V1Y,V1Z,p1,p2)
V1Y=FN_Ypers(V1X,V1Y,V1Z,p1,p2)
V2X=FN_Xpers(V2X,V2Y,V2Z,p1,p2)
V2Y=FN_Ypers(V2X,V2Y,V2Z,p1,p2)
V3X=FN_Xpers(V3X,V3Y,V3Z,p1,p2)
V3Y=FN_Ypers(V3X,V3Y,V3Z,p1,p2)
V4X=FN_Xpers(V4X,V4Y,V4Z,p1,p2)
V4Y=FN_Ypers(V4X,V4Y,V4Z,p1,p2)
\ Find colour of X,Z square C=0=colour1,C=1=colour2
C=(X AND 1) EOR (Z AND 1)
\Red Square
IF C=1 THEN C=6
\Blue Square
IF C=0 THEN C=11
PROC_Triangle(C,V1X,V1Y,V2X,V2Y,V3X,V3Y)
PROC_Triangle(C,V4X,V4Y,V2X,V2Y,V3X,V3Y)
NEXT Z
NEXT X
ENDPROC
DEFPROC_Sphere(R,ox,oy,oz)
LOCAL Y,I,J,K,a,dy,da
\Y STEP
dy=1
\Angular Step
da=1
FOR Y=-R TO R STEP dy
\No Solution To Ray Parallel To Plane
IF Y=0 THEN Y=dy
FOR a=0 TO 360 STEP da
Radius=SQR(R*R-Y*Y)
I=Radius*COSRAD(a)+ox
J=Y+oy
K=Radius*SINRAD(a)+oz
\ I,J,K Is Current Point On Sphere
IF FN_Visible(I,J,K,ox,oy,oz,0,0,-2000)=TRUE THEN
PROC_Trace_Ray(I,J,K,ox,oy,oz)
C1=FN_Light_Source(I,J,K,ox,oy,oz)
C2=FN_Colour_Component(R,I,J,K,ox,oy,oz)
MARKCOL C1+C2
IF C1=-1 THEN MARKCOL 1
PROC_Plot(I,J,K)
ENDIF
NEXT a
NEXT Y
ENDPROC
DEFPROC_Shadow(R,ox,oy,oz)
LOCAL Y,I,J,K,a,dy,da
\Y STEP
dy=2
\Angular Step
da=2
FOR Y=-R TO R STEP dy
\No Solution To Ray Parallel To Plane
IF Y=0 THEN Y=dy
FOR a=0 TO 360 STEP da
Radius=SQR(R*R-Y*Y)
I=Radius*COSRAD(a)+ox
J=Y+oy
K=Radius*SINRAD(a)+oz
\ I,J,K Is Current Point On Sphere
PROC_Trace_Ray(I,J,K,lx,ly,lz)
MARKCOL 2
\Shadow Ray Beyond Chessboard?
PROC_rot(0,-Alpha,0,l,m,n)
u=i:v=j:w=k
IF ABS(u)<dx*(nx+1) AND ABS(w)<dz*(nz+1) THEN
PROC_Plot(l,m,n)
ENDIF
NEXT a
NEXT Y
ENDPROC
\*****************************
\3D Calculations
DEFFN_Visible(X,Y,Z,OX,OY,OZ,Px,Py,Pz)
\ Observer Position
\ Is Pos.Vect: Px,Py,Pz
LOCAL I,J,K,c
\Centre Of Sphere To Surface
I=X-OX
J=Y-OY
K=Z-OZ
\Centre Of Sphere To Observer
Vx=Px-OX
Vy=Py-OY
Vz=Pz-OZ
c=I*Vx+J*Vy+K*Vz
IF c>0 THEN =TRUE
=FALSE
DEFFN_Light_Source(X,Y,Z,OX,OY,OZ)
LOCAL I,J,K,da
\Centre Of Sphere To Light Source
Vx=Sx-OX
Vy=Sy-OY
Vz=Sz-OZ
\Centre Of Sphere To Surface
I=X-OX
J=Y-OY
K=Z-OZ
sp=Vx*I+Vy*J+Vz*K
Ml=SQR(Vx*Vx+Vy*Vy+Vz*Vz)
Mp=SQR(I*I+J*J+K*K)
lp=Ml*Mp
angle=FN_Arccos(sp/lp)
\ White Reflection Of Source=-1
\ Angle Step Is da
da=5
IF angle>=0 AND angle<da THEN=-1
IF angle>da AND angle<2*da THEN=3
IF angle>2*da AND angle<3*da THEN=2
IF angle>3*da AND angle<4*da THEN=1
IF angle>4*da THEN=0
PRINT"Light Source Error"
PRINT"Source Touches Sphere?"
STOP
DEFFN_Colour_Component(R,X,Y,Z,OX,OY,OZ)
LOCAL I,J,K,u,v,w,C
\ Centre Of Sphere To Surface
I=X-OX
J=Y-OY
K=Z-OZ
\ Ray Hits Sky!
IF SGN(J)=-1 THEN =2
\ Ray Beyond ChessBoard?
PROC_rot(0,-Alpha,0,l,m,n)
u=i:v=j:w=k
IF ABS(u) > dx*nx THEN =2
IF ABS(w) > dz*nz THEN =2
\Does Ray Hit Shadow?
Pdist=FN_Reflect(OX,OY,OZ,lx,ly,lz,l,m,n)
\Ray Hits Shadow
IF Pdist<R THEN =3
\ Which Square On Chessboard?
u=ABS( INT(u/dx) )
w=ABS( INT(w/dz) )
C=(u AND 1) EOR (w AND 1)
\Ray Hits Red Square
IF C=1 THEN =7
\Ray Hits Blue Sqaure
IF C=0 THEN =12
PRINT"Colour Component Error"
STOP
DEFFN_Reflect(Cx,Cy,Cz,Lx,Ly,Lz,Bx,By,Bz)
LOCAL I,J,K,U,V,W
\Pos.Vect LC
I=Cx-Lx
J=Cy-Ly
K=Cz-Lz
\Pos.Vect LB
U=Bx-Lx
V=By-Ly
W=Bz-Lz
\Mag. LC
lc=SQR(I*I+J*J+K*K)
\Mag. LB
lb=SQR(U*U+V*V+W*W)
sp=U*I+V*J+W*K
psi=sp/(lb*lc)
Theta=FN_Arccos(psi)
\ Find Perpendicular Distance
\ From Point C To Line LB
Dist=lc*SINRAD(Theta)
=Dist
DEFPROC_Trace_Ray(I,J,K,rx,ry,rz)
LOCAL X,Y,Z,j
\ Plane Lies in Y,Z Plane j
j=Depth
\ Input Points On Plane
\ (Not In Straight Line)
vx(1)=0
vy(1)=j
vz(1)=50
vx(2)=-50
vy(2)=j
vz(2)=-50
vx(3)=50
vy(3)=j
vz(3)=50
\ Form Equation Of line
px(1)=rx
py(1)=ry
pz(1)=rz
px(2)=I
py(2)=J
pz(2)=K
\ Solve Intersection
X1=vx(2)-vx(1)
X2=vy(2)-vy(1)
X3=vz(2)-vz(1)
Y1=vx(3)-vx(1)
Y2=vy(3)-vy(1)
Y3=vz(3)-vz(1)
Z1=px(2)-px(1)
Z2=py(2)-py(1)
Z3=pz(2)-pz(1)
Q1=px(1)-vx(1)
Q2=py(1)-vy(1)
Q3=pz(1)-vz(1)
\ General Determinant Solution
\ X,Y,Z,Q 1:2:3
S1=X1*(Y2*Z3-Z2*Y3)
S2=Y1*(X2*Z3-Z2*X3)
S3=Z1*(X2*Y3-Y2*X3)
D=S1-S2+S3
IF D=0 THEN
PRINT"System Has No Unique Solution"
Key=GET
STOP
ENDIF
S1=Q1*(Y2*Z3-Z2*Y3)
S2=Y1*(Q2*Z3-Z2*Q3)
S3=Z1*(Q2*Y3-Y2*Q3)
Nx=S1-S2+S3
S1=X1*(Q2*Z3-Z2*Q3)
S2=Q1*(X2*Z3-Z2*X3)
S3=Z1*(X2*Q3-Q2*X3)
Ny=S1-S2+S3
S1=X1*(Y2*Q3-Q2*Y3)
S2=Y1*(X2*Q3-Q2*X3)
S3=Q1*(X2*Y3-Y2*X3)
Nz=S1-S2+S3
X=Nx/D
Y=Ny/D
Z=Nz/D
\ Z is negative In Determinents
Z=-Z
\ Find Position Vector Of intersection
\ Using Line Equation
l=px(1)+Z*(px(2)-px(1))
m=py(1)+Z*(py(2)-py(1))
n=pz(1)+Z*(pz(2)-pz(1))
ENDPROC
DEFFN_Arccos(a)
IF a=1 THEN =0
x=-a/SQR(-a*a+1)
=90+DEG(ATN(x))
DEFFN_Arcsin(a)
IF a=1 THEN =90
x=a/SQR(-a*a+1)
=DEG(ATN(x))
\*****************************
\3D Modules
DEFPROC_Plot(X,Y,Z)
XP=FN_Xpers(X,Y,Z,p1,p2)+xo
YP=FN_Ypers(X,Y,Z,p1,p2)+yo
PLOT XP,YP
ENDPROC
DEFPROC_Line(X,Y,Z,X1,Y1,Z1)
x=FN_Xpers(X,Y,Z,p1,p2)+xo
y=FN_Ypers(X,Y,Z,p1,p2)+yo
x1=FN_Xpers(X1,Y1,Z1,p1,p2)+xo
y1=FN_Ypers(X1,Y1,Z1,p1,p2)+yo
LINE x,y TO x1,y1
ENDPROC
DEFFN_Xpers(X1,Y1,Z1,P1,P2)
=P2*X1/(Z1+P1)
DEFFN_Ypers(X1,Y1,Z1,P1,P2)
=P2*Y1/(Z1+P1)
DEFPROC_rot(A,B,C,X,Y,Z)
PROC_Xrot(A,X,Y,Z)
PROC_Yrot(B,i,j,k)
PROC_Zrot(C,i,j,k)
ENDPROC
DEFPROC_Xrot(A,X,Y,Z)
LOCAL C,S,U,V
C=COSRAD(A):S=SINRAD(A)
U=Y*C-Z*S
V=Y*S+Z*C
i=X:j=U:k=V
ENDPROC
DEFPROC_Yrot(A,X,Y,Z)
LOCAL C,S,U,V
C=COSRAD(A):S=SINRAD(A)
U=X*C-Z*S
V=X*S+Z*C
i=U:j=Y:k=V
ENDPROC
DEFPROC_Zrot(A,X,Y,Z)
LOCAL C,S,U,V
C=COSRAD(A):S=SINRAD(A)
U=X*C-Y*S
V=X*S+Y*C
i=U:j=V:k=Z
ENDPROC
DEFPROC_Scale(S,X,Y,Z)
X=X*S
Y=Y*S
Z=Z*S
i=X:j=Y:k=Z
ENDPROC
DEFPROC_Triangle(C,X,Y,X1,Y1,X2,Y2)
FILLCOL C
X&(0)=X+xo: Y&(0)=Y+yo
X&(1)=X1+xo:Y&(1)=Y1+yo
X&(2)=X2+xo:Y&(2)=Y2+yo
POLYGON 3,@X&(0),@Y&(0)
ENDPROC