package { import away3d.cameras.*; import away3d.containers.*; import away3d.core.base.*; import away3d.core.clip.*; import away3d.core.math.*; import away3d.core.render.*; import away3d.core.utils.*; import away3d.events.*; import away3d.lights.*; import away3d.materials.*; import away3d.primitives.*; import away3d.sprites.*; import away3d.test.*; import fl.motion.easing.*; import flash.display.*; import flash.events.*; import flash.filters.*; import flash.geom.*; import flash.text.*; import flash.ui.*; import flash.utils.*; import gs.TweenMax; /** * Simple navigation test with mouse and keyboard in Away3D (http://www.away3d.com) using TweenMax (http://blog.greensock.com/tweenmaxas3/). * * @author Knut Urdalen */ [SWF(backgroundColor="#000000", frameRate="30", quality="low", width="800", height="600")] public class NavigationTest extends Sprite { // engine variables private var scene:Scene3D; private var camera:Camera3D; private var view:View3D; // scene objects private var background:Plane; private var sphereCenter:Sphere; private var cubeLeft:Cube; private var cubeRight:Cube; private var cubeTop:Cube; private var cubeBottom:Cube; private var cubes:ObjectContainer3D; // navigation variables private var target:Number3D; // used for tracking camera target public function NavigationTest() { init(); } private function init() : void { initEngine(); initObjects(); initListeners(); initInstructions(); } private function initEngine() : void { scene = new Scene3D(); camera = new Camera3D(); camera.zoom = 5; camera.focus = 100; camera.z = -1000; view = new View3D({scene:scene, camera:camera}); addChild(view); } private function initObjects() : void { // helper objects scene.addChild(new WirePlane({height: 500, width: 500, segmentsH: 10, segmentsW: 10})); scene.addChild(new Trident(250)); // primitives background = new Plane({x: 0, y: 0, z: 500, width: 5000, height: 5000, rotationX: 90, material: new ColorMaterial(0x000000)}); scene.addChild(background); sphereCenter = new Sphere({x: 0, y: 0, z: 0}); scene.addChild(sphereCenter); cubeLeft = new Cube({x: -500, y: 0, z: 0, ownCanvas: true}); cubeRight = new Cube({x: 500, y: 0, z: 0, ownCanvas: true}); cubeTop = new Cube({x: 0, y: 500, z: 0, ownCanvas: true}); cubeBottom = new Cube({x: 0, y: -500, z: 0, ownCanvas: true}); // set default target target = sphereCenter.position; // group cubes into an object container to interact with them the same way cubes = new ObjectContainer3D(cubeTop, cubeBottom, cubeLeft, cubeRight); scene.addChild(cubes); } private function initListeners() : void { addEventListener(Event.ENTER_FRAME, onEnterFrame); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); cubes.addOnMouseOver(onMouseOver); cubes.addOnMouseOut(onMouseOut); cubes.addOnMouseDown(onMouseDown); background.addOnMouseDown(onMouseDown); onResize(null); } private function initInstructions() : void { var info:TextField = new TextField(); var format:TextFormat = new TextFormat(); format.font = "Verdana"; format.color = 0xAAAAAA; format.size = 10; info.defaultTextFormat = format; info.autoSize = TextFieldAutoSize.LEFT; info.wordWrap = false; info.selectable = false; addChild(info); info.text = "Use arrow keys or click on cubes to zoom in. Click on background or cubes while zoomed in to zoom out."; } private function onEnterFrame(e:Event) : void { camera.lookAt(target); // always look at target view.render(); } private function onMouseOver(event:MouseEvent3D) : void { (event.object as Mesh).filters = [new GlowFilter(0x666666, 1, 12, 12, 3, 3, false, false), new GlowFilter(0x666666, 1, 12, 12, 3, 3, true, false)]; } private function onMouseOut(event:MouseEvent3D) : void { (event.object as Mesh).filters = []; } private function onMouseDown(event:MouseEvent3D) : void { var cube:Cube = event.object as Cube; if(camera.focus == 200) { // zoom out zoomOut(); } else if(camera.focus == 100) { // zoom in zoomIn(cube); } } private function onMouseDownBackground() : void { zoomOut(); } private function onKeyDown(event:KeyboardEvent) : void { switch(event.keyCode) { case Keyboard.UP: { zoomIn(cubeTop); break; } case Keyboard.DOWN: { zoomIn(cubeBottom); break; } case Keyboard.LEFT: { zoomIn(cubeLeft); break; } case Keyboard.RIGHT: { zoomIn(cubeRight); break; } } } private function zoomIn(cube:Cube) : void { TweenMax.to(target, 1, {x: cube.x, y: cube.y, z: cube.z, ease: Back.easeOut}); TweenMax.to(camera, 1, {x: cube.x, y: cube.y, ease: Back.easeOut, focus: 200}); } private function zoomOut() : void { TweenMax.to(target, 1, {x: sphereCenter.x, y: sphereCenter.y, z: sphereCenter.z, ease: Back.easeOut}); TweenMax.to(camera, 1, {x: sphereCenter.x, y: sphereCenter.y, ease: Back.easeOut, focus: 100}); } private function onResize(event:Event) : void { view.x = stage.stageWidth / 2; view.y = stage.stageHeight / 2; } } }