And here is the code. I am sure you will have a number of questions to ask in order to use this code for your purposes. So I will await your questions.
The following code is all there is to the example if you want to play with it. I don't think I can make it much simpler than this. All aspects can be extended if needed.
Code:
function Vect3(x,y,z){
this.x=x;
this.y=y;
this.z=z;
};
Vect3.prototype.Set=function(x,y,z){
this.x=x;
this.y=y;
this.z=z;
};
function Matrix3x3(){
this.xx=1; this.xy=0; this.xz=0;
this.yx=0; this.yy=1; this.yz=0;
this.zx=0; this.zy=0; this.zz=1;
};
Matrix3x3.prototype.Set=function(a,b,c,d,e,f,g,h,i){
this.xx=a; this.xy=b; this.xz=c;
this.yx=d; this.yy=e; this.yz=f;
this.zx=g; this.zy=h; this.zz=i;
};
Matrix3x3.prototype.SetRotation=function(x,y,z){
var a = Math.cos(x*(Math.PI/180));//x plane
var b = Math.sin(x*(Math.PI/180));
var c = Math.cos(y*(Math.PI/180));//y plane
var d = Math.sin(y*(Math.PI/180));
var e = Math.cos(z*(Math.PI/180));//z plane
var f = Math.sin(z*(Math.PI/180));
this.xx=(c*e); this.xy=(b*d*e+a*f); this.xz=(-a*d*e+b*f);
this.yx=(-c*f); this.yy=(-b*d*f+a*e); this.yz=(a*d*f+b*e);
this.zx=d; this.zy=(-b*c); this.zz=(a*c);
};
function Object3D(){
this.Position=new Vect3(0,0,0);
this.Orientation=new Matrix3x3();
};
Object3D.prototype.AddVertices=function(vertices){
this.vertList=vertices;
};
Object3D.prototype.OutPutObjectSpace=function(){
for(i in this.vertList){
trace(this.vertList[i].x);
}
};
Object3D.prototype.TransformVertices=function(){
//displacement camera to object
var dx=this.Position.x-Camera.Position.x;
var dy=this.Position.y-Camera.Position.y;
var dz=this.Position.z-Camera.Position.z;
//transform object position into camera space using Camera orientation matrix
var x = dx * Camera.Orientation.xx + dy * Camera.Orientation.xy + dz * Camera.Orientation.xz;
var y = dx * Camera.Orientation.yx + dy * Camera.Orientation.yy + dz * Camera.Orientation.yz;
var z = dx * Camera.Orientation.zx + dy * Camera.Orientation.zy + dz * Camera.Orientation.zz;
//multiply object and camera orientation matrices
var mxx = this.Orientation.xx * Camera.Orientation.xx + this.Orientation.xy * Camera.Orientation.xy + this.Orientation.xz * Camera.Orientation.xz;
var mxy = this.Orientation.yx * Camera.Orientation.xx + this.Orientation.yy * Camera.Orientation.xy + this.Orientation.yz * Camera.Orientation.xz;
var mxz = this.Orientation.zx * Camera.Orientation.xx + this.Orientation.zy * Camera.Orientation.xy + this.Orientation.zz * Camera.Orientation.xz;
var myx = this.Orientation.xx * Camera.Orientation.yx + this.Orientation.xy * Camera.Orientation.yy + this.Orientation.xz * Camera.Orientation.yz;
var myy = this.Orientation.yx * Camera.Orientation.yx + this.Orientation.yy * Camera.Orientation.yy + this.Orientation.yz * Camera.Orientation.yz;
var myz = this.Orientation.zx * Camera.Orientation.yx + this.Orientation.zy * Camera.Orientation.yy + this.Orientation.zz * Camera.Orientation.yz;
var mzx = this.Orientation.xx * Camera.Orientation.zx + this.Orientation.xy * Camera.Orientation.zy + this.Orientation.xz * Camera.Orientation.zz;
var mzy = this.Orientation.yx * Camera.Orientation.zx + this.Orientation.yy * Camera.Orientation.zy + this.Orientation.yz * Camera.Orientation.zz;
var mzz = this.Orientation.zx * Camera.Orientation.zx + this.Orientation.zy * Camera.Orientation.zy + this.Orientation.zz * Camera.Orientation.zz;
//transform object vertices from Object Space -> World Space -> Camera Space -> 2D screen cordinates
var p,o;
for(i in this.vertList){
p=this.vertList[i];
o=Camera.focalLength/((p.x * mzx + p.y * mzy + p.z * mzz)+ z);
p.sy= -(((p.x * myx + p.y * myy + p.z * myz)+ y) * o) + (Camera.viewHeight/2);
p.sx= (((p.x * mxx + p.y * mxy + p.z * mxz)+ x) * o) + (Camera.viewWidth/2);
}
};
Object3D.prototype.Render=function(mc){
mc.clear();
mc.moveTo(this.vertList[0].sx,this.vertList[0].sy);
mc.beginFill(0xFFFFFF,100);
mc.lineTo(this.vertList[1].sx,this.vertList[1].sy);
mc.lineTo(this.vertList[2].sx,this.vertList[2].sy);
mc.lineTo(this.vertList[3].sx,this.vertList[3].sy);
mc.endFill();
};
Object3D.prototype.MoveForward=function(incr){
this.Position.x+=this.Orientation.zx * -incr;
this.Position.y+=this.Orientation.zy * -incr;
this.Position.z+=this.Orientation.zz * -incr;
};
Object3D.prototype.MoveBackward=function(incr){
this.Position.x+=this.Orientation.zx * incr;
this.Position.y+=this.Orientation.zy * incr;
this.Position.z+=this.Orientation.zz * incr;
};
function Camera3D(){
this.Position=new Vect3(0,0,-350);
this.Orientation=new Matrix3x3();
this.focalLength=950;
this.viewWidth = 700;
this.viewHeight= 500;
};
Camera3D.prototype.MoveForward=function(incr){
this.Position.x+=this.Orientation.zx * incr;
this.Position.y+=this.Orientation.zy * incr;
this.Position.z+=this.Orientation.zz * incr;
};
Camera3D.prototype.MoveBackward=function(incr){
this.Position.x+=this.Orientation.zx * -incr;
this.Position.y+=this.Orientation.zy * -incr;
this.Position.z+=this.Orientation.zz * -incr;
};
//create new camera
var Camera = new Camera3D();
//position camera along world z axis
Camera.Position.Set(0,0,-350);
//create a basic 3D object
var myQuad = new Object3D();
//add vertices/points to object
myQuad.AddVertices([new Vect3(10,10,0),new Vect3(-10,10,0),new Vect3(-10,-10,0),new Vect3(10,-10,0)]);
//set up animation loop
var animationLoop = setInterval(Update,1);
function Update(){
//update object rotation
myQuad.Orientation.SetRotation(0,(objectRotation+=.1),0);
//transform vertices
myQuad.TransformVertices();
//render quad
myQuad.Render(QuadGraphic);
};
////////////////////////////////////Camera Keyboard Control/////////////////////////////////////////////
var CameraTranslationIncrement=1;
var CameraRotationIncrement=1;
var CameraRotationX = 0;
var CameraRotationY = 0;
var CameraRotationZ = 0;
Kdwn=Key.isDown;
myListener = new Object();
myListener.onKeyDown = function () {
if(Kdwn(38)){// pan camera around X axis
CameraRotationX+=CameraRotationIncrement;
Camera.Orientation.SetRotation(CameraRotationX,CameraRotationY,CameraRotationZ);
}
if(Kdwn(40)){// -pan camera around X axis
CameraRotationX-=CameraRotationIncrement;
Camera.Orientation.SetRotation(CameraRotationX,CameraRotationY,CameraRotationZ);
}
if(Kdwn(37)){// pan camera around Y axis
CameraRotationY+=CameraRotationIncrement;
Camera.Orientation.SetRotation(CameraRotationX,CameraRotationY,CameraRotationZ);
}
if(Kdwn(39)){// -pan camera around Y axis
CameraRotationY-=CameraRotationIncrement;
Camera.Orientation.SetRotation(CameraRotationX,CameraRotationY,CameraRotationZ);
}
//translate camera forward
if(Kdwn(32)){Camera.MoveForward(10);}
//translate camera backward
if(Kdwn(66)){Camera.MoveBackward(10);}
}
Key.addListener(myListener);
///////////////////////////////////////Quad Mouse Event Handler////////////////////////////////////
//movie clip to render to
var QuadGraphic = createEmptyMovieClip("obj1",1);
//mouse event handlers
QuadGraphic.onRollOver=function(){
myQuad.MoveForward(10);
};
QuadGraphic.onRollOut=function(){
myQuad.MoveBackward(10);
};
Hope it helps. Just let me know if you need any advice using it in your set-up. Or would like to add something to it ... like simple lighting or back-face culling.