Sandy引擎学习笔记:导入MD2模型

 在sandy升级到3.1的版本后,加入了支持导入md2的模型,总算进步一些。关于md2模型,按我猜测是一种动画的模型格式,sandy升级3.1版本后,才支持导入这种格式,之前可以导入3ds模型,但是效率比较差,运算大一点都难以渲染出来。关于导入的方面,其实sandy里面有专门负责外部的导入的文件类,那就是LoaderQueue类。

 

 在3.0的时候,LoaderQueue可以支持IMG BIN 的编码导入,现在我们用它来导入我们的MD2文件,使用     LoaderQueue类的时候,只要创建实例化对象就可以,如下

 

   queue = new LoaderQueue();
   queue.add( "man", new URLRequest("bauul.md2"), "BIN" );
   queue.add( "manSkin", new URLRequest("bauul.jpg"), "IMG" ); 

 

   ...............

   queue.start();//启动加载

  加载是一个队列的形式,它可以添加更多的文件。

 

  第二步:进行监听完成,监听的过程,其实是监听Event的COMPLETE事件,当加载完成后,就产生了一个事件分派。

  queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadMD2Complete );

 

  SandyEvent.QUEUE_COMPLETE 就是针对监听加载完的事情了。

 

 

 为了完成这件事情,我们要准备一下MD2的模型。通过上面的进行导入进去了。

package { import flash.display.*; import flash.events.*; import flash.geom.Point; import flash.media.Camera; import flash.net.*; import flash.utils.*; import sandy.util.*; import sandy.core.Scene3D; import sandy.core.data.*; import sandy.core.scenegraph.*; import sandy.materials.*; import sandy.materials.attributes.*; import sandy.primitive.*; import sandy.events.*; import mouseDrager; public class Example extends Sprite { private var scene:Scene3D; private var queue:LoaderQueue; private var queueSkin:LoaderQueue; private var imp:MD2; private var imp2:MD2; private var num:Number=3; private var point:Point; private var camera:Camera3D; private var md:mouseDrager; private var sprite:Sprite; private var cotain:Sprite; private var mybackground:BitmapData=new background(0,0); public function Example() { cotain=new Sprite(); addChild(cotain); var bit:Bitmap=new Bitmap(mybackground); sprite=new Sprite ; sprite.addChild(bit); addChild(sprite); queue=new LoaderQueue(); queue.add("man",new URLRequest("bauul.md2"),"BIN"); queue.add("manSkin",new URLRequest("bauul.jpg"),"IMG"); queue.addEventListener(SandyEvent.QUEUE_COMPLETE,loadMD2Complete); queue.start(); camera=new Camera3D(500,370); camera.lookAt(0,0,0); } private function loadMD2Complete(event:Event):void { var g:Group=new Group ; scene=new Scene3D("scene",cotain,camera,g); imp=new MD2("imp",queue.data["man"],2); imp.x=20; imp.y=-20; imp.z=10; imp.rotateY=-90; //md=new mouseDrager(camera,imp); //addEventListener(MouseEvent.MOUSE_DOWN,md.onMouseClick); // addEventListener(MouseEvent.MOUSE_UP,md.onMouseClick); // addEventListener(MouseEvent.MOUSE_MOVE,md.onMouseClick); // addEventListener(MouseEvent.MOUSE_OUT,md.onMouseClick); imp.appearance=new Appearance(new BitmapMaterial(queue.data["manSkin"].bitmapData)); g.addChild(imp); addEventListener(Event.ENTER_FRAME,enterFrameHandler); this.swapChildrenAt(0,1); } private function enterFrameHandler(event:Event):void { scene.render(); if (imp != null) { imp.frame+= 0.3; } //md.process(); } } }

 

Sandy引擎学习笔记:导入MD2模型_第1张图片

 

 

 

  还记得sandy第一个程序当中,我们创建模型的时候,要进行渲染实例化的时候,其实关键是将sandy的对象转换为flash DIsplayObject类对象,这样我们就可以渲染对象到flash player里面去。

 

 

总的来说,在创建一个sandy的程序,我们要创建一个Scene3D 对象,创建摄影机Camera3D(或者其他摄影机),

把对象添加到容器里面去,可以认为是Sprite类型的对象。

像scene=new Scene3D("scene",cotain,camera,g); 其中cotain是我们所创建的容器,同样如果你创建一个类继承了Sprite对象,cotain可以改成了this。

scene=new Scene3D("scene",this,camera,g);

 

我们要它的模型,添加到容器里面其实有好处,关键是我们在背景进行贴图,如果使用this指向的话,在交换深度的时候就很容易出错。

在程序当中,添加一个语句,交互深度的显示位置。就可以进行一个背景贴图了。

this.swapChildrenAt(0,1);

 

解析一下程序:

imp=new MD2("imp",queue.data["man"],2);//在3.1版本引入了常见模型,带三个参数,第一个名称,第二个二进制数据,第三个缩放

MD2(p_sName:String, data:ByteArray, scale:Number = 1)
Creates MD2 primitive.

 

创建一个MD2模型很简单,它是sandy.primitive 包下常见的模型之一,它和box一样,可以很简单的创建。

 

 

对MD2模型贴图:

imp.appearance=new Appearance(new BitmapMaterial(queue.data["manSkin"].bitmapData));

 如果后面MD2模型有贴图的话,可以进行贴图,通过queue的对象加载后,可以获取到相关的信息,进行位图贴图。

 

 最后,在渲染的时候,可以对MD2的模型进行播放

private function enterFrameHandler(event:Event):void
  {
   scene.render();
   if (imp != null)
   {
    imp.frame+= 0.3;
   }
   //md.process();
  }

 

使用它的frmae属性就可以进行播放动画了,是不是很酷呢?呵呵

 Sandy引擎学习笔记:导入MD2模型_第2张图片

 

 

 

 

 

 

 

你可能感兴趣的:(flash,3D,引擎,引擎,import,function,flash,null,string)