《粒子系统技术》word版_第1页
《粒子系统技术》word版_第2页
《粒子系统技术》word版_第3页
《粒子系统技术》word版_第4页
《粒子系统技术》word版_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.粒子系统技术3D粒子系统可以产生各种各样的自然效果,像烟、火、闪光灯,也可以产生随机的和高科技风格的图形效果。可以说,粒子系统是一类令人冲动又非常有趣的动画程序。它的实现方式主要需要用基于粒子系统构建的图形学、动力学以及数字艺术等多方面的知识。10.2.1粒子系统简介粒子系统主要用来实现物理模拟,比方自由落体、星空、爆炸等,或某些自然效果,比方烟雨、瀑布等。粒子系统是一些粒子的集合。它通过指定发射源,在发射粒子流的同时创立各种动画效果。在本章的代码中,粒子系统是一个对象,而发射的粒子是粒子对象,并且随时间调整粒子的属性,以控制粒子行为,然后将粒子系统作为一个整体进展绘制。粒子系统是一个相对独

2、立的造型系统,用来创立粒子物体模拟雨、雪、灰尘、泡沫、火花和气流等。采用纹理的粒子系统可以将任何造型作为粒子,所以其表现才能也大大增强,例如可以制作成群的蚂蚁、游动的热带鱼群、吹散飞舞的蒲公英等。粒子系统主要用于表现动态的效果,与时间、速度的关系非常严密,一般用于动画制作。10.2.2粒子系统应用经过初步总结,粒子系统常常用来表现下面的特殊效果。n雨雪:使用喷射和暴风雪粒子系统,可以创立各种雨景和雪景,在参加Wind风力的影响后可制作斜风细雨和狂风暴雪的景象。n泡沫:可以创立各种气泡、水泡效果。n爆炸和礼花:假设将一个3D造型作为发散器,粒子系统可以将它炸成碎片,参加特殊的材质和合成特技就可以

3、制作成美丽的礼花。n群体效果:Blizzard暴风雪、PArray粒子阵列、PCloud粒子云和Super Spray超级喷射这4种粒子系统都可以用3D造型作为粒子,因此可以表现出群体效果,如人群、马队、飞蝗和乱箭等。10.2.3粒子系统属性粒子系统除自身特性外,还有一些共同的属性,这些属性并不一定要划清楚确,有时是在同一个类中设定的。n Emitter发射属性:用于发射粒子。所有的粒子都由它喷出,它的设置决定了粒子发射时的位置、面积和方向。Emitter在视图中显示为黄色,不可以被渲染。n Timing衰减属性:控制粒子的时间参数,包括粒子产生和消失的时间、粒子存在的时间或寿命、粒子的流动速

4、度以及加速度。n Particle-Specific Parameters指定粒子参数:控制粒子的尺寸、速度,不同的粒子系统,其设置也不一样。n Rendering Properties渲染特性:控制粒子在视图中、渲染时和动画中分别表现出的形态。由于粒子显示不易,所以通常以简单的点、线或穿插点来显示,而且数目也只用于操作观察之用,不用设置过多。对于渲染效果,它会按真实指定的粒子类型和数目进展着色计算。10.2.4粒子系统模型粒子系统可以说是一种基于物理模型来解决问题的方法,它的核心不是在于如何显示而是在于对粒子运行规那么的提取,粒子算法才是整个系统的精华所在。一个粒子运行过程如图10-13所示

5、,图10-14为粒子在喷泉中的应用。图10-13粒子的运行过程图10-14粒子的喷泉应用10.2.5焰火粒子系统下面将构造一个简单的焰火粒子系统。整个系统由3个类组成:Particle、FireworksEffect和ParticleSystem。它们在整个系统中的作用和逻辑关系如图10-15所示。Particle类存储了每个粒子的根本属性,包括生命、衰减、速度、位置和颜色,对于复杂的粒子还包含其他更多属性。Particle类的代码如下:public class Particleprivate float life=1.0f;/生命private float degradation=0.1f;

6、/衰减private float vel=0.0f,0.0f,0.0f;/速度private float pos=0.0f,0.0f,0.0f;/位置private int color=0xffffff;/颜色public Particlepublic Particlefloat velocity,float position,int colorsetVelvelocity;/设置初始速度setPosposition;/设置初始位置this.setColorcolor;/设置初始颜色void setLifefloat life/设置生命this.life=life;float getLife/

7、获取生命return life;void setVelfloat tvel/设置速度System.arraycopytvel,0,vel,0,vel.length;float getVel/获取速度return vel;void setPosfloat tpos/设置位置System.arraycopytpos,0,pos,0,pos.length;float getPos/获取位置return pos;void setColorint color/设置颜色this.color=color;int getColor/获取颜色return color;public void setDegrada

8、tionfloat degradation/设置衰减this.degradation=degradation;public float getDegradation/获取衰减return degradation;代码中的arraycopy用于复制数组。该方法认为数组是一种比较特殊的object,该复制方法比逐个赋值效率要高。该方法原型如下:public static void arraycopyObject src,int srcPos,Object dest,int destPos,int length;FireworksEffect类提供了init方法对粒子的参数进展初始化。代码如下:pr

9、ivate float pos=0.0f,0.0f,0.0f;/初始位置发射位置Random rand=new Random;/随机数public void initParticle pp.setLife1.0f;/设置粒子的生命p.setPospos;/设置粒子的位置float vel=new float3;/速度float xyvel=rand.nextFloat*0.8f+0.2f;/rand.nextFloat随机生成01的数p.setDegradationxyvel/18;/设置衰减速度vel0=xyvel*trig1+rand.nextFloat*0.125f-0.0625 f;/

10、x方向速度vel1=xyvel*trig0+rand.nextFloat*0.125f-0.0625 f;/y方向速度vel2=0.0f;/z方向速度p.setVelvel;/设置粒子的速度数组int r=int120*rand.nextFloat+120;/随机生成Red颜色int g=int120*rand.nextFloat+120;/随机生成Green颜色int b=int120*rand.nextFloat+120;/随机生成Blue颜色int col=r 16|g 8|b;/交融RGB p.setColorcol;/设置粒子的颜色Particle类提供了粒子的数据构造,还需要有粒子

11、实体。这里由FireworksEffect类创立四边形Mesh对象,其顶点构造和纹理坐标如图10-16所示。Mesh对象包含了顶点缓冲、索引缓冲和外观属性,其逻辑构造如图10-17所示。图10-16纹理坐标与顶点的对应关系图10-17粒子四边形的构造FireworksEffect类的createAlphaPlane方法创立四边形,该四边形只有位置数组和纹理坐标数组,设置外观属性为只显示正面,并且纹理和色彩进展颜色交融。创立Mesh对象的代码如下:private Mesh createAlphaPlaneString texFilename/*顶点缓冲*/short POINTS=new sho

12、rt-1,-1,0,1,-1,0,1,1,0,-1,1,0;VertexArray POSITION_ARRAY=new VertexArrayPOINTS.length/3,3,2;/顶点数组POSITION_ARRAY.set0,POINTS.length/3,POINTS;short TEXCOORDS=new short0,255,255,255,255,0,0,0;VertexArray TEXCOORD_ARRAY=new VertexArrayTEXCOORDS.length/2,2,2;/纹理数组TEXCOORD_ARRAY.set0,TEXCOORDS.length/2,TE

13、XCOORDS;VertexBuffer vertexBuffer=new VertexBuffer;/顶点缓冲vertexBuffer.setPositionsPOSITION_ARRAY,1.0f,null;/设置位置数组vertexBuffer.setTexCoords0,TEXCOORD_ARRAY,1.0f/255.0f,null;/设置纹理数组vertexBuffer.setDefaultColor0xffffffff;/设置默认颜色/*索引缓冲*/int INDICES=new int0,1,3,2;int LENGTHS=new int4;IndexBuffer indexBu

14、ffer=new TriangleStripArrayINDICES,LENGTHS;/索引缓冲/*外观属性*/Appearance appearance=new Appearance;PolygonMode polygonmode=new PolygonMode;polygonmode.setCullingPolygonMode.CULL_BACK;/剔除反面appearance.setPolygonModepolygonmode;CompositingMode compositingmode=new CompositingMode;compositingmode.setBlendingCo

15、mpositingMode.ALPHA;/透明交融appearance.setCompositingModecompositingmode;tryImage texImage=Image.createImagetexFilename;/加载纹理图片Texture2D texture=new Texture2Dnew Image2DImage2D.RGBA,texImage;/支持透明色texture.setWrappingTexture2D.WRAP_CLAMP,Texture2D.WRAP_CLAMP;texture.setFilteringTexture2D.FILTER_BASE_LEV

16、EL,Texture2D.FILTER_NEAREST;texture.setBlendingTexture2D.FUNC_BLEND;appearance.setTexture0,texture;catchException e/捕捉异常System.out.printlne;Mesh mesh=new MeshvertexBuffer,indexBuffer,appearance;/创立四边形对象return mesh;angle指定了焰火喷射的角度,假设是爆炸,粒子发射的角度是全向的。此外还定义了trig数组,trig0保存了角度的正弦值,trig1保存了角度的余弦值,三角值用来计算速度

17、的x分量和y分量,如图10-18所示。图10-18发射方向的计算设置发射角度和计算三角函数值的代码如下:private int angle=90;/发射角度private float trig=1.0f,0.0f;/三角函数public void setAngleint anglethis.angle=angle;/设置发射角度trig0=floatMath.sinMath.toRadiansangle;/正弦trig1=floatMath.cosMath.toRadiansangle;/余弦public int getAnglereturn angle;在粒子系统中,粒子始终是挪动的,在原有

18、位置上加上速度在x和y方向上的偏移量z方向上不挪动,粒子的生命值减去衰减量以判断粒子是否生存,假设已经消逝那么重新初始化粒子,更新粒子属性的代码如下:public void updateParticle pfloat ppos=p.getPos;/获取当前位置float vel=p.getVel;/获取速度ppos0+=vel0;/x方向上挪动ppos1+=vel1;/y方向上挪动ppos2+=vel2;/z方向上不挪动p.setLifep.getLife-p.getDegradation;/更新生命值ifp.getLife-0.001f/判断粒子是否存活initp;/初始化粒子在更新好粒子属

19、性后,就可以对粒子进展绘制。粒子的Alpha值随着生命值变化,从而显示逐步消隐的效果。粒子根据scale值进展缩放,并且根据粒子的当前位置对四边形进展平移。代码如下:float scale=0.1f;/缩放值Transform trans=new Transform;/变换矩阵public void renderParticle p,Graphics3D g3dint alpha=int255*p.getLife;/Alpha值int color=p.getColor|alpha 24;/RGBA颜色mesh.getVertexBuffer.setDefaultColorcolor;/设置四边

20、形的颜色trans.setIdentity;trans.postScalescale,scale,scale;/缩放float pos=p.getPos;trans.postTranslatepos0,pos1,pos2;/平移g3d.rendermesh,trans;/根据变换矩阵绘制四边形FireworksEffect类的构造方法比较简单,主要是设置发射角度,调用createAlphaPlane方法创立四边形粒子,代码如下:public FireworksEffectint anglesetAngleangle;/设置发射角度mesh=createAlphaPlane"/part

21、icle.png";/创立四边形Particle类保存了粒子的方位速度等抽象信息,FireworksEffect类用来创立、更新粒子,ParticleSystem类将两者连接并进展管理,该类代码比较简单,主要调用FireworksEffect类的init方法对Particle实例进展初始化,并调用FireworksEffect类的更新和绘制方法,该类是粒子系统的内部管理类,代码如下:import javax.microedition.m3g.Graphics3D;public class ParticleSystemprivate FireworksEffect effect=nul

22、l;/粒子效果Particle parts=null;/粒子数组public ParticleSystemFireworksEffect effect,int numsetEffecteffect;/设置粒子效果parts=new Particlenum;/根据数量创立粒子数组forint i=0;i num;i+parts=new Particle;effect.initparts;/根据粒子效果的内容初始化粒子数组,部分数据采用随机生成public void emitGraphics3D g3dforint i=0;i parts.length;i+getEffect.updatepart

23、s;/更新粒子信息getEffect.renderparts,g3d;/绘制粒子public void setEffectFireworksEffect effectthis.effect=effect;public FireworksEffect getEffectreturn effect;在游戏画布的run方法中将接收键盘事件,并根据键盘输入调整粒子的发射角度。public void runwhiletruetryint keys=getKeyStates;/获取键盘输入ifkeys&GameCanvas.LEFT_PRESSED!=0/左键按下keyLEFT=true;else

24、 keyLEFT=false;ifkeys&GameCanvas.RIGHT_PRESSED!=0/右键按下keyRIGHT=true;else keyRIGHT=false;tryg3d.bindTargetg,true,Graphics3D.ANTIALIAS|Graphics3D.TRUE_COLOR|Graphics3D.DITHER;g3d.clearback;/用背景对象清空深度缓冲g3d.setCameracamera,identity;/设置摄影机ifps=nulleffect=new FireworksEffect90;/创立粒子效果对象,发射角度为90°,

25、正上方ps=new ParticleSystemeffect,30;/创立包含30个粒子的粒子系统ps.emitg3d;/更新粒子,并绘制粒子ifkeyLEFTeffect.setAngleeffect.getAngle+5;/更改粒子的发射角度ifkeyRIGHTeffect.setAngleeffect.getAngle-5;catchException ee.printStackTrace;finallyg3d.releaseTarget;flushGraphics;/刷新屏幕tryThread.sleep30;catchException e/休眠30mscatchException

26、ee.printStackTrace;编译、运行程序,其结果如图10-19所示。图10-19焰火粒子系统10.2.6爆炸粒子系统游戏中经常使用到爆炸特效,爆炸可以使用单纯的图片回放,也可以用程序仿真爆炸的物理过程,这样爆炸效果更加逼真。使用粒子系统对爆炸进展模拟的根本原理是用大量粒子对爆炸的流体力学原理进展模拟。在爆炸效果的运动过程中,一开场它是将各种块状物体在一瞬间由一个圆心向外围圆周的任意方向拓展,形成一个爆炸最初期的现象,如图10-20所示。图10-20圆形爆炸示意要营造爆炸粒子系统,可以在上面的焰火喷射的根底上加以改动,将粒子向单一方向发射改为向四面八方喷射,这点可以通过改变例子在x方

27、向和y方向上的增量实现。在ParticleSystem类的构造方法中,将根据粒子的数量对360°圆周角进展划分,并在粒子效果初始化粒子时,将该角度传递给初始化方法,当然也可以根据粒子数目在360°内随机生成发射角度。代码如下:public ParticleSystemExplosionEffect effect,int numsetEffecteffect;parts=new Particlenum;/根据指定个数构造粒子数组forint i=0;i num;i+parts=new Particle;effect.initparts,360*i/num;/初始化粒子,并计算

28、粒子的发射角度在知道发射角度之后,x和y方向的偏移量就可以依次推算出,爆炸过程假设过于规那么,会显得不真实,因此还增加了一些随机效果,x和y方向上的速度代码如下:vel0=xyvel*floatMath.cosMath.toRadiansangle+rand.nextFloat*0.125f-0.0625 f;vel1=xyvel*floatMath.sinMath.toRadiansangle+rand.nextFloat*0.125f-0.0625 f;在其他代码不变的情况下,运行程序,粒子向四面八方发射,模拟了实际中的爆炸效果,如图10-21所示。如今已经可以做出控制粒子爆炸运动的根本模型,除此之外,可以在每一个粒子运动的过程中加上一个产生加速度的力,而这个力在爆炸瞬间的力量是最大的,所以粒子的加速度会由快变到慢。图10-21粒子系统的爆炸效果重力在空间中是一个向

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论