3D Bezier

[SWF(backgroundColor=0x000000, width=800, height=600)];
x = stage.stageWidth / 2;
y = stage.stageHeight / 2;
var verts:Vector.<Number>  = new Vector.<Number>();
var tVerts:Vector.<Number> = new Vector.<Number>();
var pVerts:Vector.<Number> = new Vector.<Number>();
var uvts:Vector.<Number> = new Vector.<Number>();

var igraph:Vector.<IGraphicsData> = new Vector.<IGraphicsData>();

var tVect:Vector3D = new Vector3D();
var m:Matrix3D = new Matrix3D();
for (var i:int = 0; i<300; i++){
	for (var j:int = 0; j<3; j++){
		tVect.x = Math.random() * 0.15;
		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);
		tVect = m.transformVector(tVect);
	    verts.push(tVect.x, tVect.y, tVect.z);
	}
	
	 
	var stroke:IGraphicsData = new GraphicsStroke();
	
	var col:int = [0xFFFFFF, 0x000000, 0xFFCC00, 0xFF0000][int(Math.random() * 4)];
    with (stroke) thickness = (Math.random()*Math.random())*10, fill = new GraphicsSolidFill(col);

	var bez:GraphicsPath = new GraphicsPath();
	bez.commands = Vector.<int>([1, 3]);
	igraph.push(stroke);
    igraph.push(bez);
}

var perspective:PerspectiveProjection = new PerspectiveProjection();
perspective.fieldOfView = 45;
var trans:Matrix3D = new Matrix3D();
var proj:Matrix3D = perspective.toMatrix3D();
var dx:Number = 0, dy:Number = 0;

addEventListener(Event.ENTER_FRAME, onLoop);
function onLoop(evt:Event):void {
	dx += (mouseX - dx) / 4;
	dy += (mouseY - dy) / 4;
	   
	trans.identity();
	trans.appendRotation(dy, Vector3D.X_AXIS);
	trans.appendRotation(dx, Vector3D.Y_AXIS);
	trans.appendTranslation(0,0,0.5);
	trans.transformVectors(verts, tVerts);
	Utils3D.projectVectors(proj, tVerts, pVerts, uvts);
	
	var inc:int = 0;
	for (var i:int = 1; i<igraph.length; i+=2){
		GraphicsPath(igraph[i]).data = pVerts.slice(inc, inc + 6);
		inc += 6;
	}
	 
	graphics.clear();
	graphics.drawGraphicsData(igraph);
}

After a few hours of trying to get a super optimized fp10 z-sorting demo happening, I gave up (for now) and decided to just let loose with something easy. The result is this 3D Bezier example…


Check out the swf…

3 comments

  1. I like the stuff you are doing with the new classes since fp10. I think you would be a innovation for the papervision team ! 😉

  2. @Terry Thanks – just checked out your site… very cool stuff there 🙂

    @Rafael Thanks – I am really eager to get my hands on papervision X…. I hope it comes out soon… really curious to see how they handled a few things…

Leave a Reply

Your email address will not be published. Required fields are marked *