home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Virtual Reality Homebrewer's Handbook
/
vr.iso
/
3dgraph
/
pascal
/
chap2_8.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-03-19
|
7KB
|
222 lines
program chap2_8;
uses graph, crt;
const xoffset=640/2;
yoffset=480/2;
xscale=1;
yscale=-1;
persp=500;
type point=record
xw, yw, zw : real;
xs, ys, zs : integer;
end;
matrix_4x4=array[1..4,1..4] of real;
var vertex : array[1..18] of point;
edges : array[1..27,1..27] of integer;
f : text;
c : integer;
ch : char;
w2v, temp, temp2 : matrix_4x4;
procedure Initialise_Graphics;
var Graphdriver, Graphmode, Errorcode : integer;
begin
Graphdriver:=Detect;
InitGraph(Graphdriver, Graphmode,'');
Errorcode:=graphresult;
if Errorcode<>grOk then
begin
writeln('Graphics Error: ',GraphErrorMsg(ErrorCode));
writeln('Program Aborted');
Halt(1);
end;
SetLineStyle(0,0,3);
end;
procedure translate(x,y,z : real; var m : matrix_4x4);
begin
m[1,1]:=1; m[2,1]:=0; m[3,1]:=0; m[4,1]:=0;
m[1,2]:=0; m[2,2]:=1; m[3,2]:=0; m[4,2]:=0;
m[1,3]:=0; m[2,3]:=0; m[3,3]:=1; m[4,3]:=0;
m[1,4]:=x; m[2,4]:=y; m[3,4]:=z; m[4,4]:=1;
end;
procedure rotate_x(t : real; var m : matrix_4x4);
begin
m[1,1]:=1; m[2,1]:=0; m[3,1]:=0; m[4,1]:=0;
m[1,2]:=0; m[2,2]:=cos(t); m[3,2]:=sin(t); m[4,2]:=0;
m[1,3]:=0; m[2,3]:=-sin(t); m[3,3]:=cos(t); m[4,3]:=0;
m[1,4]:=0; m[2,4]:=0; m[3,4]:=0; m[4,4]:=1;
end;
procedure rotate_y(t : real; var m : matrix_4x4);
begin
m[1,1]:=cos(t); m[2,1]:=0; m[3,1]:=-sin(t); m[4,1]:=0;
m[1,2]:=0; m[2,2]:=1; m[3,2]:=0; m[4,2]:=0;
m[1,3]:=sin(t); m[2,3]:=0; m[3,3]:=cos(t); m[4,3]:=0;
m[1,4]:=0; m[2,4]:=0; m[3,4]:=0; m[4,4]:=1;
end;
procedure rotate_z(t : real; var m : matrix_4x4);
begin
m[1,1]:=cos(t); m[2,1]:=sin(t); m[3,1]:=0; m[4,1]:=0;
m[1,2]:=-sin(t); m[2,2]:=cos(t); m[3,2]:=0; m[4,2]:=0;
m[1,3]:=0; m[2,3]:=0; m[3,3]:=1; m[4,3]:=0;
m[1,4]:=0; m[2,4]:=0; m[3,4]:=0; m[4,4]:=1;
end;
procedure mult_4x4(a,b : matrix_4x4; var m : matrix_4x4);
var c : integer;
begin
for c:=1 to 4 do
m[c,1]:=a[1,1]*b[c,1]+a[2,1]*b[c,2]+a[3,1]*b[c,3]+a[4,1]*b[c,4];
for c:=1 to 4 do
m[c,2]:=a[1,2]*b[c,1]+a[2,2]*b[c,2]+a[3,2]*b[c,3]+a[4,2]*b[c,4];
for c:=1 to 4 do
m[c,3]:=a[1,3]*b[c,1]+a[2,3]*b[c,2]+a[3,3]*b[c,3]+a[4,3]*b[c,4];
for c:=1 to 4 do
m[c,4]:=a[1,4]*b[c,1]+a[2,4]*b[c,2]+a[3,4]*b[c,3]+a[4,4]*b[c,4];
end;
procedure draw_picture;
var c : integer;
begin
ClearDevice;
for c:=1 to 27 do
line(vertex[edges[c,1]].xs,vertex[edges[c,1]].ys,vertex[edges[c,2]].xs,vertex[edges[c,2]].ys);
end;
procedure transform(m : matrix_4x4);
var c : integer;
begin
for c:=1 to 18 do
begin
vertex[c].zs:=round(vertex[c].xw*m[3,1]+vertex[c].yw*m[3,2]+vertex[c].zw*m[3,3]+m[3,4]);
vertex[c].xs:=round(((vertex[c].xw*m[1,1]+vertex[c].yw*m[1,2]+vertex[c].zw*m[1,3]+m[1,4])
*(persp/vertex[c].zs)*xscale)+xoffset);
vertex[c].ys:=round(((vertex[c].xw*m[2,1]+vertex[c].yw*m[2,2]+vertex[c].zw*m[2,3]+m[2,4])
*(persp/vertex[c].zs)*yscale)+yoffset);
end;
end;
begin
clrscr;
writeln; writeln; writeln; writeln; writeln;
writeln('This is from Chapter 2 Step 8 of the Virtual Reality Homebrewer''s Handbook');
writeln('and shows how to move around a virtual shape drawn in wireframe.');
writeln;
writeln;
writeln('Controls: 8/2 - move forwards/back');
writeln(' 4/6 - move left/back');
writeln(' 7/1 - move up/down');
writeln(' o/l - pitch up/down');
writeln(' </> - yaw left/right');
writeln(' n/m - roll left/right');
writeln;
writeln(' q - quit');
writeln;
writeln(' Press any key to continue');
ch:=ReadKey;
{Read in vertices}
assign(f,'points.dat');
reset(f);
for c:=1 to 18 do
begin
readln(f,vertex[c].xw,vertex[c].yw,vertex[c].zw);
end;
close(f);
{Move to z=500}
for c:=1 to 18 do
begin
vertex[c].zw:=vertex[c].zw+500;
end;
{Read in edges}
assign(f,'edges.dat');
reset(f);
for c:=1 to 27 do
readln(f,edges[c,1], edges[c,2]);
close(f);
Initialise_Graphics;
translate(0,0,0,w2v);
transform(w2v);
draw_picture;
repeat
ch:=Readkey;
case ch of
'8': begin
translate(0,0,-10,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'2': begin
translate(0,0,10,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'4': begin
translate(10,0,0,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'6': begin
translate(-10,0,0,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'1': begin
translate(0,10,0,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'7': begin
translate(0,-10,0,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
',': begin
rotate_y(PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'.': begin
rotate_y(-PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'm': begin
rotate_z(PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'n': begin
rotate_z(-PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'o': begin
rotate_x(PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
'l': begin
rotate_x(-PI/180,temp);
mult_4x4(w2v,temp,temp2);
w2v:=temp2;
end;
end;
transform(w2v);
draw_picture;
until ch='q';
CloseGraph;
end.