import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix3D; import flash.geom.PerspectiveProjection; import flash.geom.Utils3D; import flash.geom.Vector3D; import flash.Vector; class Draw3D extends Sprite { private var stack:Vector; private var vertices:Vector; private var commands:Vector; private var points:Vector; private var uvts:Vector; private var modelViewMatrix:Matrix3D; private var perspective:PerspectiveProjection; private var projectionMatrix:Matrix3D; private var canvas:Sprite; private var X_AXIS:Vector3D; private var Y_AXIS:Vector3D; private var Z_AXIS:Vector3D; private var numverts:Int; private var numcommands:Int; public function new() { super(); } private function init() { //initialize vars stack = new Vector(); vertices = new Vector(); commands = new Vector(); points = new Vector(); uvts = new Vector(); modelViewMatrix = new Matrix3D(); canvas = new Sprite(); X_AXIS = new Vector3D(1,0,0); Y_AXIS = new Vector3D(0,1,0); Z_AXIS = new Vector3D(0,0,1); numverts = 0; numcommands = 0; //setup canvas canvas.x = stage.stageWidth/2; canvas.y = stage.stageHeight/2; addChild(canvas); perspective = new PerspectiveProjection(); perspective.fieldOfView = 50; stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(Event.RENDER, render); } private function onEnterFrame(event:Event) { update(); flash.Lib.current.stage.invalidate(); } private function update() { } private function render(event:Event) { projectionMatrix = perspective.toMatrix3D(); projectionMatrix.prependTranslation(0,0,300); //project points Utils3D.projectVectors(projectionMatrix, vertices, points, uvts); //connect the dots canvas.graphics.clear(); canvas.graphics.lineStyle(1,0xFF0000); canvas.graphics.drawPath(commands, points); } private function rotate(angleX:Float, angleY:Float, angleZ:Float) { modelViewMatrix.prependRotation(angleX, X_AXIS); modelViewMatrix.prependRotation(angleY, Y_AXIS); modelViewMatrix.prependRotation(angleZ, Z_AXIS); } private function draw(xd:Float, yd:Float, zd:Float) { var tv:Vector3D = modelViewMatrix.transformVector(new Vector3D(xd,yd,zd)); vertices.push(tv.x); vertices.push(tv.y); vertices.push(tv.z); commands.push(2); modelViewMatrix.prependTranslation(xd,yd,zd); } private function move(xd:Float, yd:Float, zd:Float) { var tv:Vector3D = modelViewMatrix.transformVector(new Vector3D(xd,yd,zd)); vertices.push(tv.x); vertices.push(tv.y); vertices.push(tv.z); commands.push(1); modelViewMatrix.prependTranslation(xd,yd,zd); } private function pushMatrix() { stack.push(modelViewMatrix.clone()); } private function popMatrix() { modelViewMatrix = stack.pop(); } private function loadIdentityMatrix() { modelViewMatrix = new Matrix3D(); } }