This is based around a lingo tutorial I read a while ago by some guy from New Zealand, he wrote a simple 3d engine (in later versions of director a 3d engine was incorporated anyway, this was before that)… I've been looking up the tutorial on google, but it seems to have disappeared, a pity because it would explain the concept around which 3d is based in more depth. Anyway, from the original I took onboard the principals and translated the lingo into actionscript 2.0.

It would seem Flash is about to die too, so someday I'll have to re-write this in javascript.

Here is the actionscript, the important part is the cal2d bit:

_root.onLoad = function() {

corNers = 8;

faCes = 6;

for (i=0; i

}

vFov = 180;

xOff = Stage.height/2;

yOff = Stage.height/2;

zPos = new Array();

xyzP = new Array( { x: -50, y: 50, z:-50 },

{ x: 50, y: 50, z:-50 },

{ x: -50, y:-50, z:-50 },

{ x: 50, y:-50, z:-50 },

{ x: -50, y: 50, z: 50 },

{ x: 50, y: 50, z: 50 },

{ x: -50, y:-50, z: 50 },

{ x: 50, y:-50, z: 50 } );

vCon = new Array( 0, 1, 2, 3,

4, 5, 6, 7,

0, 1, 4, 5,

2, 3, 6, 7,

0, 2, 4, 6,

1, 3, 5, 7 );

coL = new Array( 0x6600FF,

0x00FFFF,

0x00FF00,

0xFFFF00,

0xFF0000,

0xFF00FF );

opA = new Array( 85, 95, 85, 95, 90, 65 );

};

function Entry(index, value) {

this.index = index;

this.value = value;

}

function sortValues(a, b) {

return ((a.value>b.value) ? -1 : ((a.value

_root.onEnterFrame = function() {

cal2d();

// updateAfterEvent()// if mouseMove;

};

function cal2d() {

xRot -= (_ymouse-xOff)/2000;

yRot += ((_xmouse)-yOff)/2000;// and with it's y axis

mCYr = Math.cos(yRot);

mSYr = Math.sin(yRot);

mCXr = Math.cos(xRot);

mSXr = Math.sin(xRot);

for (i=0; i

tmpX = (xyzP[i].z*mSYr)+(xyzP[i].x*mCYr);

tmpZ = (xyzP[i].y*mSXr)+(tmpZpos*mCXr);

tmpY = (xyzP[i].y*mCXr)-(tmpZpos*mSXr);

eSca = 1/(tmpZ/vFov+1);

_root["x0"+i] = tmpX*eSca+xOFF;

_root["y0"+i] = tmpY*eSca+yOFF;

_root["z0"+i] = tmpZ// Z positions needed for sorting the z order of the faces

}

for (i=0; i

// pCal = z position of center of each face

pCal = (_root["z0"+vCon[e]]+_root["z0"+vCon[e+1]]+_root["z0"+vCon[e+2]]+_root["z0"+vCon[e+3]])/4;

zPos[i] = new Entry(i, pCal);// begin the z ordering of faces

}

zPos.sort(sortValues);

for (i=0; i

z = zPos[i].index;

_root["fa0"+z].swapDepths(i);// z order the faces on the stage

with (_root["fa0"+i]) {

clear();

lineStyle(0, 0x000000, 50);

beginFill(_root.coL[i], opA[i]);

moveTo(_root["x0"+vCon[e]], _root["y0"+vCon[e]]);

lineTo(_root["x0"+vCon[e+1]], _root["y0"+vCon[e+1]]);

lineTo(_root["x0"+vCon[e+3]], _root["y0"+vCon[e+3]]);

lineTo(_root["x0"+vCon[e+2]], _root["y0"+vCon[e+2]]);

lineTo(_root["x0"+vCon[e]], _root["y0"+vCon[e]]);

endFill();

}

}

}