home *** CD-ROM | disk | FTP | other *** search
/ Cutting-Edge 3D Game Programming with C++ / CE3DC++.ISO / BOOK / CHAP03 / 3DSTARF.CPP < prev    next >
C/C++ Source or Header  |  1995-10-20  |  5KB  |  138 lines

  1. //
  2. // File Name: 3DstarF.cpp
  3. //
  4. // Description: Implementation of a 3D matrix class - 
  5. //             starfield specific
  6. //
  7. // Author: John De Goes
  8. //
  9. // Project: Cutting Edge 3D Game Programming
  10. //
  11.  
  12. #include "StarF.hpp"
  13.  
  14. // Function that merges to matrices - try to avoid calling 
  15. // this function very often.
  16. void Matrix3D::MergeMatrix(float NewMatrix[4][4])
  17.    {
  18.    // Multiply NewMatirx by Matrix; store result in TempMatrix
  19.    float TempMatrix[4][4];
  20.     for (short unsigned int i = 0; i < 4; i++)
  21.          for (short unsigned int j = 0; j < 4; j++) 
  22.               TempMatrix[i][j] = (Matrix[i][0] * NewMatrix[0][j])
  23.                             + (Matrix[i][1] * NewMatrix[1][j])
  24.                             + (Matrix[i][2] * NewMatrix[2][j])
  25.                             + (Matrix[i][3] * NewMatrix[3][j]);
  26.    // Copy TempMatrix to Matrix
  27.     for (i = 0; i < 4; i++)
  28.        {
  29.        Matrix[i][0] = TempMatrix[i][0];
  30.        Matrix[i][1] = TempMatrix[i][1];
  31.        Matrix[i][2] = TempMatrix[i][2];
  32.        Matrix[i][3] = TempMatrix[i][3];
  33.        }
  34.    }
  35.    
  36. void Matrix3D::Rotate(int Xa, int Ya, int Za)
  37.    {
  38.    float Rmat[4][4];
  39.      // Initialize Z rotation matrix (aligning 3D world with 2D screen):
  40.    Rmat[0][0]=COS(Za);  Rmat[0][1]=SIN(Za);  Rmat[0][2]=0;    Rmat[0][3]=0;
  41.    Rmat[1][0]=-SIN(Za); Rmat[1][1]=COS(Za);  Rmat[1][2]=0;    Rmat[1][3]=0;
  42.    Rmat[2][0]=0;        Rmat[2][1]=0;        Rmat[2][2]=1;    Rmat[2][3]=0;
  43.    Rmat[3][0]=0;        Rmat[3][1]=0;        Rmat[3][2]=0;    Rmat[3][3]=1;
  44.  
  45.    // Merge matrix with master matrix:
  46.    MergeMatrix(Rmat);
  47.  
  48.    // Initialize X rotation matrix:
  49.    Rmat[0][0]=1; Rmat[0][1]=0;        Rmat[0][2]=0;       Rmat[0][3]=0;
  50.    Rmat[1][0]=0; Rmat[1][1]=COS(Xa);  Rmat[1][2]=SIN(Xa); Rmat[1][3]=0;
  51.    Rmat[2][0]=0; Rmat[2][1]=-SIN(Xa); Rmat[2][2]=COS(Xa); Rmat[2][3]=0;
  52.    Rmat[3][0]=0; Rmat[3][1]=0;        Rmat[3][2]=0;       Rmat[3][3]=1;
  53.  
  54.    // Merge matrix with master matrix:
  55.     MergeMatrix(Rmat);
  56.  
  57.     // Initialize Y rotation matrix:
  58.    Rmat[0][0]=COS(Ya); Rmat[0][1]=0; Rmat[0][2]=-SIN(Ya); Rmat[0][3]=0;
  59.    Rmat[1][0]=0;       Rmat[1][1]=1; Rmat[1][2]=0;        Rmat[1][3]=0;
  60.    Rmat[2][0]=SIN(Ya); Rmat[2][1]=0; Rmat[2][2]=COS(Ya);  Rmat[2][3]=0;
  61.    Rmat[3][0]=0;       Rmat[3][1]=0; Rmat[3][2]=0;        Rmat[3][3]=1;
  62.  
  63.    // Merge matrix with master matrix:
  64.    MergeMatrix(Rmat);
  65.    }
  66.    
  67. void Matrix3D::Translate(float Xt, float Yt, float Zt)
  68.    {
  69.    float Tmat[4][4];
  70.    // Initialize translation matrix:
  71.    Tmat[0][0]=1;  Tmat[0][1]=0;  Tmat[0][2]=0;  Tmat[0][3]=0;
  72.     Tmat[1][0]=0;  Tmat[1][1]=1;  Tmat[1][2]=0;  Tmat[1][3]=0;
  73.     Tmat[2][0]=0;  Tmat[2][1]=0;  Tmat[2][2]=1;  Tmat[2][3]=0;
  74.     Tmat[3][0]=Xt; Tmat[3][1]=Yt; Tmat[3][2]=Zt; Tmat[3][3]=1;
  75.  
  76.    // Merge matrix with master matrix:
  77.    MergeMatrix(Tmat);
  78.    }
  79.    
  80. void Matrix3D::Scale(float Xs, float Ys, float Zs)
  81.    {
  82.    float Smat[4][4];
  83.    // Initialize scaling matrix:
  84.    Smat[0][0] = Xs; Smat[0][1] = 0;  Smat[0][2] = 0;  Smat[0][3] = 0;
  85.     Smat[1][0] = 0;  Smat[1][1] = Ys; Smat[1][2] = 0;  Smat[1][3] = 0;
  86.     Smat[2][0] = 0;  Smat[2][1] = 0;  Smat[2][2] = Zs; Smat[2][3] = 0;
  87.     Smat[3][0] = 0;  Smat[3][1] = 0;  Smat[3][2] = 0;  Smat[3][3] = 1;
  88.  
  89.    // Merge matrix with master matrix:
  90.    MergeMatrix(Smat);
  91.    }
  92.    
  93. void Matrix3D::Shear(float Xs, float Ys)
  94.    {
  95.    float Smat[4][4];
  96.    // Initialize shearing matrix:
  97.    Smat[0][0] = 1;  Smat[0][1] = 0;  Smat[0][2] = Xs;  Smat[0][3] = 0;
  98.     Smat[1][0] = 0;  Smat[1][1] = 1;  Smat[1][2] = Ys;  Smat[1][3] = 0;
  99.     Smat[2][0] = 0;  Smat[2][1] = 0;  Smat[2][2] = 1;   Smat[2][3] = 0;
  100.     Smat[3][0] = 0;  Smat[3][1] = 0;  Smat[3][2] = 0;   Smat[3][3] = 1;
  101.  
  102.    // Merge matrix with master matrix:
  103.    MergeMatrix(Smat);
  104.    }
  105.    
  106. void Matrix3D::Initialize()
  107.    {
  108.    Matrix[0][0] = 1;  Matrix[0][1] = 0;  Matrix[0][2] = 0;  Matrix[0][3] = 0;
  109.     Matrix[1][0] = 0;  Matrix[1][1] = 1;  Matrix[1][2] = 0;  Matrix[1][3] = 0;
  110.     Matrix[2][0] = 0;  Matrix[2][1] = 0;  Matrix[2][2] = 1;  Matrix[2][3] = 0;
  111.     Matrix[3][0] = 0;  Matrix[3][1] = 0;  Matrix[3][2] = 0;  Matrix[3][3] = 1;
  112.    }
  113.    
  114. Vertex &Matrix3D::Transform(Vertex &V)
  115.    {
  116.    // Initialize temporary variables:
  117.    float OldX = V.Wx;
  118.     float OldY = V.Wy;
  119.     float OldZ = V.Wz;
  120.  
  121.    // Transform vertex using master matrix (vector*matrix):
  122.     V.Wx = OldX * Matrix[0][0] +
  123.              OldY * Matrix[1][0] +
  124.              OldZ * Matrix[2][0] +
  125.              Matrix[3][0];
  126.  
  127.     V.Wy = OldX * Matrix[0][1] +
  128.              OldY * Matrix[1][1] +
  129.              OldZ * Matrix[2][1] +
  130.              Matrix[3][1];
  131.  
  132.    V.Wz = OldX * Matrix[0][2] +
  133.              OldY * Matrix[1][2] +
  134.              OldZ * Matrix[2][2] +
  135.              Matrix[3][2];
  136.    return V;
  137.    }
  138.