Procedural 3D (5,000 pixel sphere)
October 2nd, 2008Just playing with some procedural 3D stuff.... I was actually working in Papervision today and that inspired me to dig up my old 3d functions and start playing...
move mouse to lower right corner to see sphere // move to upper left to see a mini-galaxy
This movie requires Flash Player 9
The code is pretty simple, I use a big bitmap and then scale it down to create anti-aliased pixels.... the core functions are calc3D() and convert3D()....
Actionscript:
-
var centerX:Number = 500;
-
var centerY:Number = 500;
-
var p:Array = new Array();
-
var zpos:Number;
-
var xpos:Number;
-
var ypos:Number;
-
var depth:Number;
-
-
var canvas:BitmapData = new BitmapData(1000,1000,true,0xFF000000);
-
var frame:Bitmap = new Bitmap(canvas, "auto", true);
-
frame.scaleX = frame.scaleY = .5;
-
addChild(frame);
-
-
var rx:Array = new Array();
-
var ry:Array = new Array();
-
for (var i:int = 0; i<5000; i++) {
-
rx.push(Math.random()*(Math.PI*2));
-
ry.push(Math.random()*(Math.PI*2));
-
}
-
var inc:Number = 0;
-
var dx:Number=0;
-
var dy:Number=0;
-
addEventListener(Event.ENTER_FRAME, onLoop);
-
function onLoop(evt:Event):void {
-
-
canvas.fillRect(canvas.rect, 0xFF000000);
-
inc+=.05;
-
dx+= (mouseX/50 - dx)/12;
-
dy += (mouseY/50 - dy)/12
-
for (var i:int = 0; i<5000; i++) {
-
// local space of the sphere
-
calc3D(200,0,0,rx[i] , ry[i] +inc);
-
xpos+=50;
-
// final space for the sphere
-
calc3D(xpos, ypos, zpos,dx, dy);
-
convert3D();
-
canvas.setPixel(p[0], p[1], 0xFFFFFF);
-
}
-
}
-
-
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/mouseY)+1);
-
p[0] = (xpos * depth) + centerX;
-
p[1] = (ypos * depth) + centerY;
-
}
October 13th, 2008 at 5:11 am
Had great fun playing around with this!