当前位置: 首页 > 工具软件 > Away3D > 使用案例 >

Away3D-1 模型加载与光照

祁杰
2023-12-01
  1 package 
  2 {
  3     import away3d.materials.lightpickers.StaticLightPicker;
  4     import flash.display.*;
  5     import flash.events.*;
  6     import flash.ui.*;
  7     import flash.ui.*;
  8     
  9     import away3d.*;
 10     import away3d.entities.*;
 11     import away3d.materials.*;
 12     import away3d.materials.methods.*;
 13     import away3d.primitives.*;
 14     import away3d.utils.*;
 15     import away3d.containers.*;
 16     import away3d.tools.commands.*;
 17     import away3d.events.*;
 18     import away3d.loaders.*;
 19     import away3d.loaders.parsers.*;
 20     import away3d.lights.*;
 21     /**
 22      * ...
 23      * @author HonmaMeiko
 24      */
 25     [SWF(width="600",height="400",backgroundColor="#FFFFFF", frameRate="60")]
 26     public class Main extends Sprite 
 27     {
 28         //AWD模型文件
 29         [Embed(source="model.awd",mimeType="application/octet-stream")]
 30         private static var model:Class;
 31         //地面贴图
 32         [Embed(source="plane2.jpg")]
 33         private static var plane:Class;
 34         
 35         private var view:View3D;
 36         private var loader:Loader3D;//模型加载器
 37         private var lightPicker:StaticLightPicker;//光源选择器
 38         public function Main()
 39         {
 40             Parsers.enableAllBundled();//设置允许加载Away3D所有支持的类型的模型文件,3DS,AWD等
 41             loader = new Loader3D();
 42             loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, OnLoaderComplete);//加载成功事件
 43             loader.addEventListener(LoaderEvent.LOAD_ERROR, OnLoaderError);//加载出错事件
 44             loader.loadData(new model());//加载模型文件
 45             
 46             //加载一个平面图形,用于充当地面
 47             var geo:PlaneGeometry = new PlaneGeometry(1000, 1000);
 48             var tex:TextureMaterial = new TextureMaterial(Cast.bitmapTexture(plane));
 49             var planeMesh:Mesh = new Mesh(geo, tex);//合成Mesh
 50             //设置地面网格的位置
 51             planeMesh.x = 0;
 52             planeMesh.y = 0;
 53             planeMesh.z = 0;
 54             
 55             //创建平行光光源
 56             var light:DirectionalLight = new DirectionalLight(0,-1,0);
 57             light.ambient = 0.5;//环境光
 58             light.diffuse = 0.6;//漫反射光
 59             light.castsShadows = true;//设置允许产生阴影
 60             //将平行光光源添加到光照选择器,当创建多个光源的时候,将每个光源都添加到参数的数组中,如[light,light2]
 61             lightPicker = new StaticLightPicker([light]);
 62             
 63             //设置充当地面的材质的阴影方法
 64             tex.shadowMethod = new FilteredShadowMapMethod(light);
 65             tex.lightPicker = lightPicker;//设置光源选择器
 66             tex.specular = 0;//将高光设置为0,可以使材质不出现高光现象.
 67             
 68             //将光源和网格都添加到场景中
 69             view = new View3D();
 70             view.scene.addChild(planeMesh);
 71             view.scene.addChild(light);
 72             //设置camera的位置和朝向
 73             view.camera.x = 200;
 74             view.camera.y = 200;
 75             view.camera.z = 0;
 76             view.camera.lookAt(planeMesh.position);
 77             
 78             //设置stage
 79             stage.align = StageAlign.TOP_LEFT;
 80             stage.scaleMode = StageScaleMode.NO_SCALE;
 81             stage.addChild(view);
 82             stage.addEventListener(Event.ENTER_FRAME, OnRender);
 83             stage.addEventListener(Event.RESIZE, OnResize);
 84  
85 OnResize(); 86 } 87 private function OnLoaderComplete(e:Event = null):void 88 { 89 //模型加载成功后移除监听器 90 loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, OnLoaderComplete); 91 loader.removeEventListener(LoaderEvent.LOAD_ERROR, OnLoaderError); 92 //加载成功后loader本身即可代表加载的模型,直接设置模型位置以及缩放等信息 93 loader.x = 0; 94 loader.y = 50; 95 loader.z = 0; 96 loader.scale(0.1); 97 //将模型添加到场景中 98 view.scene.addChild(loader); 99 100 101 } 102 private function OnLoaderError(e:Event = null):void 103 { 104 //加载失败后删除监听器,可在此处输出一些错误信息 105 loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, OnLoaderComplete); 106 loader.removeEventListener(LoaderEvent.LOAD_ERROR, OnLoaderError); 107 } 108 private function OnResize(e:Event = null):void 109 { 110 view.width = stage.stageWidth; 111 view.height = stage.stageHeight; 112 } 113 private function OnRender(e:Event = null):void 114 { 115 116 loader.yaw(1); 117 view.render(); 118 } 119 } 120 }
Parsers.enableAllBundled()用于使Loader3D支持MD2,MD5,AC3D,3DS,DAE,OBJ类型的模型文件,但是这样会导致生产的flash大80K左右.其中支持骨骼动画的模型类型有MD2,MD5,3DS,AWD.AWD是Away3D的专属格式,可以使用preFab来生成(AWD有AWD1和AWD2两种).模型加载是异步进行的,因此当flash执行之后一定的时间才能将模型显示出来(加载比较慢).
如果明确知道要加载的模型类型,如AWD2的模型,那么可以设置指定的解析器,设置方法有两种:
1.加载的时候改成loader.loadData(new model(),null,null,new AWD2Parser());这种方法仅对这个加载器有效.
2.将Parsers.enableAllBundled()改成AssetLibrary.enableParser(AWD2Parser);这种方法对所有加载器都有效.

Away3D支持的光源类型主要有两种:DirectionalLight(平行光光源)和PointLight(点光源).一般在使用中可能会创建多个光源,创建的光源可以是不同类型的.但是都要加入到StaticLightPicker中去.

作为产生阴影的地面的材质tex,需要添加shadowMethod并设置材质的lightPicker,之后其他的Mesh和模型就能在它上面产生阴影.如果其他的Mesh需要光照效果,只需要设置材质的lightPicker即可.
加载的模型无需进行任何设置.如果要对加载的模型进行设置,可以参考 Away3D-3 含有动画的模型的加载与设置.

最后将要使用的光源都添加到view.scene中去,否则光源无效.


结果图(其中的模型来自于leo_as南京的博客):









转载于:https://www.cnblogs.com/nightfire/articles/3052322.html

 类似资料: