package { import away3d.containers.View3D; import away3d.controllers.HoverController; import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.lights.PointLight; import away3d.materials.TextureMaterial; import away3d.materials.lightpickers.StaticLightPicker; import away3d.materials.methods.FresnelSpecularMethod; import away3d.materials.methods.SubsurfaceScatteringDiffuseMethod; import away3d.primitives.SphereGeometry; import away3d.textures.BitmapTexture; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; import flash.ui.Mouse; import flash.ui.MouseCursor; import flash.utils.getTimer; /** * @author Yasunobu Ikeda */ public class Main extends View3D { //---------------------------------------------------------- // // Constructor // //---------------------------------------------------------- public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } //---------------------------------------------------------- // // Property // //---------------------------------------------------------- [Embed(source = "assets/bg.jpg")] private var Bg:Class; [Embed(source = "assets/earthcloudmap.png")] private var CloudImg:Class; [Embed(source = "assets/8081-earthmap4k.jpg")] private var Diffuse:Class; [Embed(source = "assets/8081-earthbump4k.jpg")] private var Normal:Class; [Embed(source = "assets/8081-earthspec4k.jpg")] private var Specular:Class; private var cameraController:HoverController; private var lastMouseX:Number; private var lastMouseY:Number; private var lastPanAngle:Number; private var lastTiltAngle:Number; private var light:PointLight; private var lightPicker:StaticLightPicker; private var meshCould:Mesh; private var meshEarth:Mesh; private var move:Boolean = false; //---------------------------------------------------------- // // Function // //---------------------------------------------------------- public function init(event:Event = null):void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; antiAlias = 8; background = new BitmapTexture(new Bg().bitmapData); addChild(new AwayStats(this)); // Init 3D initLights(); initModels(); cameraController = new HoverController(camera, null, 135, 5, 1100, -70, 70); // Init Listener addEventListener(Event.ENTER_FRAME, enterFrameHandler); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener(Event.RESIZE, stage_resizeHandler); stage_resizeHandler(null); } private function initLights():void { light = new PointLight(); light.x = 15000; light.z = 15000; light.color = 0xFFFFFF; light.ambient = 0.9; lightPicker = new StaticLightPicker([light]); scene.addChild(light); } private function initModels():void { // setup custom bitmap material var materialEarth:TextureMaterial = new TextureMaterial(new BitmapTexture(new Diffuse().bitmapData)); materialEarth.normalMap = new BitmapTexture(new Normal().bitmapData); materialEarth.specularMap = new BitmapTexture(new Specular().bitmapData); materialEarth.lightPicker = lightPicker; materialEarth.gloss = 20; materialEarth.specular = 2; materialEarth.ambientColor = 0x001118; materialEarth.ambient = 1; // create subscattering diffuse method var subsurfaceMethod:SubsurfaceScatteringDiffuseMethod = new SubsurfaceScatteringDiffuseMethod(); subsurfaceMethod.scatterColor = 0x3399FF; subsurfaceMethod.scattering = .1; subsurfaceMethod.translucency = 4; materialEarth.diffuseMethod = subsurfaceMethod; // create fresnel specular method materialEarth.specularMethod = new FresnelSpecularMethod(true); // materialEarth.specular = 1; // materialEarth.diffuseMethod = new BasicDiffuseMethod(); // materialEarth.specularMethod = new BasicSpecularMethod(); meshEarth = new Mesh(new SphereGeometry(500, 64, 48), materialEarth); meshEarth.rotationY = 0; scene.addChild(meshEarth); var materialCld:TextureMaterial = new TextureMaterial(new BitmapTexture(new CloudImg().bitmapData)); materialCld.alphaBlending = true; materialCld.alpha = 0.9; materialCld.lightPicker = lightPicker; materialCld.gloss = 5; materialCld.specular = 3; materialCld.ambientColor = 0x000000; materialCld.ambient = 1; meshCould = new Mesh(new SphereGeometry(501, 64, 48), materialCld); meshEarth.addChild(meshCould); } private function mouseDownHandler(event:MouseEvent):void { lastPanAngle = cameraController.panAngle; lastTiltAngle = cameraController.tiltAngle; lastMouseX = stage.mouseX; lastMouseY = stage.mouseY; move = true; stage.addEventListener(Event.MOUSE_LEAVE, mouseUpHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); Mouse.cursor = MouseCursor.HAND; } private function mouseUpHandler(event:MouseEvent):void { move = false; stage.removeEventListener(Event.MOUSE_LEAVE, mouseUpHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); Mouse.cursor = MouseCursor.AUTO; } private function enterFrameHandler(event:Event):void { if (move) { cameraController.panAngle = 0.03 * (stage.mouseX - lastMouseX) + lastPanAngle; cameraController.tiltAngle = 0.03 * (stage.mouseY - lastMouseY) + lastTiltAngle; } meshEarth.rotationY -= 0.05; meshCould.rotationY -= 0.001; light.x = Math.sin(getTimer() / 10000) * 150000; light.y = 500; light.z = Math.cos(getTimer() / 10000) * 150000; render(); } private function stage_resizeHandler(event:Event):void { this.width = stage.stageWidth; this.height = stage.stageHeight; } } }