stage.frameRate = 30;
const TWO_PI:Number = Math.PI * 2;
var centerX:Number = 200;
var centerY:Number = 200;
var p:Array = new Array();
var zpos:Number;
var xpos:Number;
var ypos:Number;
var depth:Number;
var canvas:BitmapData = new BitmapData(400,400,true,0xFF000000);
addChild(new Bitmap(canvas));
var dy:Number = 0
var dx:Number = 0;
addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
canvas.fillRect(canvas.rect, 0xFF000000);
dx += (mouseX / 100 - dx)/12;
dy += (mouseY / 100 - dy)/12;
var xp:Number, yp:Number, zp:Number;
canvas.lock();
for (var a:Number =0; a < TWO_PI; a+=.08){
for (var b:Number =0; b < TWO_PI; b+=.08){
xp = (70 + 40 * Math.cos(a)) * Math.cos(b) ;
yp = (70 + 40 * Math.cos(a)) * Math.sin(b);
zp = 40 * Math.sin(a);
calc3D(xp, yp, zp, dx, dy);
convert3D();
canvas.setPixel(p[0], p[1], 0xFFFFFF);
}
}
canvas.unlock();
}
function calc3D(px:Number, py:Number, pz:Number, rotX:Number=0, rotY:Number=0):void {
// I first learned this from code by Andries Odendaal - www.wireframe.co.za
zpos=pz*Math.cos(rotX)-px*Math.sin(rotX) ;
xpos=pz*Math.sin(rotX)+px*Math.cos(rotX) ;
ypos=py*Math.cos(rotY)-zpos*Math.sin(rotY) ;
zpos=py*Math.sin(rotY)+zpos*Math.cos(rotY);
}
function convert3D():void {
depth = 1/((zpos/200)+1);
p[0] = xpos * depth + centerX;
p[1] = ypos * depth + centerY;
}
This code draws a rotating 3D torus using setPixel().