Actionscript:
-
[SWF(backgroundColor=0x444444, width=500, height=500)]
-
var hsw:Number = stage.stageWidth / 2;
-
var hsh:Number = stage.stageHeight / 2;
-
-
var pointNum:int = 200;
-
var points3D:Vector.<Number> = new Vector.<Number>();
-
var points2D:Vector.<Number> = new Vector.<Number>();
-
var uvts:Vector.<Number> = new Vector.<Number>();
-
var sorted:Array = [];
-
-
var pnt:Point = new Point();
-
var m:Matrix3D = new Matrix3D();
-
var v:Vector3D = new Vector3D();
-
for (var i:int = 0; i<pointNum; i++){
-
v.x = Math.random()*400-200;
-
m.identity();
-
m.appendRotation(Math.random()*360, Vector3D.X_AXIS);
-
m.appendRotation(Math.random()*360, Vector3D.Y_AXIS);
-
m.appendRotation(Math.random()*360, Vector3D.Z_AXIS);
-
v = m.transformVector(v);
-
points3D.push(v.x, v.y, v.z);
-
points2D.push(0,0);
-
uvts.push(0,0,0);
-
sorted.push(new Vector3D());
-
}
-
points3D.fixed = true;
-
points2D.fixed = true;
-
uvts.fixed = true;
-
-
var p:PerspectiveProjection = new PerspectiveProjection();
-
var proj:Matrix3D = p.toMatrix3D();
-
-
var dx:Number = 0, dy:Number = 0;
-
addEventListener(Event.ENTER_FRAME, onLoop);
-
function onLoop(evt:Event):void {
-
var i:int, j:int;
-
dx += (mouseX - dx) / 4;
-
dy += (mouseY - dy) / 4;
-
m.identity();
-
m.appendRotation(dx, Vector3D.Y_AXIS);
-
m.appendRotation(dy, Vector3D.X_AXIS);
-
m.appendTranslation(0, 0, 1000);
-
m.append(proj);
-
-
Utils3D.projectVectors(m, points3D, points2D, uvts);
-
-
for (i = 0, j = 0; i<points2D.length; i+=2, j++){
-
sorted[j].x = points2D[i] + hsw;
-
sorted[j].y = points2D[i + 1] + hsh;
-
sorted[j].z = uvts[j * 3 + 2];
-
}
-
sorted.sortOn("z", Array.NUMERIC);
-
-
graphics.clear();
-
for(i = 0; i<sorted.length; i++){
-
var zpos:Number = sorted[i].z * 12000;
-
var c:int = zpos * 14;
-
graphics.beginFill(c <<16 | c <<8 | c);
-
graphics.drawCircle(sorted[i].x, sorted[i].y,zpos);
-
graphics.endFill();
-
}
-
}
Here is an easy way to do z-sorting on a cluster of circles.
4 Comments
I’m trying to implement keyboard usage (actually, not trying, i did) with this snippet, the problem is that when you rotate it on the y axis, the circles don’t rotate on the x axis (they do, but not from the front view). how do i get the circles to spin left and right with the left and right arrows, and then be able to spin then up and down with the up and down arrow keys?
woops, i mean after you rotate on the y axis, then try to rotate on the x axis, it rotates based on the rotation of the y, and I’d like to rotate based on the screen pose.
Hey Thomas, just posted a demo to answer your question:
http://actionsnippet.com/?p=2064
pretty sweat, might be useful soon - thanks
One Trackback
[...] Simple z-sorting [...]