package { import away3d.cameras.Camera3D; import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.controllers.LookAtController; import away3d.core.raycast.MouseHitMethod; import away3d.entities.Mesh; import away3d.events.MouseEvent3D; import away3d.materials.ColorMaterial; import away3d.primitives.ConeGeometry; import away3d.primitives.CubeGeometry; import away3d.primitives.SphereGeometry; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; [SWF(width="500", height="400", frameRate="60", backgroundColor="#FFFFFF")] public class LookAtController_v4 extends Sprite { private var cam:Camera3D; private var lastKey:uint; private var keyIsDown:Boolean = false; private var view:View3D; private var camController:LookAtController; public function LookAtController_v4() { // create a basic camera cam = new Camera3D(); cam.z = -350; // make sure it's positioned away from the default 0,0,0 coordinate // create a viewport view = new View3D(null, cam); addChild(view); // make some objects and put it on the 3D stage var sphere:SphereGeometry = new SphereGeometry(); var sphereMaterial:ColorMaterial = new ColorMaterial(0xff0000); var sphereMesh:Mesh = new Mesh(sphere, sphereMaterial); sphereMesh.mouseEnabled = true; view.scene.addChild(sphereMesh); var cone:ConeGeometry = new ConeGeometry(); var coneMaterial:ColorMaterial = new ColorMaterial(0x00ff00); var coneMesh:Mesh = new Mesh(cone, coneMaterial); coneMesh.x = -150; coneMesh.mouseHitMethod = MouseHitMethod.BOUNDS_ONLY; coneMesh.mouseEnabled = true; view.scene.addChild(coneMesh); var cube:CubeGeometry = new CubeGeometry(); var cubeMaterial:ColorMaterial = new ColorMaterial(0x0000ff); var cubeMesh:Mesh = new Mesh(cube, cubeMaterial); cubeMesh.x = 150; cubeMesh.mouseEnabled = true; view.scene.addChild(cubeMesh); // add a huge surrounding sphere so we really can see what we're doing var largeSphere:SphereGeometry = new SphereGeometry(1500); var largeSphereMaterial:ColorMaterial = new ColorMaterial(0xffff00); var largeSphereMesh:Mesh = new Mesh(largeSphere, largeSphereMaterial); largeSphereMesh.scaleX = -1; view.scene.addChild(largeSphereMesh); // setup the camera controller camController = new LookAtController( cam, sphereMesh ); this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); this.stage.addEventListener(KeyboardEvent.KEY_UP, keyUp); this.addEventListener(Event.ENTER_FRAME, update); // Listen for clicks on the objects sphereMesh.addEventListener( MouseEvent3D.MOUSE_DOWN, objectClick ); coneMesh.addEventListener( MouseEvent3D.MOUSE_DOWN, objectClick ); cubeMesh.addEventListener( MouseEvent3D.MOUSE_DOWN, objectClick ); } public function update(e:Event):void { if(keyIsDown){ // if the key is still pressed, just keep on moving switch(lastKey){ case 87 : cam.moveUp(10); break; case 83 : cam.moveDown(10); break; case 65 : cam.moveLeft(10); break; case 68 : cam.moveRight(10); break; case Keyboard.UP : cam.moveForward(10); break; case Keyboard.DOWN : cam.moveBackward(10); break; } } // render the view camController.update(); view.render(); } private function keyDown(e:KeyboardEvent):void { lastKey = e.keyCode; keyIsDown = true; } private function keyUp(e:KeyboardEvent):void { keyIsDown = false; } private function objectClick(e:MouseEvent3D):void { camController.lookAtObject = e.target as ObjectContainer3D; } } }