2010年7月6日 星期二

Flash 載入 3D Object

Flash 載入 3D  Object















package {
import away3d.cameras.Camera3D;
import away3d.containers.*;
import away3d.core.math.Number3D;
import away3d.core.utils.Cast;
import away3d.core.base.*;
import away3d.materials.*;
import away3d.primitives.*;
import away3d.loaders.*;
import away3d.sprites.*;

import away3d.core.base.Object3D;
import away3d.events.*;

import caurina.transitions.Tweener;


import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.*;
import flash.geom.*;
import flash.filters.*;
import flash.net.*;

public class loadObj extends Sprite {


private static const ORBITAL_RADIUS:Number=150;
private static const CAMERA_ORBIT:Number=600;


private var scene:Scene3D;
private var camera:Camera3D;
private var view:View3D;

private var group:ObjectContainer3D;
private var cube:Cube;


private var doRotation:Boolean=false;
private var lastMouseX:int;
private var lastMouseY:int;
private var cameraPitch:Number=60;
private var cameraYaw:Number=-60;

private var loader:Loader3D ;
private var importObject;  //loaded object
private var spriteMaterial:BitmapMaterial;
private var spriteMesh:Mesh;
private var spriteObjects:Array = new Array();
private var sprite:Sprite3D;




[Embed(source="images/sirius.jpg")]
private var Star:Class;
//private var star:Bitmap = new star();

public function loadObj() {

// set up the stage
stage.align=StageAlign.TOP_LEFT;
stage.scaleMode=StageScaleMode.NO_SCALE;



var xmlloader:URLLoader;

xmlloader = new URLLoader();
xmlloader.addEventListener(Event.COMPLETE, xmlLoaded);
var re:URLRequest = new URLRequest("config.xml");
xmlloader.load(re);





}


function xmlLoaded(e:Event):void {
//trace('xmlLoaded!', e.target);
var xml = new XML(e.target.data);

var objName = xml.elements('object3D')[0].attribute('name');

trace(objName);

init3D();
initMaterials()
createScene(objName);
addListen();
}

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 initMaterials():void {
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);
}

private function createScene(objName:String):void {

spriteMesh = new Mesh();
spriteMesh.material=spriteMaterial;

//spriteMesh.rotate(new Number3D(1, 0, -1), 90 -Math.atan(1/Math.sqrt(2))/toRadians);
scene.addChild(spriteMesh);


loader  = Obj.load(objName,{ name:"imPortObj", scaling:1, y:0, x:0, z:0,rotationX:0, loadersize:100});
loader.addOnSuccess(onLoaderSuccess);


}


private function  onLoaderSuccess(e:Loader3DEvent):void {
trace("onLoaded", e.loader.handle);
importObject = e.loader.handle;
//trace(importObject.type);
//scene.addChild(importObject);
generateMeshPoint();
}

private function  generateMeshPoint():void {
trace("generateMeshPoint", importObject);
var size = 5;

var vertices =importObject.vertices;
var v:Vertex;
var spriteObj;
var snum;

for(var i:Number=0;i< vertices.length;i++){

v = vertices[i];

sprite=new Sprite3D(null,5,5);
sprite.x=v.x;
sprite.y=v.y;
sprite.z=v.z;
sprite.scaling=0.005*size;

//snum = i/10;
//if(!(i%12)) {
snum = i/22;
//trace(i, i%10, snum);
//}

/*randomX = Math.random() * 100 - 50;
randomY = Math.random() * 100 - 50;
randomZ = Math.random() * 100 - 50; */
spriteObj = new Sprite3DObject(sprite, sprite.x, sprite.y, sprite.z, 0, 0, 0)
spriteObjects.push(spriteObj);
//trace(sprite);
spriteMesh.addSprite(sprite);

       //Tweener.addTween(sprite, {y:20, delay:snum/2, time:2, transition:"easeOutQuad", onComplete:waveBack, onCompleteParams:[spriteObj] });

}

}


private function addListen():void {

stage.addEventListener(Event.RESIZE,onResize);
stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp);
stage.addEventListener(MouseEvent.MOUSE_WHEEL,mouseWheel);
this.addEventListener(Event.ENTER_FRAME,loop);
}
private function loop(event:Event):void {

view.render();
updateCamera();

}

// updates the camera position
private function updateCamera():void {

if (doRotation) {

// convert the change in mouse position into a change in camera angle
var dPitch:Number = (mouseY - lastMouseY) / 2;
var dYaw:Number = (mouseX - lastMouseX) / 2;

// update the camera angles
cameraPitch-=dPitch;
cameraYaw-=dYaw;
// limit the pitch of the camera
if (cameraPitch<=0) {
cameraPitch=0.1;
} else if (cameraPitch >= 180) {
cameraPitch=179.9;
}

// reset the last mouse position
lastMouseX=mouseX;
lastMouseY=mouseY;

// reposition the camera
setCameraPosition();
}

}

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));
}


// called when mouse down on stage
private function mouseDown(event:MouseEvent):void {
doRotation=true;
lastMouseX=event.stageX;
lastMouseY=event.stageY;
}

// called when mouse up on stage
private function mouseUp(event:MouseEvent):void {
doRotation=false;
}
private function mouseWheel(e:MouseEvent):void {
//trace("mouseWheel", e.delta);
camera.fov-=e.delta;
setCameraPosition();

}
// called when the window is resized
private function onResize(event:Event):void {
view.x=stage.stageWidth/2;
view.y=stage.stageHeight/2;
}


}


}

沒有留言: