package { import away3d.containers.*; import away3d.core.math.Number2D; import away3d.core.math.Number3D; import away3d.lights.PointLight3D; import away3d.materials.ShadingColorMaterial; import away3d.materials.WireColorMaterial; import away3d.primitives.Sphere; import flash.display.*; import flash.events.*; import flash.utils.getTimer; public class Main extends Sprite { static private const ROT_NUM:int = 10; static private const CHILDREN_NUM:int = 20; private var view:View3D; private var higes:Array = []; public function Main() { stage.quality = StageQuality.LOW; view = new View3D( { x:stage.stageWidth / 2, y:stage.stageHeight / 2 } ); addChild(view); // create 3d objects for (var i:int = 0; i < ROT_NUM; i++) { var hige:ObjectContainer3D = new ObjectContainer3D(); view.scene.addChild(hige); hige.rotationY = i * 360 / ROT_NUM; var distance:Number = 100; var light:PointLight3D = new PointLight3D(); light.color = 0x006699; light.x = -1000; light.y = 1000; light.z = -1000; view.scene.addChild(light); for (var j:int = 0; j < CHILDREN_NUM; j++) { var m:ShadingColorMaterial = new ShadingColorMaterial ({ ambient:0x0, diffuse:0x0, specular:0x0}) var s:Sphere = new Sphere(); s.material = m; s.radius = 50; s.segmentsW = 3; s.segmentsH = 2; s.scale( 1 - 1 / CHILDREN_NUM * j ); distance += 70 * s.scaleX; s.z = distance; hige.addChild(s); if (higes[j] == null) higes[j] = []; higes[j][i] = s } } // rendering addEventListener(Event.ENTER_FRAME, enterFrameHandler); // mouse interactive stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function enterFrameHandler(e:Event):void { // Hige Animation for (var j:int = 0; j < higes.length; j++) { for (var i:int = 0; i < higes[j].length; i++) { var rot:Number = getTimer() / 1000 + 100 * i; higes[j][i].x = Math.sin(rot) * 30 * j higes[j][i].y = Math.cos(rot) * 10 * j } } // Mouse Interactive easePitch += (cameraPitch - easePitch) * 0.2 easeYaw += (cameraYaw - easeYaw) * 0.2 view.camera.x = 1000 * Math.sin(easeYaw * Math.PI / 180); view.camera.z = 1000 * Math.cos(easeYaw * Math.PI / 180); view.camera.y = 1000 * Math.cos(easePitch * Math.PI / 180); view.camera.lookAt(new Number3D()) view.render(); } // ---------------------------------------------- // Mouse Interactive // ---------------------------------------------- private var isOribiting:Boolean; private var cameraPitch:Number = 90; private var cameraYaw:Number = 270; private var cameraTarget:ObjectContainer3D = new ObjectContainer3D; private var previousMouseX:Number; private var previousMouseY:Number; private var easePitch:Number = 90; private var easeYaw:Number = 270; private function onMouseDown(event:MouseEvent):void { isOribiting = true; previousMouseX = event.stageX; previousMouseY = event.stageY; view.render(); } private function onMouseUp(event:MouseEvent):void { isOribiting = false; } private function onMouseMove(event:MouseEvent):void { var differenceX:Number = event.stageX - previousMouseX; var differenceY:Number = event.stageY - previousMouseY; if(isOribiting){ cameraPitch += differenceY * 0.25; cameraYaw += differenceX * 0.25; cameraPitch %= 360; cameraPitch = cameraPitch > 0 ? cameraPitch : 0.0001; cameraPitch = cameraPitch < 180 ? cameraPitch : 179.9999; previousMouseX = event.stageX; previousMouseY = event.stageY; } } } }