local coordinate system. 
lx,ly,lz, wx,wy,wz, ax,ay,az, sx,sy,sz, 
lt; wt; at; st; 
lx,ly,lz,lt; 
wx,wy,wz,wt; ax,ay,az,at; sx,sy,sz,st; 
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]; } } 
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; } 