home *** CD-ROM | disk | FTP | other *** search
- // chap2_8.cpp;
-
- #include <iostream.h>
- #include <graphics.h>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
-
- #define PI 3.141592654
-
-
- const xoffset=640/2;
- const yoffset=480/2;
- const xscale=1;
- const yscale=-1;
- const persp=500;
-
- struct point
- {
- float xw, yw, zw;
- int xs, ys, zs;
- } vertex[18];
-
- typedef float matrix_4x4[4][4];
- int edges[27][27];
- FILE *fp;
- int c;
- char ch;
- matrix_4x4 w2v, temp, temp2;
-
- void initialise_graphics()
- {
- int gdriver=DETECT, gmode, errorcode;
-
- initgraph(&gdriver, &gmode,"");
- errorcode=graphresult();
- if (errorcode!=grOk)
- {
- printf("Graphics Error: %s\n",grapherrormsg(errorcode));
- printf("Program Aborted \n");
- exit(1);
- }
- setlinestyle(0,0,3);
- setcolor(WHITE);
-
- }
-
- void translate(float x, float y, float z, matrix_4x4 m)
- {
- m[0][0]=1; m[1][0]=0; m[2][0]=0; m[3][0]=0;
- m[0][1]=0; m[1][1]=1; m[2][1]=0; m[3][1]=0;
- m[0][2]=0; m[1][2]=0; m[2][2]=1; m[3][2]=0;
- m[0][3]=x; m[1][3]=y; m[2][3]=z; m[3][3]=1;
- };
-
- void rotate_x(float t, matrix_4x4 m)
- {
- m[0][0]=1; m[1][0]=0; m[2][0]=0; m[3][0]=0;
- m[0][1]=0; m[1][1]=cos(t); m[2][1]=sin(t); m[3][1]=0;
- m[0][2]=0; m[1][2]=-sin(t); m[2][2]=cos(t); m[3][2]=0;
- m[0][3]=0; m[1][3]=0; m[2][3]=0; m[3][3]=1;
- };
-
-
- void rotate_y(float t, matrix_4x4 m)
- {
- m[0][0]=cos(t); m[1][0]=0; m[2][0]=-sin(t); m[3][0]=0;
- m[0][1]=0; m[1][1]=1; m[2][1]=0; m[3][1]=0;
- m[0][2]=sin(t); m[1][2]=0; m[2][2]=cos(t); m[3][2]=0;
- m[0][3]=0; m[1][3]=0; m[2][3]=0; m[3][3]=1;
- };
-
- void rotate_z(float t, matrix_4x4 m)
- {
- m[0][0]=cos(t); m[1][0]=sin(t); m[2][0]=0; m[3][0]=0;
- m[0][1]=-sin(t); m[1][1]=cos(t); m[2][1]=0; m[3][1]=0;
- m[0][2]=0; m[1][2]=0; m[2][2]=1; m[3][2]=0;
- m[0][3]=0; m[1][3]=0; m[2][3]=0; m[3][3]=1;
- };
-
- void copy_4x4(matrix_4x4 in, matrix_4x4 out)
- {
- int c, r;
- for (r=0; r<4; r++)
- for (c=0; c<4; c++)
- out[r][c]=in[r][c];
- }
-
- void mult_4x4(matrix_4x4 a, matrix_4x4 b, matrix_4x4 m)
- {
- int c;
- for (c=0; c<4; c++)
- m[c][0]=a[0][0]*b[c][0]+a[1][0]*b[c][1]+a[2][0]*b[c][2]+a[3][0]*b[c][3];
- for (c=0; c<4; c++)
- m[c][1]=a[0][1]*b[c][0]+a[1][1]*b[c][1]+a[2][1]*b[c][2]+a[3][1]*b[c][3];
- for (c=0; c<4; c++)
- m[c][2]=a[0][2]*b[c][0]+a[1][2]*b[c][1]+a[2][2]*b[c][2]+a[3][2]*b[c][3];
- for (c=0; c<4; c++)
- m[c][3]=a[0][3]*b[c][0]+a[1][3]*b[c][1]+a[2][3]*b[c][2]+a[3][3]*b[c][3];
- };
-
-
- void draw_picture()
- {
- int c;
- cleardevice();
- for (c=0; c<27; c++)
- line(vertex[edges[c][0]].xs,vertex[edges[c][0]].ys,vertex[edges[c][1]].xs,vertex[edges[c][1]].ys);
- };
-
- void transform(matrix_4x4 m)
- {
- int c;
- for (c=0; c<18; c++)
- {
- vertex[c].zs=(vertex[c].xw*m[2][0]+vertex[c].yw*m[2][1]+vertex[c].zw*m[2][2]+m[2][3]);
- vertex[c].xs=(((vertex[c].xw*m[0][0]+vertex[c].yw*m[0][1]+vertex[c].zw*m[0][2]+m[0][3])
- *(persp/float(vertex[c].zs))*xscale)+xoffset);
- vertex[c].ys=(((vertex[c].xw*m[1][0]+vertex[c].yw*m[1][1]+vertex[c].zw*m[1][2]+m[1][3])
- *(persp/float(vertex[c].zs))*yscale)+yoffset);
- };
- };
-
- void main()
- {
- clrscr();
- printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n");
- printf("This is from Chapter 2 Step 8 of the Virtual Reality Homebrewer\'s Handbook \n");
- printf("and shows how to move around a virtual shape drawn in wireframe. \n");
- printf("\n");
- printf("\n");
- printf("Controls: 8/2 - move forwards/back \n");
- printf(" 4/6 - move left/back \n");
- printf(" 7/1 - move up/down \n");
- printf(" o/l - pitch up/down \n");
- printf(" </> - yaw left/right \n");
- printf(" n/m - roll left/right \n");
- printf("\n");
- printf(" q - quit \n");
- printf("\n");
- printf(" Press any key to continue \n");
- ch=getch();
-
-
-
- // Read in vertex data
- if ((fp=fopen("points.dat","r"))==NULL)
- {
- puts("Can't open points.dat");
- exit(0);
- }
- for (c=0; c<18; c++)
- {
- fscanf(fp,"%f %f %f \n",&vertex[c].xw,&vertex[c].yw,&vertex[c].zw);
- }
- fclose(fp);
- // Move to z=500
- for (c=0; c<18; c++)
- vertex[c].zw=vertex[c].zw+500;
-
- // Read in edge data
- if ((fp=fopen("edges.dat","r"))==NULL)
- {
- puts("Can't open edges.dat");
- exit(0);
- }
- for (c=0; c<27; c++)
- fscanf(fp,"%d %d \n",&edges[c][0],&edges[c][1]);
- fclose(fp);
- for (c=0; c<27; c++)
- {
- edges[c][0]--; edges[c][1]--;
- }
-
- initialise_graphics();
-
- translate(0,0,0,w2v);
- transform(w2v);
- draw_picture();
- do
- {
- ch=getch();
- switch (ch)
- {
- case '8': {
- translate(0,0,-10,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '2': {
- translate(0,0,10,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '4': {
- translate(10,0,0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '6': {
- translate(-10,0,0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '1': {
- translate(0,10,0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '7': {
- translate(0,-10,0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case ',': {
- rotate_y(PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case '.': {
- rotate_y(-PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case 'm': {
- rotate_z(PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case 'n': {
- rotate_z(-PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case 'o': {
- rotate_x(PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- case 'l': {
- rotate_x(-PI/180.0,temp);
- mult_4x4(w2v,temp,temp2);
- copy_4x4(temp2,w2v);
- break;
- };
- };
- transform(w2v);
- draw_picture();
- }
- while (ch!='q');
- closegraph();
- }