![]()
|
![]() |
local coordinate system. |
lx,ly,lz, wx,wy,wz, ax,ay,az, sx,sy,sz, |
lt; wt; at; st; |
lx,ly,lz,lt; |
![]() |
a camera. |
|
class Matrix3d
{ public:
double Matrix[4][4];
Matrix3d();
void MatrixReset();
void MatrixIdentity();
void MatrixCopy(Matrix3d &M);
void MatrixMult(Matrix3d &M1,Matrix3d &M2);
}; |
Matrix3d::Matrix3d()
{ MatrixIdentity();
}
void Matrix3d::MatrixReset()
{ for(int i=0;i<4;i++)
{ for(int j=0;j<4;j++)
{Matrix[i][j]=0;
}
}
} |
![]() |
![]() |
void Matrix3d::MatrixIdentity()
{ MatrixReset();
Matrix[0][0]=Matrix[1][1]=
Matrix[2][2]=Matrix[3][3]=1;
} |
void Matrix3d::MatrixCopy(Matrix3d &NewM)
{ Matrix3d temp;
int i,j;
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
{temp.Matrix[i][j]=(Matrix[i][0]*NewM.Matrix[0][j])+(Matrix[i][1]*NewM.Matrix[1][j])
(Matrix[i][2]*NewM.Matrix[2][j])+(Matrix[i][3]*NewM.Matrix[3][j]);
}
}
for(i=0;i<4;i++)
{Matrix[i][0]=temp.Matrix[i][0];
Matrix[i][1]=temp.Matrix[i][1];
Matrix[i][2]=temp.Matrix[i][2];
Matrix[i][3]=temp.Matrix[i][3];
}
} |
I'll explain this function in the usual style. Remember first that we are dealing with 4x4 matrices instead of the 2x2 in our above example. We are simply making a routine to do the multiplication for us instead of writing it all out. The matrix A in this example is the member of this class or this->Matrix if you don't get it, the B in this example would be the one passed as a parameter to our function or NewM.Matrix. We first create a temp 4x4 matrix, wittingly named temp that we set everything into so we don't screw our operations up. The second for loop simply copies temp into the member matrix named Matrix. The pretty little animation is another way of looking at this function, but if it screws you up, just look at the Matrix Multiplication example instead. See that this function was named MatrixCopy. It really multiplies the member matrix by a new matrix, and storing the result back into the member matrix.
void Matrix3d::MatrixMult(Matrix3d &M1,Matrix3d &M2)
{ Matrix3d temp;
int i,j;
for (i=0;i<4;i++)
{ for(j=0;j<4;j++)
{temp.Matrix[i][j]=
(M2.Matrix[i][0]*M1.Matrix[0][j])+(M2.Matrix[i][1]*M1.Matrix[1][j])+
(M2.Matrix[i][2]*M1.Matrix[2][j])+(M2.Matrix[i][3]*M1.Matrix[3][j]);
}
}
for(i=0;i<4;i++)
{M1.Matrix[i][0]=temp.Matrix[i][0];
M1.Matrix[i][1]=temp.Matrix[i][1];
M1.Matrix[i][2]=temp.Matrix[i][2];
M1.Matrix[i][3]=temp.Matrix[i][3];
}
} |
class Th3dtran
{ public:
Th3dtran();
~Th3dtran();
void Init();
void Translate(float,float,float);
void Rotate(float,float,float);
void Scale(float);
Point3d ChangeLocalObject(Point3d &p);
Point3d ChangeObjectPoint(Point3d &p);
Matrix3d matrix,Rmat,rmatrix,objectmatrix;
char Local;
}; |
Th3dtran::Th3dtran()
{ Init();
Local=1;
}
Th3dtran::~Th3dtran()
{
}
void Th3dtran::Init()
{ matrix.MatrixIdentity();
objectmatrix.MatrixIdentity();
} |
void Th3dtran::Translate(float x,float y,float z)
{ Rmat.MatrixIdentity();
Rmat.Matrix[3][0]=x;
Rmat.Matrix[3][1]=y;
Rmat.Matrix[3][2]=z;
if(Local)
{ objectmatrix.MatrixCopy(Rmat);
}
else
{ matrix.MatrixCopy(Rmat);
}
} |
void Th3dtran::Rotate(float x,float y,float z)
{ rmatrix.MatrixIdentity();
Rmat.MatrixIdentity();
Rmat.Matrix[1][1]=cos(x); Rmat.Matrix[1][2]=sin(x);
Rmat.Matrix[2][1]=-(sin(x)); Rmat.Matrix[2][2]=cos(x);
rmatrix.MatrixMult(rmatrix,Rmat);
Rmat.MatrixIdentity();
Rmat.Matrix[0][0]=cos(y);Rmat.Matrix[0][2]=-(sin(y));
Rmat.Matrix[2][0]=sin(y);Rmat.Matrix[2][2]=cos(y);
Rmat.MatrixMult(rmatrix,Rmat);
Rmat.MatrixIdentity();
Rmat.Matrix[0][0]=cos(z); Rmat.Matrix[0][1]=sin(z);
Rmat.Matrix[1][0]=-(sin(z)); Rmat.Matrix[1][1]=cos(z);
Rmat.MatrixMult(rmatrix,Rmat);
if(Local)
{objectmatrix.MatrixIdentity();
objectmatrix.MatrixCopy(rmatrix);
}
else
{matrix.MatrixCopy(rmatrix);
}
} |
void Th3dtran::Scale(float scale)
{
Rmat.MatrixIdentity();
Rmat.Matrix[0][0]=scale;
Rmat.Matrix[1][1]=scale;
Rmat.Matrix[2][2]=scale;
if(Local)
{ objectmatrix.MatrixCopy(Rmat);
}
else
{matrix.MatrixCopy(Rmat);
}
} |
Point3d Th3dtran::ChangeLocalObject(Point3d &p)
{ p.wx=(long)(p.ax*matrix.Matrix[0][0]+p.ay*matrix.Matrix[1][0]+
p.az*matrix.Matrix[2][0]+matrix.Matrix[3][0]);
p.wy=(long)(p.ax*matrix.Matrix[0][1]+p.ay*matrix.Matrix[1][1]+
p.az*matrix.Matrix[2][1]+matrix.Matrix[3][1]);
p.wz=(long)(p.ax*matrix.Matrix[0][2]+p.ay*matrix.Matrix[1][2]+
p.az*matrix.Matrix[2][2]+matrix.Matrix[3][2]);
return p;
}
Point3d Th3dtran::ChangeObjectPoint(Point3d &p)
{p.ax=(long)(p.lx*objectmatrix.Matrix[0][0]+p.ly*objectmatrix.Matrix[1][0]+(long)
p.lz*objectmatrix.Matrix[2][0]+objectmatrix.Matrix[3][0]);
p.ay=(long)(p.lx*objectmatrix.Matrix[0][1]+p.ly*objectmatrix.Matrix[1][1]+(long)
p.lz*objectmatrix.Matrix[2][1]+objectmatrix.Matrix[3][1]);
p.az=(long)(p.lx*objectmatrix.Matrix[0][2]+p.ly*objectmatrix.Matrix[1][2]+(long)
p.lz*objectmatrix.Matrix[2][2]+objectmatrix.Matrix[3][2]);
return p;
} |