3D粒子的排列和分散

 

在这里先介绍一个十分好用的loader类—BulkLoader,这是它的API文档。它能把管理所有需要加载的文件,并支持多种加载类型,加载后可以直接从类中得到各类型的实例,十分方便。这里有官方的一个使用例子。

Code

 

回到正题,我们看看如何实现粒子的散落效果。首先我们在3D场景添加一块地板

var cm:ColorMaterial = new ColorMaterial(0x2121211);
floor 
= new Plane(cm, 1100110011);
floor.rotationX 
= 90;
floor.y 
= -550;
scene.addChild(floor);

 

然后添加粒子阵,damp属性为碰撞后质量损失的值

pixels = new MotionPixels(bfx, floor);
pixels.damp 
= 0.4;
scene.addChild(pixels);

 

在这个粒子阵里添加粒子

            var offsetX:int = int(bmd.width * .5 * intervalIn / intervalOut);
            var offsetY:
int = int(bmd.height * .5 * intervalIn / intervalOut);
            var m:
int = 0, n:int = 0;
            
for (var i:int = bmd.height; i > 0; i -= intervalOut)
            {
                
for (var j:int = 0; j < bmd.width; j += intervalOut)
                {
                    var color:
uint = bmd.getPixel32(j, i);
                    
if (color > 0) pixels.addPixel3D(new MotionPixel(color, n - offsetX, m - offsetY, 0));
                    n 
+= intervalIn;
                }
                n 
= 0;
                m 
+= intervalIn;
            }

 

我们看看这个MotionPixel类

        public function MotionPixel(color:uint, x:Number=0, y:Number=0, z:Number=0)
        {
            super(color, x, y, z);
            
            weight 
= int(Math.random() * 35 + 5);
            
            radomXYZ();
            
            sx 
= x;
            sy 
= y;
            sz 
= z;
        }
        
        
public function radomXYZ():void
        {
            vx 
= int(Math.random() * 60 - 30);
            vy 
= 0;
            vz 
= int(Math.random() * 60 - 30);
        }

在构造函数里,每个粒子都拥有初始位置,初始速度和重量。设置X和Z的初始速度目的为了有“分散”的效果,总不能让粒子都落在一条直线上吧。而重量则是决定在粒子Y方向速度的因素。

 

我们看看最重要的一个类MotionPixels类。里面包括了所有粒子的分散和聚合算法。有深入了解PV3D的朋友都知道所有继承了DisplayObject3D类的子类都可以override project方法。这个方法是pv3d里面重要的渲染方法之一。我们在这里面加上两个函数,让粒子在渲染到屏幕之前进行排列。

Code

 

我大概说一下算法的原理,由于粒子拥有初速度vx0,vy0,vz0,其中vx0,vz0我们不用改变,它们是粒子能够分散到四周的重要条件。看看vy0,初速度我为0,假设粒子和地板之间的距离为d,有这样一个公式vy -= dy * p.weight * .004,当距离越远,加速度就越大,这个不难理解。当粒子和地板发生碰撞,也就是d=0的时候,vy改变方向:vy *= -1。并且vx,vy,vz都会损失速度vx *= _damp,vy *= _damp;vz *= _damp;。直到vx=vy=vz=0,粒子停止运动。当所有粒子停止运动后,获得下一张图片的象素位置和颜色,改变现有粒子的初始位置和颜色一致。然后从现在的位置返回到初始位置组成了一个新的图案。

 

如何你有任何意见和建议,欢迎和本人交流。

 

Preview:http://niuniuzhu.cn/p/PixelsRank

posted @ 2008-08-25 10:56 牛牛猪 阅读(...) 评论(...) 编辑 收藏