package { import caurina.transitions.Equations; import caurina.transitions.Tweener; import com.gskinner.utils.Rnd; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.events.TimerEvent; import flash.utils.Timer; import org.ascollada.utils.FPS; import org.papervision3d.core.geom.renderables.Vertex3D; import org.papervision3d.core.math.Number3D; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(frameRate="60", backgroundColor="0xffffff", width="550", height="400")] public class PV3D extends BasicView { private var oldX:Number = 0; private var oldY:Number = 0; private var dxCam:Number = 0; private var dyCam:Number = 0; private var velocity:Number = .01; private var radio:Number = 1500; private var c:Cube; private var positions:Array = []; private var balls:Array = []; public function PV3D() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; graphics.beginFill(0xffffff, 1); graphics.drawRect(0, 0, 550, 400); graphics.endFill(); super(550, 400, false, true); Init3D(); CreateObjects(); startRendering(); } private function Init3D():void { addChild(new FPS); viewport.buttonMode = true; viewport.useHandCursor = true; camera.zoom = 75; camera.z = -1500; stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown, false, 0, true); stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp, false, 0, false); stage.addEventListener(MouseEvent.ROLL_OUT, MouseUp, false, 0, false); stage.addEventListener(MouseEvent.MOUSE_WHEEL, Zoom); var t:Timer = new Timer(4000); t.addEventListener(TimerEvent.TIMER, TransformVertices); t.start(); } private function CreateObjects():void { var mat:WireframeMaterial = new WireframeMaterial(0x999999, 100, 1); mat.doubleSided = true; var matlist:MaterialsList = new MaterialsList; matlist.addMaterial(mat, "all"); c = new Cube(matlist, 500, 500, 500, 3, 3, 3, Cube.NONE, Cube.BOTTOM + Cube.TOP); scene.addChild(c); c.geometry.vertices.forEach ( function(it:Vertex3D, index:int, arr:Array):void { var smat:ColorMaterial = new ColorMaterial(0xff0000, 1, false); var s:Sphere = new Sphere(smat, 10, 5, 3); balls.push(s); var pos:Number3D = new Number3D(it.x, it.y, it.z); positions.push(pos); s.x = it.x; s.y = it.y; s.z = it.z; c.addChild(s); } ); } private function TransformVertices(e:TimerEvent = null):void { var add:Number = Rnd.float(-200, 200); c.geometry.vertices.forEach ( function(it:Vertex3D, index:int, arr:Array):void { var px:Number = positions[index].x + add; var py:Number = positions[index].y + add; var pz:Number = positions[index].z + add; Tweener.addTween(it, {x:px, y:py, z:pz, time:.5, delay:index * .05, transition:Equations.easeOutCirc}); Tweener.addTween(balls[index], {x:px, y:py, z:pz, time:.5, delay:index * .05, transition:Equations.easeOutCirc}); } ); } private function MouseDown(e:MouseEvent):void { oldX = mouseX; oldY = mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, MouseMove); } private function MouseUp(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, MouseMove); } private function MouseMove(e:MouseEvent):void { dxCam -= (mouseX - oldX) * velocity; dyCam += (mouseY - oldY) * 4; var angleX:Number = Math.sin(dxCam) * radio; var angleZ:Number = Math.cos(dxCam) * radio; camera.x = angleX; camera.z = angleZ; camera.y = dyCam; oldX = mouseX; oldY = mouseY; } private function Zoom(e:MouseEvent):void { camera.zoom += e.delta; } } }