
A very simple 3D routine written in ActionScript 1.0. If you need to understand transformation and projection of 3D geometry, this script may be a good starting point. It creates a model and a camera. The object responds to the mouse movements. We use a 3D rotation matrix to transform the object points along the x and y axes.
Download Source File: Flash5_Point3D.zip
This code block is placed inside the the host clip's onClipEvent (load) event handler. Whenever the mouse moves the onClipEvent (mouseMove) handler calls the objectRotate() function.
Code:
/* 2 axis rotation matrix
*******************************************************/
function xy_matrix (rx, ry) {
var cosrx = Math.cos(rx);
var sinrx = Math.sin(rx);
var cosry = Math.cos(ry);
var sinry = Math.sin(ry);
var r = {
r11 : cosry ,
r12 : 0 ,
r13 : sinry ,
r21 : sinrx * sinry ,
r22 : cosrx ,
r23 : -cosry * sinrx ,
r31 : -cosrx * sinry ,
r32 : sinrx ,
r33 : cosrx * cosry
}
return r;
}
/* point object constructor
*******************************************************/
function Point(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
}
/* point rotation method
*******************************************************/
Point.prototype.rotate = function(R) {
var vector = {
x : R.r11 * this.x + R.r12 * this.y + R.r13 * this.z ,
y : R.r21 * this.x + R.r22 * this.y + R.r23 * this.z ,
z : R.r31 * this.x + R.r32 * this.y + R.r33 * this.z
}
return vector;
}
/* camera object constructor
*******************************************************/
function Camera(focal_length, zoom) {
this.f = focal_length;
this.zoom = zoom;
}
/* camera projection method
*******************************************************/
Camera.prototype.project = function(vector, mc) {
var k = this.zoom * this.f/(vector.z - this.f);
mc._x = k * vector.x;
mc._y = k * vector.y;
}
/* the array of points that make up the model
*******************************************************/
this.model = [
new Point( 1, 1, 1) ,
new Point( 1, 1,-1) ,
new Point( 1,-1, 1) ,
new Point( 1,-1,-1) ,
new Point(-1, 1, 1) ,
new Point(-1, 1,-1) ,
new Point(-1,-1, 1) ,
new Point(-1,-1,-1)
];
/* main program
*******************************************************/
function rotateObject(model) {
/* capture mouse coordinates */
var rx = _ymouse / 100;
var ry = _xmouse / 100;
/* calculate rotation matrix */
var m = xy_matrix(rx, ry);
/* draw object */
for(var i = 0; i < model.length; i++) {
/* calculate transformation */
var vector = model[i].rotate(m);
/* project points to camera plane */
this.cam.project(vector, this[i]);
}
/* update frame */
updateAfterEvent();
}
/* build model
*******************************************************/
for(var i = 0; i < this.model.length; i++) {
this.attachMovie("locator", i, i);
}
/* add camera
*******************************************************/
this.cam = new Camera(5, 80);