home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cutting-Edge 3D Game Programming with C++
/
CE3DC++.ISO
/
BOOK
/
CHAP03
/
3DSTARF.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-20
|
5KB
|
138 lines
//
// File Name: 3DstarF.cpp
//
// Description: Implementation of a 3D matrix class -
// starfield specific
//
// Author: John De Goes
//
// Project: Cutting Edge 3D Game Programming
//
#include "StarF.hpp"
// Function that merges to matrices - try to avoid calling
// this function very often.
void Matrix3D::MergeMatrix(float NewMatrix[4][4])
{
// Multiply NewMatirx by Matrix; store result in TempMatrix
float TempMatrix[4][4];
for (short unsigned int i = 0; i < 4; i++)
for (short unsigned int j = 0; j < 4; j++)
TempMatrix[i][j] = (Matrix[i][0] * NewMatrix[0][j])
+ (Matrix[i][1] * NewMatrix[1][j])
+ (Matrix[i][2] * NewMatrix[2][j])
+ (Matrix[i][3] * NewMatrix[3][j]);
// Copy TempMatrix to Matrix
for (i = 0; i < 4; i++)
{
Matrix[i][0] = TempMatrix[i][0];
Matrix[i][1] = TempMatrix[i][1];
Matrix[i][2] = TempMatrix[i][2];
Matrix[i][3] = TempMatrix[i][3];
}
}
void Matrix3D::Rotate(int Xa, int Ya, int Za)
{
float Rmat[4][4];
// Initialize Z rotation matrix (aligning 3D world with 2D screen):
Rmat[0][0]=COS(Za); Rmat[0][1]=SIN(Za); Rmat[0][2]=0; Rmat[0][3]=0;
Rmat[1][0]=-SIN(Za); Rmat[1][1]=COS(Za); Rmat[1][2]=0; Rmat[1][3]=0;
Rmat[2][0]=0; Rmat[2][1]=0; Rmat[2][2]=1; Rmat[2][3]=0;
Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
// Merge matrix with master matrix:
MergeMatrix(Rmat);
// Initialize X rotation matrix:
Rmat[0][0]=1; Rmat[0][1]=0; Rmat[0][2]=0; Rmat[0][3]=0;
Rmat[1][0]=0; Rmat[1][1]=COS(Xa); Rmat[1][2]=SIN(Xa); Rmat[1][3]=0;
Rmat[2][0]=0; Rmat[2][1]=-SIN(Xa); Rmat[2][2]=COS(Xa); Rmat[2][3]=0;
Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
// Merge matrix with master matrix:
MergeMatrix(Rmat);
// Initialize Y rotation matrix:
Rmat[0][0]=COS(Ya); Rmat[0][1]=0; Rmat[0][2]=-SIN(Ya); Rmat[0][3]=0;
Rmat[1][0]=0; Rmat[1][1]=1; Rmat[1][2]=0; Rmat[1][3]=0;
Rmat[2][0]=SIN(Ya); Rmat[2][1]=0; Rmat[2][2]=COS(Ya); Rmat[2][3]=0;
Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
// Merge matrix with master matrix:
MergeMatrix(Rmat);
}
void Matrix3D::Translate(float Xt, float Yt, float Zt)
{
float Tmat[4][4];
// Initialize translation matrix:
Tmat[0][0]=1; Tmat[0][1]=0; Tmat[0][2]=0; Tmat[0][3]=0;
Tmat[1][0]=0; Tmat[1][1]=1; Tmat[1][2]=0; Tmat[1][3]=0;
Tmat[2][0]=0; Tmat[2][1]=0; Tmat[2][2]=1; Tmat[2][3]=0;
Tmat[3][0]=Xt; Tmat[3][1]=Yt; Tmat[3][2]=Zt; Tmat[3][3]=1;
// Merge matrix with master matrix:
MergeMatrix(Tmat);
}
void Matrix3D::Scale(float Xs, float Ys, float Zs)
{
float Smat[4][4];
// Initialize scaling matrix:
Smat[0][0] = Xs; Smat[0][1] = 0; Smat[0][2] = 0; Smat[0][3] = 0;
Smat[1][0] = 0; Smat[1][1] = Ys; Smat[1][2] = 0; Smat[1][3] = 0;
Smat[2][0] = 0; Smat[2][1] = 0; Smat[2][2] = Zs; Smat[2][3] = 0;
Smat[3][0] = 0; Smat[3][1] = 0; Smat[3][2] = 0; Smat[3][3] = 1;
// Merge matrix with master matrix:
MergeMatrix(Smat);
}
void Matrix3D::Shear(float Xs, float Ys)
{
float Smat[4][4];
// Initialize shearing matrix:
Smat[0][0] = 1; Smat[0][1] = 0; Smat[0][2] = Xs; Smat[0][3] = 0;
Smat[1][0] = 0; Smat[1][1] = 1; Smat[1][2] = Ys; Smat[1][3] = 0;
Smat[2][0] = 0; Smat[2][1] = 0; Smat[2][2] = 1; Smat[2][3] = 0;
Smat[3][0] = 0; Smat[3][1] = 0; Smat[3][2] = 0; Smat[3][3] = 1;
// Merge matrix with master matrix:
MergeMatrix(Smat);
}
void Matrix3D::Initialize()
{
Matrix[0][0] = 1; Matrix[0][1] = 0; Matrix[0][2] = 0; Matrix[0][3] = 0;
Matrix[1][0] = 0; Matrix[1][1] = 1; Matrix[1][2] = 0; Matrix[1][3] = 0;
Matrix[2][0] = 0; Matrix[2][1] = 0; Matrix[2][2] = 1; Matrix[2][3] = 0;
Matrix[3][0] = 0; Matrix[3][1] = 0; Matrix[3][2] = 0; Matrix[3][3] = 1;
}
Vertex &Matrix3D::Transform(Vertex &V)
{
// Initialize temporary variables:
float OldX = V.Wx;
float OldY = V.Wy;
float OldZ = V.Wz;
// Transform vertex using master matrix (vector*matrix):
V.Wx = OldX * Matrix[0][0] +
OldY * Matrix[1][0] +
OldZ * Matrix[2][0] +
Matrix[3][0];
V.Wy = OldX * Matrix[0][1] +
OldY * Matrix[1][1] +
OldZ * Matrix[2][1] +
Matrix[3][1];
V.Wz = OldX * Matrix[0][2] +
OldY * Matrix[1][2] +
OldZ * Matrix[2][2] +
Matrix[3][2];
return V;
}