package { import away3d.cameras.Camera3D; import away3d.containers.*; import away3d.core.base.*; import away3d.core.math.*; import away3d.events.*; import away3d.materials.*; import away3d.primitives.*; import com.bit101.components.Label; import com.bit101.components.Panel; import flash.display.Sprite; import flash.display.Stage; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; [SWF(width="500", height="400", frameRate="30", backgroundColor="#FFFFFF")] public class Camera extends Sprite { private var View:View3D; private var swfStage:Stage; private var cover:Cover; private var camera:Camera3D; private var lastMouseX:Number; private var lastMouseY:Number; private var camDrawing:Sprite; private var camDots:Sprite; private var move:Boolean = false; private var label:Label; private var label2:Label; public function Camera() { super(); // prep for handling resizing events swfStage = this.stage; swfStage.scaleMode = StageScaleMode.NO_SCALE; swfStage.align = StageAlign.TOP; // create a 3D-viewport camera = new Camera3D({zoom:1, focus:200, distance:50}); View = new View3D({camera:camera,x:250, y:200}); // add viewport to the stage addChild(View); camera.lookAt( new Number3D(0, 0, 0) ); // Add something that we can display the camera on var pan:Panel = new Panel(this,10,10); pan.setSize(100,190); pan.color = 0xffffff; addChild(pan); label = new Label(pan,0,0," As seen from above"); pan.addChild(label); camDots = new Sprite() camDots.x = 50; camDots.y = 80; pan.addChild(camDots); camDrawing = new Sprite() camDrawing.x = 0; camDrawing.y = 160; pan.addChild(camDrawing); label2 = new Label(pan,0,170,""); pan.addChild(label2); updateCameraDrawing(); // Add some reference spheres for(var i:Number = 0; i < 30 ; i++){ addRandomSphere(1000,5); } // Add a few that are closer to the centre for(var j:Number = 0; j < 10 ; j++){ addRandomSphere(100,5); } // Add big red "sun" var sphere3:Sphere = new Sphere({radius:500, material:"red#white",x:0,y:0,z:3000,segmentsW:15,segmentsH:9}); View.scene.addChild(sphere3); addCamDot(0xff0000,0,-500,30); // Add a mask to the camera sprite var panMask:Sprite = new Sprite(); panMask.graphics.beginFill(0xf000f0); panMask.graphics.drawRect(0,0,100,190); panMask.graphics.endFill(); pan.addChild(panMask); camDrawing.mask = panMask; // Update the view and display the "cover" View.render(); cover = new Cover(this); addChild(cover); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function addRandomSphere(distance:Number,size:Number):void { var col:Number = Math.random() * (255*255*255); var mat:ColorMaterial = new ColorMaterial( col.toString(16) ); var maxPos:Number = distance; var halfPos:Number = distance/2; var xPos:Number = (Math.random()*halfPos)-(halfPos/2); var yPos:Number = (Math.random()*halfPos)-(halfPos/2); var zPos:Number = (Math.random()*maxPos)-(maxPos/2); var sphere3:Sphere = new Sphere({radius:size, material:mat,x:xPos,y:yPos,z:zPos,bothsides:false}); View.scene.addChild(sphere3); addCamDot(col,xPos,zPos,size); } private function onEnterFrame(e:Event):void { if(!cover.visible) { camera.zoom = (stage.mouseY/stage.stageHeight) * 4+0.5; camera.focus = (stage.mouseX/stage.stageWidth) * 600; updateCameraDrawing(); // Render viewport View.render(); label2.text = "Zoom: "+(Math.floor(camera.zoom*10)/10)+" Focus: "+Math.floor(camera.focus); } } private function addCamDot(col:Number,x:Number,z:Number,size:Number):void { camDots.graphics.beginFill(col); camDots.graphics.drawCircle(x/11,z/11,size/3) camDots.graphics.endFill(); } private function updateCameraDrawing():void { var maxFOV:Number = 100; // (width/x) var maxZoom:Number = 70; // (height/y) var currFOV:Number = ( (100/camera.focus) )*maxFOV/2; var currZoom:Number = ( ((camera.zoom/4)+0.5) * maxZoom); camDrawing.graphics.clear(); camDrawing.graphics.lineStyle(1,0x000000); // Draw lens triangle camDrawing.graphics.moveTo(maxFOV/2,0); camDrawing.graphics.lineTo((maxFOV/2)-(currFOV/2) , -currZoom); camDrawing.graphics.lineTo((maxFOV/2)+(currFOV/2) , -currZoom); camDrawing.graphics.lineTo(maxFOV/2 , 0); // Draw "camera body" camDrawing.graphics.moveTo(maxFOV/2-5,0); camDrawing.graphics.lineTo(maxFOV/2+5,0) camDrawing.graphics.lineTo(maxFOV/2+5,10) camDrawing.graphics.lineTo(maxFOV/2-5,10) camDrawing.graphics.lineTo(maxFOV/2-5,0) trace("currZoom: "+currZoom+" currFOV: "+currFOV); } } }