home *** CD-ROM | disk | FTP | other *** search
/ Cutting-Edge 3D Game Programming with C++ / CE3DC++.ISO / BOOK / CHAP08 / MATRIX3D.CPP < prev    next >
C/C++ Source or Header  |  1995-12-04  |  8KB  |  217 lines

  1. //
  2. // File name: Matrix3D.CPP
  3. //
  4. // Description: The CPP file for the Matrix3D.HPP header file
  5. //
  6. // Author: John De Goes
  7. //
  8. // Project: Cutting Edge 3D Game Programming
  9. //
  10.  
  11. #include "Matrix3D.HPP"
  12.  
  13. // Function designed to set matrix to identity matrix:
  14. void Matrix3D::Initialize ()
  15.    {
  16.    Matrix[0][0] = 1;  Matrix[0][1] = 0;  Matrix[0][2] = 0;  Matrix[0][3] = 0;
  17.    Matrix[1][0] = 0;  Matrix[1][1] = 1;  Matrix[1][2] = 0;  Matrix[1][3] = 0;
  18.    Matrix[2][0] = 0;  Matrix[2][1] = 0;  Matrix[2][2] = 1;  Matrix[2][3] = 0;
  19.    Matrix[3][0] = 0;  Matrix[3][1] = 0;  Matrix[3][2] = 0;  Matrix[3][3] = 1;
  20.    }
  21.  
  22. void Matrix3D::InitMat ( double Mat [ 4 ] [ 4 ] )
  23.    {
  24.    // Initializes a specific matrix to the identity matrix:
  25.    Mat [0][0] = 1;  Mat [0][1] = 0;  Mat [0][2] = 0;  Mat [0][3] = 0;
  26.    Mat [1][0] = 0;  Mat [1][1] = 1;  Mat [1][2] = 0;  Mat [1][3] = 0;
  27.    Mat [2][0] = 0;  Mat [2][1] = 0;  Mat [2][2] = 1;  Mat [2][3] = 0;
  28.    Mat [3][0] = 0;  Mat [3][1] = 0;  Mat [3][2] = 0;  Mat [3][3] = 1;
  29.    }
  30.    
  31. void Matrix3D::MergeMatrix ( double NewMatrix [ 4 ] [ 4 ] )
  32.    {
  33.    // Multiply NewMatirx by Matrix; store result in TempMatrix
  34.    double TempMatrix [ 4 ] [ 4 ];
  35.     for (short unsigned int i = 0; i < 4; i++)
  36.          for (short unsigned int j = 0; j < 4; j++) 
  37.               TempMatrix[i][j] = (Matrix[i][0] * NewMatrix[0][j])
  38.                             + (Matrix[i][1] * NewMatrix[1][j])
  39.                             + (Matrix[i][2] * NewMatrix[2][j])
  40.                             + (Matrix[i][3] * NewMatrix[3][j]);
  41.    // Copy TempMatrix to Matrix:
  42.    for (i = 0; i < 4; i++)
  43.        {
  44.        Matrix[i][0] = TempMatrix[i][0];
  45.        Matrix[i][1] = TempMatrix[i][1];
  46.        Matrix[i][2] = TempMatrix[i][2];
  47.        Matrix[i][3] = TempMatrix[i][3];
  48.        }
  49.    }
  50.  
  51. void Matrix3D::MergeMatrices ( double Dest [ 4 ] [ 4 ], double Source [ 4 ] [ 4 ] )
  52.    {
  53.    // Multiply Source by Dest; store result in Temp:
  54.    double Temp [ 4 ] [ 4 ];
  55.     for ( short unsigned int i = 0; i < 4; i++ )
  56.          for ( short unsigned int j = 0; j < 4; j++ )
  57.            {
  58.               Temp [ i ] [ j ] = ( Source [ i ] [ 0 ] * Dest [ 0 ] [ j ] )
  59.                             + ( Source [ i ] [ 1 ] * Dest [ 1 ] [ j ] )
  60.                             + ( Source [ i ] [ 2 ] * Dest [ 2 ] [ j ] )
  61.                             + ( Source [ i ] [ 3 ] * Dest [ 3 ] [ j ] );
  62.            }
  63.    // Copy Temp to Dest:
  64.    for (i = 0; i < 4; i++)
  65.        {
  66.        Dest [ i ] [ 0 ] = Temp [ i ] [ 0 ];
  67.        Dest [ i ] [ 1 ] = Temp [ i ] [ 1 ];
  68.        Dest [ i ] [ 2 ] = Temp [ i ] [ 2 ];
  69.        Dest [ i ] [ 3 ] = Temp [ i ] [ 3 ];
  70.        }
  71.    }
  72.    
  73. void  Matrix3D::Rotate ( int Xa, int Ya, int Za )
  74.    {
  75.    // Generate 3D rotation matrix:
  76.    Xr = Xa; Yr = Ya; Zr = Za;
  77.    double Rmat [ 4 ] [ 4 ];
  78.    InitMat ( RMatrix );
  79.  
  80.    // Initialize Z rotation matrix - Note: we perform Z
  81.    // rotation first to align the 3D Z axis with the 2D Z axis.
  82.    Rmat[0][0]=COS(Za);  Rmat[0][1]=SIN(Za);  Rmat[0][2]=0;    Rmat[0][3]=0;
  83.    Rmat[1][0]=-SIN(Za); Rmat[1][1]=COS(Za);  Rmat[1][2]=0;    Rmat[1][3]=0;
  84.    Rmat[2][0]=0;        Rmat[2][1]=0;        Rmat[2][2]=1;    Rmat[2][3]=0;
  85.    Rmat[3][0]=0;        Rmat[3][1]=0;        Rmat[3][2]=0;    Rmat[3][3]=1;
  86.  
  87.    // Merge matrix with master matrix:
  88.    MergeMatrices ( RMatrix, Rmat );
  89.    
  90.    // Initialize X rotation matrix:
  91.    Rmat[0][0]=1;  Rmat[0][1]=0;        Rmat[0][2]=0;       Rmat[0][3]=0;
  92.    Rmat[1][0]=0;  Rmat[1][1]=COS(Xa);  Rmat[1][2]=SIN(Xa); Rmat[1][3]=0;
  93.    Rmat[2][0]=0;  Rmat[2][1]=-SIN(Xa); Rmat[2][2]=COS(Xa); Rmat[2][3]=0;
  94.    Rmat[3][0]=0;  Rmat[3][1]=0;        Rmat[3][2]=0;       Rmat[3][3]=1;
  95.  
  96.    // Merge matrix with master matrix:
  97.    MergeMatrices ( RMatrix, Rmat );
  98.  
  99.    // Initialize Y rotation matrix:
  100.    Rmat[0][0]=COS(Ya); Rmat[0][1]=0;   Rmat[0][2]=-SIN(Ya); Rmat[0][3]=0;
  101.    Rmat[1][0]=0;       Rmat[1][1]=1;   Rmat[1][2]=0;        Rmat[1][3]=0;
  102.    Rmat[2][0]=SIN(Ya); Rmat[2][1]=0;   Rmat[2][2]=COS(Ya);  Rmat[2][3]=0;
  103.    Rmat[3][0]=0;       Rmat[3][1]=0;   Rmat[3][2]=0;        Rmat[3][3]=1;
  104.  
  105.    // Merge matrix with master matrix:
  106.    MergeMatrices ( RMatrix, Rmat );
  107.  
  108.    MergeMatrix ( RMatrix );
  109.    }
  110.    
  111. void Matrix3D::Translate ( double Xt, double Yt, double Zt )
  112.    {
  113.    // Create 3D translation matrix:
  114.  
  115.    // Declare translation matrix:
  116.    double Tmat [ 4 ] [ 4 ];
  117.    
  118.    // Save translation values:
  119.    XTrans = Xt; YTrans = Yt; ZTrans = Zt;
  120.    
  121.    // Initialize translation matrix:
  122.    Tmat[0][0]=1;  Tmat[0][1]=0;  Tmat[0][2]=0;  Tmat[0][3]=0;
  123.    Tmat[1][0]=0;  Tmat[1][1]=1;  Tmat[1][2]=0;  Tmat[1][3]=0;
  124.    Tmat[2][0]=0;  Tmat[2][1]=0;  Tmat[2][2]=1;  Tmat[2][3]=0;
  125.    Tmat[3][0]=Xt; Tmat[3][1]=Yt; Tmat[3][2]=Zt; Tmat[3][3]=1;
  126.  
  127.    // Merge matrix with master matrix:
  128.    MergeMatrix ( Tmat );
  129.    }
  130.    
  131. // Function designed to merge scaling matrix with master
  132. // matrix:
  133. void  Matrix3D::Scale ( double Xs, double Ys, double Zs )
  134.    {
  135.    // Create 3D scaling matrix:
  136.    double Smat [ 4 ] [ 4 ];
  137.    
  138.    // Initialize scaling matrix:
  139.    Smat[0][0] = Xs; Smat[0][1] = 0;  Smat[0][2] = 0;  Smat[0][3] = 0;
  140.    Smat[1][0] = 0;  Smat[1][1] = Ys; Smat[1][2] = 0;  Smat[1][3] = 0;
  141.    Smat[2][0] = 0;  Smat[2][1] = 0;  Smat[2][2] = Zs; Smat[2][3] = 0;
  142.    Smat[3][0] = 0;  Smat[3][1] = 0;  Smat[3][2] = 0;  Smat[3][3] = 1;
  143.  
  144.    // Merge matrix with master matrix:
  145.    MergeMatrix ( Smat );
  146.    }
  147.  
  148. void  Matrix3D::Shear ( double Xs, double Ys )
  149.    {
  150.    // Create 3D shearing matrix:
  151.  
  152.    double Smat [ 4 ] [ 4 ];
  153.    
  154.    // Initialize shearing matrix:
  155.    Smat[0][0] = 1;  Smat[0][1] = 0;  Smat[0][2] = Xs;  Smat[0][3] = 0;
  156.    Smat[1][0] = 0;  Smat[1][1] = 1;  Smat[1][2] = Ys;  Smat[1][3] = 0;
  157.    Smat[2][0] = 0;  Smat[2][1] = 0;  Smat[2][2] = 1;   Smat[2][3] = 0;
  158.    Smat[3][0] = 0;  Smat[3][1] = 0;  Smat[3][2] = 0;   Smat[3][3] = 1;
  159.  
  160.    // Merge matrix with master matrix:
  161.    MergeMatrix ( Smat );
  162.    }
  163.  
  164. // Function designed to transform a vertex using the master
  165. // matrix:   
  166. Point3D &Matrix3D::Transform ( Point3D &V )
  167.    {
  168.    // Initialize temporary variables:
  169.    double Lx = V.Lx;
  170.    double Ly = V.Ly;
  171.    double Lz = V.Lz;
  172.  
  173.    // Transform vertex by master matrix:
  174.    V.Wx = ( (   Lx * Matrix [ 0 ][ 0 ]) )
  175.           + ( ( Ly * Matrix [ 1 ][ 0 ]) )
  176.           + ( ( Lz * Matrix [ 2 ][ 0 ]) )
  177.           + Matrix [ 3 ][ 0 ];
  178.  
  179.    V.Wy = (   ( Lx * Matrix [ 0 ][ 1 ]) )
  180.           + ( ( Ly * Matrix [ 1 ][ 1 ]) )
  181.           + ( ( Lz * Matrix [ 2 ][ 1 ]) )
  182.           + Matrix [ 3 ][ 1 ];
  183.  
  184.    V.Wz = (   ( Lx * Matrix [ 0 ][ 2 ]) )
  185.           + ( ( Ly * Matrix [ 1 ][ 2 ]) )
  186.           + ( ( Lz * Matrix [ 2 ][ 2 ]) )
  187.           + Matrix [ 3 ][ 2 ];
  188.    return V;
  189.    }
  190.    
  191. // Function designed to transform a vector using the master
  192. // matrix:   
  193. Vector &Matrix3D::Transform ( Vector &V )
  194.    {
  195.    // Initialize temporary variables:
  196.    double OldX = V.X;
  197.    double OldY = V.Y;
  198.    double OldZ = V.Z;
  199.  
  200.    // Transform vertex by master matrix:
  201.    V.Tx = ( ( OldX * Matrix [ 0 ] [ 0 ] ) )
  202.         + ( ( OldY * Matrix [ 1 ] [ 0 ] ) )
  203.         + ( ( OldZ * Matrix [ 2 ] [ 0 ] ) )
  204.         +            Matrix [ 3 ] [ 0 ];
  205.  
  206.    V.Ty = ( ( OldX * Matrix [ 0 ] [ 1 ] ) )
  207.         + ( ( OldY * Matrix [ 1 ] [ 1 ] ) )
  208.         + ( ( OldZ * Matrix [ 2 ] [ 1 ] ) )
  209.         +            Matrix [ 3 ] [ 1 ];
  210.  
  211.    V.Tz = ( ( OldX * Matrix [ 0 ] [ 2 ] ) )
  212.         + ( ( OldY * Matrix [ 1 ] [ 2 ] ) )
  213.         + ( ( OldZ * Matrix [ 2 ] [ 2 ] ) )
  214.         +            Matrix [ 3 ] [ 2 ];
  215.    
  216.    return V;
  217.    }