使用Away3d实现模型的粒子化

三维粒子 everyinch 7617℃ 0评论

项目源文件下载

1package {
2    import away3d.animators.*;
3    import away3d.animators.data.*;
4    import away3d.animators.nodes.*;
5    import away3d.containers.*;
6    import away3d.controllers.*;
7    import away3d.core.base.*;
8    import away3d.debug.*;
9    import away3d.entities.*;
10    import away3d.events.AssetEvent;
11    import away3d.library.assets.AssetType;
12    import away3d.lights.PointLight;
13    import away3d.loaders.Loader3D;
14    import away3d.loaders.misc.AssetLoaderContext;
15    import away3d.loaders.parsers.AWD2Parser;
16    import away3d.loaders.parsers.Parsers;
17    import away3d.materials.*;
18    import away3d.materials.lightpickers.StaticLightPicker;
19    import away3d.primitives.*;
20    import away3d.textures.BitmapTexture;
21    import away3d.tools.helpers.*;
22    import away3d.utils.*;
23 
24    import flash.display.*;
25    import flash.events.*;
26    import flash.geom.*;
27    import flash.utils.Timer;
28 
29    [SWF(backgroundColor="#000000", frameRate="60")]
30    public class Away3d_Particles4 extends Sprite{
31        [Embed(source="House/head.awd",mimeType="application/octet-stream")]
32        public static var HouseModel:Class;
33 
34        [Embed(source="House/head_diffuse.jpg")]
35        public static var HouseTexture:Class;
36 
37        private var view:View3D;
38        private var cameraController:HoverController;
39 
40        private var data:Vector.<Vector3D>;
41        private const SIZE:int = 2;
42        private const TIME:int = 10000;
43        private var state:int;
44        private var mesh:Mesh;
45 
46        private var light:PointLight;
47        private var lightPicker:StaticLightPicker;
48        private var particleAnimator:ParticleAnimator
49 
50        private var move:Boolean = false;
51        private var lastPanAngle:Number;
52        private var lastTiltAngle:Number;
53        private var lastMouseX:Number;
54        private var lastMouseY:Number;
55        private var angle:Number = 0;
56 
57        public function Away3d_Particles4(){
58            stage.scaleMode = StageScaleMode.NO_SCALE;
59            stage.align = StageAlign.TOP_LEFT;
60 
61            view = new View3D();
62            addChild(view);
63 
64            cameraController = new HoverController(view.camera, null, 45, 20, 1000,5);
65 
66            addChild(new AwayStats(view));
67 
68            initLights();
69            loadModel();
70 
71            addEventListener(Event.ENTER_FRAME, onEnterFrame);
72            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
73            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
74            stage.addEventListener(Event.RESIZE, onResize);
75            onResize();
76 
77        }
78 
79        private function loadModel():void{
80            Parsers.enableAllBundled();
81 
82            var loader:Loader3D = new Loader3D();
83            var assetLoaderContext:AssetLoaderContext = new AssetLoaderContext();
84            assetLoaderContext.mapUrlToData("nullg0.jpg",new HouseTexture());
85 
86            loader.x = 0;
87            loader.y = 0;
88            loader.z = 0;
89            loader.rotationY = 0;
90            loader.scale(1);
91            loader.addEventListener(AssetEvent.ASSET_COMPLETE,onAssetComplete(name));
92            loader.loadData(new HouseModel(),assetLoaderContext,null,new AWD2Parser());
93            //view.scene.addChild(loader);
94        }
95 
96        private function onAssetComplete(materialName:String):Function{
97            var func:Function = function(e:AssetEvent):void{
98                if(e.asset.assetType == AssetType.MESH){
99                    mesh = e.asset as Mesh;
100                    //mesh.mouseEnabled = true;
101 
102                    initTextData();
103                    initParticles();
104 
105                    var timer:Timer = new Timer(TIME);
106                    timer.addEventListener(TimerEvent.TIMER,onTimer);
107                    timer.start();
108                    onTimer(null);
109                }
110                else if(e.asset.assetType == AssetType.MATERIAL){
111                    var _material:TextureMaterial = e.asset as TextureMaterial;
112                    _material.texture = new BitmapTexture(new HouseTexture().bitmapData);
113                    _material.lightPicker = lightPicker;
114                    _material.gloss = 185;
115                    _material.specular = 0.2;
116                }
117            }
118            return func;
119        }
120 
121        private function onTimer(e:Event):void{
122            switch (state){
123                case 0:
124                    particleAnimator.playbackSpeed = 0;
125                    particleAnimator.resetTime(0);
126                    break;
127                case 1:
128                    particleAnimator.playbackSpeed = 1;
129                    break;
130                case 2:
131                    particleAnimator.playbackSpeed = -1;
132                    break;
133            }
134            state++;
135            state %= 3;
136        }
137 
138        private function initTextData():void{
139            data = new Vector.<Vector3D>;
140            var vertices:Vector.<Number> = mesh.geometry.subGeometries[0].vertexPositionData;
141            for(var i:int = 0;i < vertices.length;i+=3){
142                var point:Vector3D = new Vector3D(vertices[i],vertices[i+1],vertices[i+2]);
143                point.scaleBy(1);
144                data.push(point);
145            }
146        }
147 
148        private function initLights():void{
149            light = new PointLight();
150            light.color = 0xffffff;
151            light.radius = 100;
152            light.ambient = 0.6;
153            light.specular = 2;
154            view.scene.addChild(light);
155            lightPicker = new StaticLightPicker([light]);
156        }
157 
158        private function initParticles():void{
159            var cube:Geometry = new CubeGeometry(SIZE,SIZE,SIZE);
160            var geometrySet:Vector.<Geometry> = new Vector.<Geometry>();
161            for (var i:int = 0; i < data.length; i++){
162                geometrySet.push(cube);
163            }
164            var particleGeometry:Geometry = ParticleGeometryHelper.generateGeometry(geometrySet);
165 
166            var particleAnimationSet:ParticleAnimationSet = new ParticleAnimationSet();
167            particleAnimationSet.addAnimation(new ParticlePositionNode(ParticlePropertiesMode.LOCAL_STATIC));
168            particleAnimationSet.addAnimation(new ParticleVelocityNode(ParticlePropertiesMode.LOCAL_STATIC));
169            particleAnimationSet.initParticleFunc = initParticleFunc;
170 
171            var material:ColorMaterial = new ColorMaterial(0xffffff);
172            material.alphaPremultiplied = true;
173            material.lightPicker = lightPicker;
174 
175            var particleMesh:Mesh = new Mesh(particleGeometry, material);
176            particleAnimator = new ParticleAnimator(particleAnimationSet);
177            particleMesh.animator = particleAnimator;
178            particleAnimator.start();
179            view.scene.addChild(particleMesh);
180        }
181 
182        private function initParticleFunc(prop:ParticleProperties):void{
183            prop.startTime = 0;
184            var degree1:Number = Math.random() * Math.PI * 2;
185            var degree2:Number = Math.random() * Math.PI * 2;
186            var r:Number = 15;
187            //设置速度
188            prop[ParticleVelocityNode.VELOCITY_VECTOR3D] = new Vector3D(r * Math.sin(degree1) * Math.cos(degree2), r * Math.cos(degree1) * Math.cos(degree2), r * Math.sin(degree2));
189            //设置位置
190            prop[ParticlePositionNode.POSITION_VECTOR3D] = data[prop.index];
191        }
192 
193        private function onEnterFrame(event:Event):void{
194            if (move){
195                cameraController.panAngle = 0.3*(stage.mouseX - lastMouseX) + lastPanAngle;
196                cameraController.tiltAngle = 0.3*(stage.mouseY - lastMouseY) + lastTiltAngle;
197            }
198            view.render();
199        }
200 
201        private function onMouseDown(event:MouseEvent):void{
202            lastPanAngle = cameraController.panAngle;
203            lastTiltAngle = cameraController.tiltAngle;
204            lastMouseX = stage.mouseX;
205            lastMouseY = stage.mouseY;
206            move = true;
207            stage.addEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
208        }
209 
210        private function onMouseUp(event:MouseEvent):void{
211            move = false;
212            stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
213        }
214 
215        private function onStageMouseLeave(event:Event):void{
216            move = false;
217            stage.removeEventListener(Event.MOUSE_LEAVE, onStageMouseLeave);
218        }
219 
220        private function onResize(event:Event = null):void{
221            view.width = stage.stageWidth;
222            view.height = stage.stageHeight;
223        }
224    }
225}
分享&收藏

转载请注明:陈童的博客 » 使用Away3d实现模型的粒子化

喜欢 (4)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
'; } if( dopt('d_footcode_b') ) echo dopt('d_footcode'); ?>