package { import away3d.cameras.HoverCamera3D; import away3d.containers.*; import away3d.core.base.*; import away3d.core.math.*; import away3d.events.*; import away3d.materials.*; import away3d.primitives.*; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; [SWF(width="500", height="400", frameRate="30", backgroundColor="#FFFFFF")] public class Triaxe extends Sprite { private var View:View3D; private var swfStage:Stage; private var cover:Cover; // HoverCam controls private var camera:HoverCamera3D; private var lastMouseX:Number; private var lastMouseY:Number; private var lastPanAngle:Number; private var lastTiltAngle:Number; private var move:Boolean = false; public function Triaxe() { super(); // prep for handling resizing events swfStage = this.stage; swfStage.scaleMode = StageScaleMode.NO_SCALE; swfStage.align = StageAlign.TOP; // create a 3D-viewport camera = new HoverCamera3D({zoom:2, focus:100, distance:250}); View = new View3D({camera:camera,x:250, y:200}); // add viewport to the stage addChild(View); camera.lookAt( new Number3D(0, 0, 0) ); camera.targetpanangle = camera.panangle = 45; camera.targettiltangle = camera.tiltangle = 20; // Add some reference objects var mat:ColorMaterial = new ColorMaterial(0xffff00); var sphere1:Sphere = new Sphere({radius:10, material:mat, x:100,y:-150,bothsides:true}); View.scene.addChild(sphere1); mat = new ColorMaterial(0xff00ff); var sphere2:Sphere = new Sphere({radius:10, material:mat, y:200,z:150,bothsides:true}); View.scene.addChild(sphere2); mat = new ColorMaterial(0x00ffff); var sphere3:Sphere = new Sphere({radius:10, material:mat, z:100,x:-150,bothsides:true}); View.scene.addChild(sphere3); // Update view View.render(); camera.hover(); // Show the axis var axis:Trident = new Trident(180); View.scene.addChild(axis); // only run when user is hovering cover = new Cover(this); addChild(cover); addEventListener(Event.ENTER_FRAME, onEnterFrame); this.stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown); this.stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp); } private function onEnterFrame(e:Event):void { if(!cover.visible) { // rerender viewport var cameraSpeed:Number = 0.3; // Approximately same speed as mouse movement. if (move) { camera.targetpanangle = cameraSpeed*(stage.mouseX - lastMouseX) + lastPanAngle; camera.targettiltangle = cameraSpeed*(stage.mouseY - lastMouseY) + lastTiltAngle; } camera.hover(); View.render(); } } private function MouseDown(event:MouseEvent):void { lastPanAngle = camera.targetpanangle; lastTiltAngle = camera.targettiltangle; lastMouseX = stage.mouseX; lastMouseY = stage.mouseY; move = true; } private function MouseUp(event:MouseEvent):void { move = false; } private function makeTriangle():Triangle { // Create a random (sur)face var newFace:Face = new Face( getVertex(), getVertex(), getVertex() ); // Create triangle and add the face var tri:Triangle = new Triangle(); tri.addFace( newFace ); tri.bothsides = true; // add triangle to scene and randomize rotation tri.rotationY = Math.random()*360; tri.rotationZ = Math.random()*360; tri.rotationZ = Math.random()*360; return tri; } private function getVertex():Vertex { var max:Number = 50; var newX:Number = (Math.random()*max)-(max/2); var newY:Number = (Math.random()*max)-(max/2); var newZ:Number = (Math.random()*max)-(max/2); var vert:Vertex = new Vertex(newX,newY,newZ); return vert; } } }