`

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

分享到:
评论

相关推荐

    Cesium 单独加载3D模型

    在本文中,我们将深入探讨如何使用Cesium框架来单独加载3D模型,特别是不包含地球背景的场景。Cesium是一个强大的开源JavaScript库,专为在Web浏览器中展示高精度的3D地理空间数据而设计。它广泛应用于地理信息系统...

    blender+cocos3d实现人物的运动

    在提供的文件"CC3HelloWorldHuman"中,很可能包含了一个简单的Cocos3d示例项目,演示了如何在Xcode中加载和操作3D人物。这个示例可能会有初始化人物、播放动画和响应用户交互的代码,是初学者了解3D游戏开发的好起点...

    3D人物创建示例源码201259

    3D人物创建示例源码 程序介绍: Silverlight 5和Windows Phone 7.1都已具备SL.XNA模式,这意味着我们可以在相关平台上制作高性能的3D游戏及软件产品而无需二次编码。本节,我将借助一些工具为大家讲解SL.XNA的3D...

    基于WebAR实现虚拟3D人物跳舞

    4. **加载和动画**:利用Three.js加载3D模型,设置动画关键帧或使用骨骼动画系统使人物跳舞。 5. **定位与跟踪**:结合aframe-ar.js,让3D人物根据摄像头捕获的现实环境信息进行定位,使其仿佛站在真实的地面上跳舞...

    Android3D人物行走

    在Android平台上开发3D应用,实现人物行走动画是一项复杂但有趣的技术挑战。本文将深入探讨如何利用OpenGL ES,一个在Android系统中广泛使用的图形库,来创建逼真的3D人物行走效果。 首先,我们需要理解3D图形的...

    3D人物表情

    在文件列表中,"游戏3111彭群(表情).max"可能是包含预设表情的3Dmax场景文件,艺术家可以通过加载这个文件来查看和学习已有的表情设置。而"MAXFILES.TXT"可能是一个文本文件,包含了关于3Dmax文件的相关信息,例如...

    unity3d 人物换装

    - **AssetBundle**:为了优化性能,Unity3D提供了AssetBundle功能,允许你将不常用或大型的资源(如不同服装)打包成单独的文件,在需要时动态加载。ReLoading可能就是一个AssetBundle文件,用于存储人物的不同服装...

    .pmx格式3d模型加载工具

    .pmx是MikuMikuDance(MMD)软件所采用的一种3D模型文件格式,主要用于存储三维人物、道具等模型数据。这种格式由日本公司Pony Canyon为MMD开发,以支持其用户友好的模型编辑和动画制作。在本文中,我们将深入探讨....

    3D游戏人物

    在3D游戏开发中,人物模型的创建与动画制作是一项至关重要的任务,它涉及到许多复杂的编程和艺术设计技术。这个名为“3D游戏人物”的压缩包文件很可能包含了用于创建3D游戏角色行走动画的相关源码。从描述来看,这...

    一个3D人物行走的程序

    1. **模型加载**:首先,程序需要加载3D人物模型,这通常是以OBJ、3DS或FBX等格式的文件。模型文件包含了顶点信息、纹理坐标、法线向量等数据,这些数据会被解析并存储在内存中。 2. **场景构建**:在3D空间中,...

    Opengl写的3d人物模型

    这个“Opengl写的3d人物模型”项目显然利用了OpenGL的功能来构建一个能够行走、旋转并且支持纹理贴图的三维人物模型。下面将详细介绍相关知识点。 1. **OpenGL基础知识**:OpenGL是一个跨语言、跨平台的应用程序...

    实现obj文件的加载和用鼠标旋转,可从多个角度查看用3d做的模型Java.zip

    每个文件都定义了一个3D形状,可能是人物或物体的模型。加载这些文件后,程序将使用解析的顶点、纹理坐标和面数据在屏幕上构建相应的3D形状。 关于鼠标旋转,项目很可能使用了鼠标监听器来捕捉用户的输入。当用户...

    Unity3D人物模型

    在本主题“Unity3D人物模型”中,我们将深入探讨与Unity3D中的人物模型相关的各种技术和实践。 1. **模型导入**:Unity支持多种格式的人物模型,如.fbx、.obj和.collada等。这些文件包含了3D几何体、纹理、骨骼动画...

    网狐6603人物3D桌子实现

    "网狐6603人物3D桌子实现"是一个针对特定游戏引擎——网狐6603的3D场景开发实例。网狐6603是一款流行的国产游戏引擎,它提供了丰富的功能和工具,使得开发者能够快速构建高质量的3D游戏。 在这个项目中,"3D桌子...

    three.js加载json三维模型.zip

    加载JSON模型到Three.js通常分为两个步骤:加载模型数据和创建3D对象。 1. 加载模型数据: 使用Three.js内置的`Loader`类,例如`JSONLoader`,可以异步加载JSON文件。首先,创建一个`JSONLoader`实例,然后调用其`...

    DX 3D游戏 天空,地形,雾化,公告板,人物

    在给定的压缩包文件中,"DX 3D游戏 天空,地形,雾化,公告板,人物"这一标题揭示了几个重要的知识点,包括天空盒、地形渲染、雾化效果、公告板的实现以及角色动画与摄像机控制。接下来,我们将深入探讨这些关键概念...

    posestudio动漫人物模型制作软件V1.04特别中文安装版

    pose studio动漫人物模型制作软件是一款非常牛逼专业制作动漫人物的动作模型模型的软件,可快速制作并生成3D任务模型,所...软件能够加载含有骨骼的3d模型,可读取的3D人物模型格式有FBX、LWO、LWS、OBJ、M3C(仅支持

    unity3d人物换装

    "unity3d人物换装"这个主题聚焦于在Unity3D中实现角色服装的动态更换功能,这对于创建互动性强的游戏或者虚拟体验至关重要。下面将详细阐述Unity3D中的人物换装技术及其相关知识点。 首先,人物模型在Unity3D中通常...

    unity人物模型资源包

    在这个“unity人物模型资源包”中,包含的是几个可以在Unity环境中使用的3D人物模型,分别是“挥着翅膀的女孩”、“椅子”以及“美丽的女孩”。值得注意的是,这些模型都没有附带动画,这意味着在导入Unity后,你...

    【3D模型】webGL人体3D动态模型

    在"3D人物模型"的领域中,WebGL被广泛用于创建逼真的角色动画,包括人体动作模拟。在这个"webGL_walker"项目中,开发人员可能利用骨骼动画技术来驱动人体模型的动作,这种技术是通过将3D模型的各个部分与虚拟骨骼...

Global site tag (gtag.js) - Google Analytics