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南京的博客):