3d加载人物

package  
{  
    import caurina.transitions.Tweener;  
      
    import flash.display.Bitmap;  
    import flash.display.BitmapData;  
    import flash.display.BlendMode;  
    import flash.display.Sprite;  
    import flash.events.Event;  
    import flash.events.KeyboardEvent;  
    import flash.events.MouseEvent;  
    import flash.events.ProgressEvent;  
    import flash.filters.BlurFilter;  
    import flash.filters.GlowFilter;  
    import flash.geom.ColorTransform;  
    import flash.text.TextField;  
      
    import org.papervision3d.core.math.Number3D;  
    import org.papervision3d.core.math.Quaternion;  
    import org.papervision3d.core.proto.CameraObject3D;  
    import org.papervision3d.events.FileLoadEvent;  
    import org.papervision3d.lights.PointLight3D;  
    import org.papervision3d.materials.ColorMaterial;  
    import org.papervision3d.materials.MovieMaterial;  
    import org.papervision3d.materials.utils.MaterialsList;  
    import org.papervision3d.objects.DisplayObject3D;  
    import org.papervision3d.objects.parsers.DAE;  
    import org.papervision3d.objects.primitives.Plane;  
    import org.papervision3d.objects.primitives.Sphere;  
    import org.papervision3d.view.BasicView;  
    import org.papervision3d.view.layer.util.ViewportLayerSortMode;  
 
    public class CastView extends BasicView  
    {  
 
        public var plane:Plane;  
        public var s:Sphere;  
        public var l:PointLight3D;  
        public var dae:DAE;  
        private var cloned:DAE;  
        public var sun:Sphere=new Sphere(new ColorMaterial(0xE8F471), 10, 2, 2);  
 
          
        public var shadowCaster:ShadowCaster=new ShadowCaster("shadow1", 0, BlendMode.NORMAL, 0.75, [new BlurFilter(4, 4, 2)]);  
        private var movieMaterial:MovieMaterial;  
 
        [Embed(source="dae/snakeskin.jpg")]  
        public var texture:Class;  
 
 
        [Embed(source="dae/male.png")]  
        public var cowTexture:Class;  
 
        public var ox:Number=0;  
        public var sx:Number=0;  
        public var oy:Number=0;  
        public var sy:Number=0;  
        private var rotationY:Number=0;  
        public var mouseDown:Boolean=false;  
 
        public var useSphere:Boolean=false;  
        public var cull:Boolean=false;  
        private var useShader:Boolean=true;  
 
        private var isParser:Boolean = true;  
          
        public function CastView( viewportWidth:Number=640,   
                                    viewportHeight:Number=320,   
                                    scaleToStage:Boolean=true,   
                                    interactive:Boolean=false,   
                                    cameraType:String="CAMERA3D")  
        {  
              
            super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType);  
 
            viewport.containerSprite.sortMode=ViewportLayerSortMode.INDEX_SORT;  
 
            var shadier:ColorTransform=new ColorTransform(0.46, 0.46, 0.46);  
            var movie:Sprite=new Sprite();  
            shadowCaster.setType(ShadowCaster.DIRECTIONAL);  
            var bmp:BitmapData=Bitmap(new texture()).bitmapData;  
 
            movie.graphics.beginBitmapFill(bmp, null, true);  
            movie.graphics.drawRect(0, 0, 512, 512);  
            movie.graphics.endFill();  
 
            movie.transform.colorTransform=shadier;  
 
            var movieMat:MovieMaterial=new MovieMaterial(movie, false, true, true);  
 
            plane=new Plane(movieMat, 2000, 2000, 1, 1);  
            scene.addChild(plane);  
            plane.pitch(90);  
            viewport.getChildLayer(plane).layerIndex=-100;   
            camera.y=450;  
 
            scene.addChild(sun);  
            viewport.getChildLayer(sun).filters=[new GlowFilter(0xE8F471)];  
            viewport.getChildLayer(sun).layerIndex=2000;   
              
            l=new PointLight3D();  
            l.x=0;  
            l.y=400;  
            l.z=300;  
 
            movieMaterial=new MovieMaterial(new cowTexture());  
 
            dae=new DAE();  
            var mats:MaterialsList=new MaterialsList();  
            mats.addMaterial(movieMaterial, "mat0");  
            dae.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoad);  
            dae.addEventListener(FileLoadEvent.LOAD_PROGRESS , loadProgress)  
            dae.addEventListener(FileLoadEvent.ANIMATIONS_COMPLETE , animComplete)  
              
            dae.load('dae/peopleMotion.xml', mats);  
              
            addEventListener(Event.ADDED_TO_STAGE, onStage);   
        }  
          
        private function animComplete(e:FileLoadEvent):void 
        {  
            this.removeChild(txt);  
            isParser = false;  
        }  
          
        private function loadProgress(e:FileLoadEvent):void 
        {  
            txt.text = '加载swf中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %' 
        }  
          
        private function onAnimProgress(e:ProgressEvent):void 
        {  
            txt.text = '解析xml中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %' 
        }  
          
        private var txt:TextField;  
          
        public function createDirections():void 
        {  
            txt = new TextField();  
            txt.selectable=false;  
            txt.width=400;  
            txt.height=400;  
            txt.textColor = 0xffffff  
            txt.text='解析xml中' 
            txt.x = 100 ;  
            txt.y = 100 ;  
            //t.setTextFormat(new TextFormat(font, 14, 0x606060));  
            addChild(txt);  
        }  
          
        public function onStage(e:Event):void 
        {  
            createDirections();  
        }  
          
        public function newTween():void 
        {  
            Tweener.addTween(l, { x:Math.random() * 1000 - 500,   
                                  z:Math.random() * 800 - 400,   
                                  y:Math.random() * 200 + 200,   
                                  time:Math.random() * 4 + 2,   
                                  onComplete:newTween,   
                                  delay:Math.random() * 2});  
        }  
 
 
        private function onLoad(e:Event):void 
        {  
            dae.parser.addEventListener(ProgressEvent.PROGRESS , onAnimProgress)  
            scene.addChild(dae);  
            dae.scale=2;  
            dae.yaw(360);  
            viewport.getChildLayer(dae).layerIndex=1;  
 
            newTween();  
              
            addEventListener(Event.ENTER_FRAME, tick);  
        }  
          
 
        public function tick(e:Event):void 
        {  
            sun.copyPosition(l);   
            if(isParser) return ;  
            updateCamera();  
            singleRender();  
              
            shadowCaster.invalidate();  
            shadowCaster.castModel(dae, l, plane, !useSphere, cull);   
        }  
          
        private function updateCamera():void 
        {  
            if (mouseDown)  
            {  
                sx+=(ox - viewport.containerSprite.mouseX) * 2;  
                ox=viewport.containerSprite.mouseX;  
 
                sy+=(oy - viewport.containerSprite.mouseY);  
                oy=viewport.containerSprite.mouseY;  
            }  
 
            sx*=0.94;  
            sy*=0.94;  
            rotationY+=sy / 19000;  
 
            if (rotationY > 0.6)  
            {  
                rotationY=0.6 - sy / 19000;  
                sy*=-0.6;  
 
            }  
            else if (rotationY < -0.2)  
            {  
                rotationY=-0.2 - sy / 19000;  
                sy*=-0.6;  
            }  
 
            orbit(camera, plane, "x", sx / 19000);  
            orbit(camera, plane, "y", sy / 19000);  
        }  
 
          
        public function orbit(camera:CameraObject3D, target:DisplayObject3D, dir:String="y", angle:Number=0, useAxis:Number3D=null):void 
        {  
 
            var ax:Number3D=useAxis;  
            var up:Number3D=new Number3D(camera.transform.n12, camera.transform.n22, camera.transform.n32);  
 
            if (ax == null)  
            {  
                  
                if (dir == "x")  
                {  
                    ax=up;  
                }  
                else if (dir == "y")  
                {  
                    var dif:Number3D=new Number3D(camera.x - target.x, camera.y - target.y, camera.z - target.z);  
                    ax=Number3D.cross(up, dif);  
                }  
            }  
              
            ax.normalize();  
 
            var startQuat:Quaternion=new Quaternion(camera.x - target.x, camera.y - target.y, camera.z - target.z, 0);  
            var rotQuat:Quaternion=Quaternion.createFromAxisAngle(ax.x, ax.y, ax.z, angle);  
            rotQuat.normalize();  
 
            var result:Quaternion=Quaternion.multiply(Quaternion.multiply(rotQuat, startQuat), Quaternion.conjugate(rotQuat));  
              
            camera.x=target.x + result.x;  
            camera.y=target.y + result.y;  
            camera.z=target.z + result.z;  
 
            camera.lookAt(target, up);  
        }  
          
          
          
    }  

package
{
 import caurina.transitions.Tweener;
 
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.BlendMode;
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.events.MouseEvent;
 import flash.events.ProgressEvent;
 import flash.filters.BlurFilter;
 import flash.filters.GlowFilter;
 import flash.geom.ColorTransform;
 import flash.text.TextField;
 
 import org.papervision3d.core.math.Number3D;
 import org.papervision3d.core.math.Quaternion;
 import org.papervision3d.core.proto.CameraObject3D;
 import org.papervision3d.events.FileLoadEvent;
 import org.papervision3d.lights.PointLight3D;
 import org.papervision3d.materials.ColorMaterial;
 import org.papervision3d.materials.MovieMaterial;
 import org.papervision3d.materials.utils.MaterialsList;
 import org.papervision3d.objects.DisplayObject3D;
 import org.papervision3d.objects.parsers.DAE;
 import org.papervision3d.objects.primitives.Plane;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.view.BasicView;
 import org.papervision3d.view.layer.util.ViewportLayerSortMode;

 public class CastView extends BasicView
 {

  public var plane:Plane;
  public var s:Sphere;
  public var l:PointLight3D;
  public var dae:DAE;
  private var cloned:DAE;
  public var sun:Sphere=new Sphere(new ColorMaterial(0xE8F471), 10, 2, 2);

  
  public var shadowCaster:ShadowCaster=new ShadowCaster("shadow1", 0, BlendMode.NORMAL, 0.75, [new BlurFilter(4, 4, 2)]);
  private var movieMaterial:MovieMaterial;

  [Embed(source="dae/snakeskin.jpg")]
  public var texture:Class;


  [Embed(source="dae/male.png")]
  public var cowTexture:Class;

  public var ox:Number=0;
  public var sx:Number=0;
  public var oy:Number=0;
  public var sy:Number=0;
  private var rotationY:Number=0;
  public var mouseDown:Boolean=false;

  public var useSphere:Boolean=false;
  public var cull:Boolean=false;
  private var useShader:Boolean=true;

  private var isParser:Boolean = true;
  
  public function CastView( viewportWidth:Number=640,
         viewportHeight:Number=320,
         scaleToStage:Boolean=true,
         interactive:Boolean=false,
         cameraType:String="CAMERA3D")
  {
   
   super(viewportWidth, viewportHeight, scaleToStage, interactive, cameraType);

   viewport.containerSprite.sortMode=ViewportLayerSortMode.INDEX_SORT;

   var shadier:ColorTransform=new ColorTransform(0.46, 0.46, 0.46);
   var movie:Sprite=new Sprite();
   shadowCaster.setType(ShadowCaster.DIRECTIONAL);
   var bmp:BitmapData=Bitmap(new texture()).bitmapData;

   movie.graphics.beginBitmapFill(bmp, null, true);
   movie.graphics.drawRect(0, 0, 512, 512);
   movie.graphics.endFill();

   movie.transform.colorTransform=shadier;

   var movieMat:MovieMaterial=new MovieMaterial(movie, false, true, true);

   plane=new Plane(movieMat, 2000, 2000, 1, 1);
   scene.addChild(plane);
   plane.pitch(90);
   viewport.getChildLayer(plane).layerIndex=-100;
   camera.y=450;

   scene.addChild(sun);
   viewport.getChildLayer(sun).filters=[new GlowFilter(0xE8F471)];
   viewport.getChildLayer(sun).layerIndex=2000;
   
   l=new PointLight3D();
   l.x=0;
   l.y=400;
   l.z=300;

   movieMaterial=new MovieMaterial(new cowTexture());

   dae=new DAE();
   var mats:MaterialsList=new MaterialsList();
   mats.addMaterial(movieMaterial, "mat0");
   dae.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoad);
   dae.addEventListener(FileLoadEvent.LOAD_PROGRESS , loadProgress)
   dae.addEventListener(FileLoadEvent.ANIMATIONS_COMPLETE , animComplete)
   
   dae.load('dae/peopleMotion.xml', mats);
   
   addEventListener(Event.ADDED_TO_STAGE, onStage);
  }
  
  private function animComplete(e:FileLoadEvent):void
  {
   this.removeChild(txt);
   isParser = false;
  }
  
  private function loadProgress(e:FileLoadEvent):void
  {
   txt.text = '加载swf中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %'
  }
  
  private function onAnimProgress(e:ProgressEvent):void
  {
   txt.text = '解析xml中 ' + Math.floor( e.bytesLoaded/e.bytesTotal*100 ) + ' %'
  }
  
  private var txt:TextField;
  
  public function createDirections():void
  {
   txt = new TextField();
   txt.selectable=false;
   txt.width=400;
   txt.height=400;
   txt.textColor = 0xffffff
   txt.text='解析xml中'
   txt.x = 100 ;
   txt.y = 100 ;
   //t.setTextFormat(new TextFormat(font, 14, 0x606060));
   addChild(txt);
  }
  
  public function onStage(e:Event):void
  {
   createDirections();
  }
  
  public function newTween():void
  {
   Tweener.addTween(l, { x:Math.random() * 1000 - 500,
          z:Math.random() * 800 - 400,
          y:Math.random() * 200 + 200,
          time:Math.random() * 4 + 2,
          onComplete:newTween,
          delay:Math.random() * 2});
  }


  private function onLoad(e:Event):void
  {
   dae.parser.addEventListener(ProgressEvent.PROGRESS , onAnimProgress)
   scene.addChild(dae);
   dae.scale=2;
   dae.yaw(360);
   viewport.getChildLayer(dae).layerIndex=1;

   newTween();
   
   addEventListener(Event.ENTER_FRAME, tick);
  }
  

  public function tick(e:Event):void
  {
   sun.copyPosition(l);
   if(isParser) return ;
   updateCamera();
   singleRender();
   
   shadowCaster.invalidate();
   shadowCaster.castModel(dae, l, plane, !useSphere, cull);
  }
  
  private function updateCamera():void
  {
   if (mouseDown)
   {
    sx+=(ox - viewport.containerSprite.mouseX) * 2;
    ox=viewport.containerSprite.mouseX;

    sy+=(oy - viewport.containerSprite.mouseY);
    oy=viewport.containerSprite.mouseY;
   }

   sx*=0.94;
   sy*=0.94;
   rotationY+=sy / 19000;

   if (rotationY > 0.6)
   {
    rotationY=0.6 - sy / 19000;
    sy*=-0.6;

   }
   else if (rotationY < -0.2)
   {
    rotationY=-0.2 - sy / 19000;
    sy*=-0.6;
   }

   orbit(camera, plane, "x", sx / 19000);
   orbit(camera, plane, "y", sy / 19000);
  }

  
  public function orbit(camera:CameraObject3D, target:DisplayObject3D, dir:String="y", angle:Number=0, useAxis:Number3D=null):void
  {

   var ax:Number3D=useAxis;
   var up:Number3D=new Number3D(camera.transform.n12, camera.transform.n22, camera.transform.n32);

   if (ax == null)
   {
    
    if (dir == "x")
    {
     ax=up;
    }
    else if (dir == "y")
    {
     var dif:Number3D=new Number3D(camera.x - target.x, camera.y - target.y, camera.z - target.z);
     ax=Number3D.cross(up, dif);
    }
   }
   
   ax.normalize();

   var startQuat:Quaternion=new Quaternion(camera.x - target.x, camera.y - target.y, camera.z - target.z, 0);
   var rotQuat:Quaternion=Quaternion.createFromAxisAngle(ax.x, ax.y, ax.z, angle);
   rotQuat.normalize();

   var result:Quaternion=Quaternion.multiply(Quaternion.multiply(rotQuat, startQuat), Quaternion.conjugate(rotQuat));
   
   camera.x=target.x + result.x;
   camera.y=target.y + result.y;
   camera.z=target.z + result.z;

   camera.lookAt(target, up);
  }
  
  
  
 }
}
 

猜你喜欢

转载自yeuego.iteye.com/blog/948445