在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第一个程序当中,我们创建模型的时候,要进行渲染实例化的时候,其实关键是将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模型很简单,它是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属性就可以进行播放动画了,是不是很酷呢?呵呵