home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Homebrewer's Handbook / vr.iso / 3dgraph / c / chap2_9.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-19  |  5.1 KB  |  204 lines

  1. // chap2_9.cpp;
  2.  
  3. #include <iostream.h>
  4. #include <graphics.h>
  5. #include <math.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <conio.h>
  9. #include <dos.h>
  10.  
  11. #define PI 3.141592654
  12.  
  13.  
  14. const xoffset=640/2;
  15. const yoffset=480/2;
  16. const xscale=1;
  17. const yscale=-1;
  18. const persp=500;
  19.  
  20. struct point
  21. {
  22.     float xw, yw, zw;
  23.     int   xs, ys, zs;
  24. }   vertex[18];
  25.  
  26. typedef float  matrix_4x4[4][4];
  27. int    edges[27][27];
  28. FILE   *fp;
  29. int    c;
  30. char   ch;
  31. matrix_4x4   w2v, temp, temp2, temp3;
  32.  
  33. void initialise_graphics()
  34. {
  35.      int gdriver=DETECT, gmode, errorcode;
  36.  
  37.      initgraph(&gdriver, &gmode,"");
  38.      errorcode=graphresult();
  39.      if (errorcode!=grOk)
  40.      {
  41.       printf("Graphics Error: %s\n",grapherrormsg(errorcode));
  42.       printf("Program Aborted \n");
  43.       exit(1);
  44.      }
  45.      setlinestyle(0,0,3);
  46.      setcolor(WHITE);
  47.  
  48. }
  49.  
  50. void translate(float x, float y, float z, matrix_4x4 m)
  51. {
  52.      m[0][0]=1; m[1][0]=0; m[2][0]=0; m[3][0]=0;
  53.      m[0][1]=0; m[1][1]=1; m[2][1]=0; m[3][1]=0;
  54.      m[0][2]=0; m[1][2]=0; m[2][2]=1; m[3][2]=0;
  55.      m[0][3]=x; m[1][3]=y; m[2][3]=z; m[3][3]=1;
  56. };
  57.  
  58. void rotate_x(float t, matrix_4x4 m)
  59. {
  60.      m[0][0]=1; m[1][0]=0;       m[2][0]=0;      m[3][0]=0;
  61.      m[0][1]=0; m[1][1]=cos(t);  m[2][1]=sin(t); m[3][1]=0;
  62.      m[0][2]=0; m[1][2]=-sin(t); m[2][2]=cos(t); m[3][2]=0;
  63.      m[0][3]=0; m[1][3]=0;       m[2][3]=0;      m[3][3]=1;
  64. };
  65.  
  66.  
  67. void rotate_y(float t, matrix_4x4 m)
  68. {
  69.      m[0][0]=cos(t); m[1][0]=0; m[2][0]=-sin(t); m[3][0]=0;
  70.      m[0][1]=0;      m[1][1]=1; m[2][1]=0;       m[3][1]=0;
  71.      m[0][2]=sin(t); m[1][2]=0; m[2][2]=cos(t);  m[3][2]=0;
  72.      m[0][3]=0;      m[1][3]=0; m[2][3]=0;       m[3][3]=1;
  73. };
  74.  
  75. void rotate_z(float t, matrix_4x4 m)
  76. {
  77.      m[0][0]=cos(t);  m[1][0]=sin(t); m[2][0]=0; m[3][0]=0;
  78.      m[0][1]=-sin(t); m[1][1]=cos(t); m[2][1]=0; m[3][1]=0;
  79.      m[0][2]=0;       m[1][2]=0;      m[2][2]=1; m[3][2]=0;
  80.      m[0][3]=0;       m[1][3]=0;      m[2][3]=0; m[3][3]=1;
  81. };
  82.  
  83. void copy_4x4(matrix_4x4 in, matrix_4x4 out)
  84. {
  85.       int c, r;
  86.       for (r=0; r<4; r++)
  87.       for (c=0; c<4; c++)
  88.           out[r][c]=in[r][c];
  89. }
  90.  
  91. void mult_4x4(matrix_4x4 a, matrix_4x4 b, matrix_4x4 m)
  92. {
  93.       int c;
  94.       for (c=0; c<4; c++)
  95.       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];
  96.       for (c=0; c<4; c++)
  97.       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];
  98.       for (c=0; c<4; c++)
  99.       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];
  100.       for (c=0; c<4; c++)
  101.       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];
  102. };
  103.  
  104.  
  105. void draw_picture()
  106. {
  107.      int c;
  108.      cleardevice();
  109.      for (c=0; c<27; c++)
  110.       line(vertex[edges[c][0]].xs,vertex[edges[c][0]].ys,vertex[edges[c][1]].xs,vertex[edges[c][1]].ys);
  111. };
  112.  
  113. void transform(matrix_4x4 m)
  114. {
  115.      int c;
  116.      for (c=0; c<18; c++)
  117.      {
  118.      vertex[c].zs=(vertex[c].xw*m[2][0]+vertex[c].yw*m[2][1]+vertex[c].zw*m[2][2]+m[2][3]);
  119.      vertex[c].xs=(((vertex[c].xw*m[0][0]+vertex[c].yw*m[0][1]+vertex[c].zw*m[0][2]+m[0][3])
  120.                *(persp/float(vertex[c].zs))*xscale)+xoffset);
  121.      vertex[c].ys=(((vertex[c].xw*m[1][0]+vertex[c].yw*m[1][1]+vertex[c].zw*m[1][2]+m[1][3])
  122.                *(persp/float(vertex[c].zs))*yscale)+yoffset);
  123.      };
  124. };
  125.  
  126. void transform_object(matrix_4x4 m)
  127. {
  128.      int c;
  129.      float xt,yt,zt;
  130.      for (c=0; c<18; c++)
  131.      {
  132.      zt=(vertex[c].xw*m[2][0]+vertex[c].yw*m[2][1]+vertex[c].zw*m[2][2]+m[2][3]);
  133.      xt=(vertex[c].xw*m[0][0]+vertex[c].yw*m[0][1]+vertex[c].zw*m[0][2]+m[0][3]);
  134.      yt=(vertex[c].xw*m[1][0]+vertex[c].yw*m[1][1]+vertex[c].zw*m[1][2]+m[1][3]);
  135.      vertex[c].xw=xt;
  136.      vertex[c].yw=yt;
  137.      vertex[c].zw=zt;
  138.      };
  139. };
  140.  
  141. void main()
  142. {
  143.      clrscr();
  144.      printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n");
  145.      printf("This is from Chapter 2 Step 9 of the Virtual Reality Homebrewer\'s Handbook \n");
  146.      printf("and shows a rotating virtual shape drawn in wireframe. \n");
  147.      printf("\n");
  148.      printf("\n");
  149.      printf("                Press any key to continue\n");
  150.      ch=getch();
  151.  
  152. //   Read in vertex data
  153.      if ((fp=fopen("points.dat","r"))==NULL)
  154.      {
  155.       puts("Can't open points.dat");
  156.       exit(0);
  157.      }
  158.      for (c=0; c<18; c++)
  159.      {
  160.       fscanf(fp,"%f %f %f \n",&vertex[c].xw,&vertex[c].yw,&vertex[c].zw);
  161.      }
  162.      fclose(fp);
  163. //   Move to z=500
  164.      for (c=0; c<18; c++)
  165.       vertex[c].zw=vertex[c].zw+500;
  166.  
  167. //   Read in edge data
  168.      if ((fp=fopen("edges.dat","r"))==NULL)
  169.      {
  170.       puts("Can't open edges.dat");
  171.       exit(0);
  172.      }
  173.      for (c=0; c<27; c++)
  174.       fscanf(fp,"%d %d \n",&edges[c][0],&edges[c][1]);
  175.      fclose(fp);
  176.      for (c=0; c<27; c++)
  177.      {
  178.       edges[c][0]--; edges[c][1]--;
  179.      }
  180.  
  181.      initialise_graphics();
  182.  
  183.      translate(0,0,0,w2v);
  184.      transform(w2v);
  185.      draw_picture();
  186.  
  187.      translate(-100,-100,-650,temp);
  188.      rotate_y(0.087266,temp3);
  189.      mult_4x4(temp,temp3,temp2);
  190.      translate(100,100,650,temp);
  191.      mult_4x4(temp2,temp,temp3);
  192.  
  193.      c=0;
  194.      do
  195.      {
  196.      transform_object(temp3);
  197.      transform(w2v);
  198.      draw_picture();
  199.      delay(50);
  200.      c++;
  201.      }
  202.      while (c<500);
  203.      closegraph();
  204. }