package {
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.filters.*;
import away3d.core.base.*;
import away3d.core.math.*;
import away3d.containers.*;
import away3d.primitives.*;
import away3d.cameras.*;
import away3d.core.render.*;
import away3d.materials.*;
import away3d.core.utils.*;
import away3d.sprites.*;
import away3d.loaders.*;
import away3d.events.*;
public class SphereSatellite2 extends Sprite {
private static const ORBITAL_RADIUS:Number=150;
private static const CAMERA_ORBIT:Number=600;
private var cameraPitch:Number=60;
private var cameraYaw:Number=-60;
private var scene:Scene3D;
private var camera:Camera3D;
private var view:View3D;
private var group:ObjectContainer3D;
private var sphere:Sphere;
private var sphereA:Sphere;
private var sprite:Sprite3D;
private var swf:Swf;
private var spriteMaterial:BitmapMaterial;
private var materialBall:MovieMaterial;
[Embed(source="img/sirius.jpg")]
private var Star:Class;
[Embed(source="img/earthmask.png")] private var EarthMaskImage:Class;
private var earthMask:Bitmap = new EarthMaskImage();
public function SphereSatellite2() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP;
init3D();
initMaterials();
createscene();
addEventListener(Event.ENTER_FRAME,loop);
stage.addEventListener(MouseEvent.MOUSE_WHEEL,mouseWheel);
}
private function init3D():void {
scene=new Scene3D ;
camera=new Camera3D({zoom:25,focus:30});
setCameraPosition();
view=new View3D({scene:scene,camera:camera});
view.x=stage.stageWidth/2;
view.y=stage.stageHeight/2;
addChild(view);
}
function createscene():void {
//建立一個 View 如果一個視窗
//addChild(view=new View3D({x:400, y:100}));
//camera=new Camera3D({zoom:25,focus:30});
group = new ObjectContainer3D();
scene.addChild(group);
//建立一個球體
//sphere=new Sphere({material:new WireColorMaterial()});
//var wireframeMaterial:WireframeMaterial=new WireframeMaterial({wireColor:0x000000});
var earthMaskMaterial:BitmapMaterial = new BitmapMaterial(Cast.bitmap(earthMask));
sphere=new Sphere({material:earthMaskMaterial,radius:ORBITAL_RADIUS,segmentsW:10,segmentsH:10});
//sphere.smooth =true;
sphere.bothsides =true;
group.addChild(sphere);
var sphereMaterial:WireColorMaterial=new WireColorMaterial(0x5500FF,{wirecolor:0xFF9900});
sphereA=new Sphere({material:sphereMaterial,radius:5,segmentsW:10,segmentsH:10});
sphereA.x = ORBITAL_RADIUS;
//group.addChild(sphereA);
/*
sprite=new Sprite3D(null,5,5);
sprite.x=-ORBITAL_RADIUS;
sprite.scaling=0.005*100;
sprite.material=spriteMaterial;
//group.addSprite(sprite);
var swf = new Swf();
swf.libraryClips = ["fish"];
var fish = swf.parseGeometry(loaderInfo.bytes) as ObjectContainer3D;
fish.x = ORBITAL_RADIUS;
fish.rotationY = 90;
*/
var fish = new kk();
materialBall=new MovieMaterial(fish);
materialBall.smooth = true;
var ball;
for(var j=0; j<6; j++){
for(var i=0; i<36; i++){
ball = createPoint(ORBITAL_RADIUS+2, 10, j*10, i*10);
ball.addEventListener(MouseEvent3D.MOUSE_DOWN , clickBall);
group.addChild(ball);
}
}
//將球體加入場景
scene.addChild(group);
}
function createPoint(radius, size, angleX, angleY){
var plane = new Plane({ width:size, height:size });
plane.material = materialBall;
//plane.x = radius;
plane.y = sinRadiusAngle2H(radius, angleX);
//以高度為基準,產生第二個半徑,做為 X,Y 的計算參考
var radius2 = cosRadiusAngle2W(radius, angleX);
//以第二半徑計算水平的座標
plane.z = sinRadiusAngle2H(radius2, angleY);
plane.x = cosRadiusAngle2W(radius2, angleY);
//修正平面對向以球心
plane.rotationZ = -90+angleX;
plane.rotationX = -angleY;
plane.bothsides = true;
return plane;
}
//斜邊,仰角 求水平距離
function cosRadiusAngle2W(radius:Number,angle:Number ){
var w = radius*Math.cos(angle*Math.PI/180);
return w;
}
//求高度 水平距離和仰角求高
function tanAW2H(angle, w ):Number{
var h=w*Math.tan(angle*Math.PI/180);
return h
}
//求高度 水平距離和仰角求高
function sinRadiusAngle2H(radius:Number, angle:Number ):Number{
var h=radius*Math.sin(angle*Math.PI/180);
return h
}
function initMaterials():void {
var earthMaskMaterial:BitmapMaterial = new BitmapMaterial(Cast.bitmap(earthMask));
//earthMaskMaterial.showNormals = true;
earthMaskMaterial.smooth = true;
var star:BitmapData=Cast.bitmap(Star);
var transstar:BitmapData=new BitmapData(star.width,star.height,true);
transstar.applyFilter(star, star.rect, new Point(0,0), new ColorMatrixFilter([0, 0, 0, 0, 245, 0, 0, 0, 0, 245, 0, 0, 0, 0, 255, 0.3, 0.3, 0.3, 0, 0]));
spriteMaterial=new BitmapMaterial(transstar);
}
function clickBall(e:Event):void {
trace("clickBall");
}
function loop(event:Event):void {
var offset = 0.1;
view.camera.moveTo(sphere.x,sphere.y,sphere.z);
view.camera.rotationY=mouseX/2;
//view.camera.rotationX=-(mouseY/2);
view.camera.moveBackward(500);
group.rotationY+= offset;
//trace(mouseX, mouseY);
view.render();
}
private function setCameraPosition():void {
camera.y=CAMERA_ORBIT*Math.cos(cameraPitch*Math.PI/180);
camera.x=CAMERA_ORBIT*Math.sin(cameraPitch*Math.PI/180)*Math.cos(cameraYaw*Math.PI/180);
camera.z=CAMERA_ORBIT*Math.sin(cameraPitch*Math.PI/180)*Math.sin(cameraYaw*Math.PI/180);
// keep the camera looking at the origin
camera.lookAt(new Number3D(0, 0, 0));
}
private function mouseWheel(e:MouseEvent):void {
//trace("mouseWheel", e.delta);
camera.fov-=e.delta;
setCameraPosition();
}
}// end class
}