




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
粒子系统技术3D粒子系统可以产生各种各样的自然效果,像烟、火、闪光灯,也可以产生随机的和高科技风格的图形效果。可以说,粒子系统是一类令人激动又十分有趣的动画程序。它的实现方式主要需要用基于粒子系统构建的图形学、动力学以及数字艺术等多方面的知识。10.2.1粒子系统简介粒子系统主要用来实现物理模拟,比如自由落体、星空、爆炸等,或某些自然效果,比如烟雨、瀑布等。粒子系统是一些粒子的集合。它通过指定发射源,在发射粒子流的同时创建各种动画效果。在本章的代码中,粒子系统是一个对象,而发射的粒子是粒子对象,并且随时间调整粒子的属性,以控制粒子行为,然后将粒子系统作为一个整体进行绘制。粒子系统是一个相对独立的造型系统,用来创建粒子物体模拟雨、雪、灰尘、泡沫、火花和气流等。采用纹理的粒子系统可以将任何造型作为粒子,所以其表现能力也大大增强,例如可以制作成群的蚂蚁、游动的热带鱼群、吹散飞舞的蒲公英等。粒子系统主要用于表现动态的效果,与时间、速度的关系非常紧密,一般用于动画制作。10.2.2粒子系统应用经过初步总结,粒子系统常常用来表现下面的特殊效果。n雨雪:使用喷射和暴风雪粒子系统,可以创建各种雨景和雪景,在加入Wind风力的影响后可制作斜风细雨和狂风暴雪的景象。n泡沫:可以创建各种气泡、水泡效果。n爆炸和礼花:如果将一个3D造型作为发散器,粒子系统可以将它炸成碎片,加入特殊的材质和合成特技就可以制作成美丽的礼花。n群体效果:Blizzard(暴风雪)、PArray(粒子阵列)、PCloud(粒子云)和Super Spray(超级喷射)这4种粒子系统都可以用3D造型作为粒子,因此可以表现出群体效果,如人群、马队、飞蝗和乱箭等。10.2.3粒子系统属性粒子系统除自身特性外,还有一些共同的属性,这些属性并不一定要划分明确,有时是在同一个类中设定的。n Emitter(发射属性):用于发射粒子。所有的粒子都由它喷出,它的设置决定了粒子发射时的位置、面积和方向。Emitter在视图中显示为黄色,不可以被渲染。n Timing(衰减属性):控制粒子的时间参数,包括粒子产生和消失的时间、粒子存在的时间或寿命、粒子的流动速度以及加速度。n Particle-Specific Parameters(指定粒子参数):控制粒子的尺寸、速度,不同的粒子系统,其设置也不相同。n Rendering Properties(渲染特性):控制粒子在视图中、渲染时和动画中分别表现出的形态。由于粒子显示不易,所以通常以简单的点、线或交叉点来显示,而且数目也只用于操作观察之用,不用设置过多。对于渲染效果,它会按真实指定的粒子类型和数目进行着色计算。10.2.4粒子系统模型粒子系统可以说是一种基于物理模型来解决问题的方法,它的核心不是在于如何显示而是在于对粒子运行规则的提取,粒子算法才是整个系统的精华所在。一个粒子运行过程如图10-13所示,图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;/衰减private float vel=0.0f,0.0f,0.0f;/速度private float pos=0.0f,0.0f,0.0f;/位置private int color=0xffffff;/颜色public Particle()public Particle(float velocity,float position,int color)setVel(velocity);/设置初始速度setPos(position);/设置初始位置this.setColor(color);/设置初始颜色void setLife(float life)/设置生命this.life=life;float getLife()/获取生命return life;void setVel(float tvel)/设置速度System.arraycopy(tvel,0,vel,0,vel.length);float getVel()/获取速度return vel;void setPos(float tpos)/设置位置System.arraycopy(tpos,0,pos,0,pos.length);float getPos()/获取位置return pos;void setColor(int color)/设置颜色this.color=color;int getColor()/获取颜色return color;public void setDegradation(float degradation)/设置衰减this.degradation=degradation;public float getDegradation()/获取衰减return degradation;代码中的arraycopy用于复制数组。该方法认为数组是一种比较特殊的object,该复制方法比逐个赋值效率要高。该方法原型如下:public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);FireworksEffect类提供了init方法对粒子的参数进行初始化。代码如下:private float pos=0.0f,0.0f,0.0f;/初始位置(发射位置)Random rand=new Random();/随机数public void init(Particle p)p.setLife(1.0f);/设置粒子的生命p.setPos(pos);/设置粒子的位置float vel=new float3;/速度float xyvel=rand.nextFloat()*0.8f+0.2f;/rand.nextFloat()随机生成01的数p.setDegradation(xyvel/18);/设置衰减速度vel0=xyvel*trig1+rand.nextFloat()*0.125f-0.0625 f;/x方向速度vel1=xyvel*trig0+rand.nextFloat()*0.125f-0.0625 f;/y方向速度vel2=0.0f;/z方向速度p.setVel(vel);/设置粒子的速度数组int r=(int)(120*rand.nextFloat()+120;/随机生成Red颜色int g=(int)(120*rand.nextFloat()+120;/随机生成Green颜色int b=(int)(120*rand.nextFloat()+120;/随机生成Blue颜色int col=(r 16)|(g 8)|b;/融合RGB p.setColor(col);/设置粒子的颜色Particle类提供了粒子的数据结构,还需要有粒子实体。这里由FireworksEffect类创建四边形Mesh对象,其顶点结构和纹理坐标如图10-16所示。Mesh对象包含了顶点缓冲、索引缓冲和外观属性,其逻辑结构如图10-17所示。图10-16纹理坐标与顶点的对应关系图10-17粒子四边形的结构FireworksEffect类的createAlphaPlane方法创建四边形,该四边形只有位置数组和纹理坐标数组,设置外观属性为只显示正面,并且纹理和色彩进行颜色融合。创建Mesh对象的代码如下:private Mesh createAlphaPlane(String texFilename)/*顶点缓冲*/short POINTS=new short-1,-1,0,1,-1,0,1,1,0,-1,1,0;VertexArray POSITION_ARRAY=new VertexArray(POINTS.length/3,3,2);/顶点数组POSITION_ARRAY.set(0,POINTS.length/3,POINTS);short TEXCOORDS=new short0,255,255,255,255,0,0,0;VertexArray TEXCOORD_ARRAY=new VertexArray(TEXCOORDS.length/2,2,2);/纹理数组TEXCOORD_ARRAY.set(0,TEXCOORDS.length/2,TEXCOORDS);VertexBuffer vertexBuffer=new VertexBuffer();/顶点缓冲vertexBuffer.setPositions(POSITION_ARRAY,1.0f,null);/设置位置数组vertexBuffer.setTexCoords(0,TEXCOORD_ARRAY,1.0f/255.0f,null);/设置纹理数组vertexBuffer.setDefaultColor(0xffffffff);/设置默认颜色/*索引缓冲*/int INDICES=new int0,1,3,2;int LENGTHS=new int4;IndexBuffer indexBuffer=new TriangleStripArray(INDICES,LENGTHS);/索引缓冲/*外观属性*/Appearance appearance=new Appearance();PolygonMode polygonmode=new PolygonMode();polygonmode.setCulling(PolygonMode.CULL_BACK);/剔除背面appearance.setPolygonMode(polygonmode);CompositingMode compositingmode=new CompositingMode();compositingmode.setBlending(CompositingMode.ALPHA);/透明融合appearance.setCompositingMode(compositingmode);tryImage texImage=Image.createImage(texFilename);/加载纹理图片Texture2D texture=new Texture2D(new Image2D(Image2D.RGBA,texImage);/支持透明色texture.setWrapping(Texture2D.WRAP_CLAMP,Texture2D.WRAP_CLAMP);texture.setFiltering(Texture2D.FILTER_BASE_LEVEL,Texture2D.FILTER_NEAREST);texture.setBlending(Texture2D.FUNC_BLEND);appearance.setTexture(0,texture);catch(Exception e)/捕捉异常System.out.println(e);Mesh mesh=new Mesh(vertexBuffer,indexBuffer,appearance);/创建四边形对象return mesh;angle指定了焰火喷射的角度,如果是爆炸,粒子发射的角度是全向的。此外还定义了trig数组,trig0保存了角度的正弦值,trig1保存了角度的余弦值,三角值用来计算速度的x分量和y分量,如图10-18所示。图10-18发射方向的计算设置发射角度和计算三角函数值的代码如下:private int angle=90;/发射角度private float trig=1.0f,0.0f;/三角函数public void setAngle(int angle)this.angle=angle;/设置发射角度trig0=(float)Math.sin(Math.toRadians(angle);/正弦trig1=(float)Math.cos(Math.toRadians(angle);/余弦public int getAngle()return angle;在粒子系统中,粒子始终是移动的,在原有位置上加上速度在x和y方向上的偏移量(z方向上不移动),粒子的生命值减去衰减量以判断粒子是否生存,如果已经消逝则重新初始化粒子,更新粒子属性的代码如下:public void update(Particle p)float ppos=p.getPos();/获取当前位置float vel=p.getVel();/获取速度ppos0+=vel0;/x方向上移动ppos1+=vel1;/y方向上移动ppos2+=vel2;/z方向上不移动p.setLife(p.getLife()-p.getDegradation();/更新生命值if(p.getLife()-0.001f)/判断粒子是否存活init(p);/初始化粒子在更新好粒子属性后,就可以对粒子进行绘制。粒子的Alpha值随着生命值变化,从而显示逐步消隐的效果。粒子根据scale值进行缩放,并且根据粒子的当前位置对四边形进行平移。代码如下:float scale=0.1f;/缩放值Transform trans=new Transform();/变换矩阵public void render(Particle p,Graphics3D g3d)int alpha=(int)(255*p.getLife();/Alpha值int color=p.getColor()|(alpha 24);/RGBA颜色mesh.getVertexBuffer().setDefaultColor(color);/设置四边形的颜色trans.setIdentity();trans.postScale(scale,scale,scale);/缩放float pos=p.getPos();trans.postTranslate(pos0,pos1,pos2);/平移g3d.render(mesh,trans);/根据变换矩阵绘制四边形FireworksEffect类的构造方法比较简单,主要是设置发射角度,调用createAlphaPlane方法创建四边形粒子,代码如下:public FireworksEffect(int angle)setAngle(angle);/设置发射角度mesh=createAlphaPlane(/particle.png);/创建四边形Particle类保存了粒子的方位速度等抽象信息,FireworksEffect类用来创建、更新粒子,ParticleSystem类将两者连接并进行管理,该类代码比较简单,主要调用FireworksEffect类的init方法对Particle实例进行初始化,并调用FireworksEffect类的更新和绘制方法,该类是粒子系统的内部管理类,代码如下:import javax.microedition.m3g.Graphics3D;public class ParticleSystemprivate FireworksEffect effect=null;/粒子效果Particle parts=null;/粒子数组public ParticleSystem(FireworksEffect effect,int num)setEffect(effect);/设置粒子效果parts=new Particlenum;/根据数量创建粒子数组for(int i=0;i num;i+)parts=new Particle();effect.init(parts);/根据粒子效果的内容初始化粒子数组,部分数据采用随机生成public void emit(Graphics3D g3d)for(int i=0;i parts.length;i+)getEffect().update(parts);/更新粒子信息getEffect().render(parts,g3d);/绘制粒子public void setEffect(FireworksEffect effect)this.effect=effect;public FireworksEffect getEffect()return effect;在游戏画布的run方法中将接收键盘事件,并根据键盘输入调整粒子的发射角度。public void run()while(true)tryint keys=getKeyStates();/获取键盘输入if(keys&GameCanvas.LEFT_PRESSED)!=0)/左键按下keyLEFT=true;else keyLEFT=false;if(keys&GameCanvas.RIGHT_PRESSED)!=0)/右键按下keyRIGHT=true;else keyRIGHT=false;tryg3d.bindTarget(g,true,Graphics3D.ANTIALIAS|Graphics3D.TRUE_COLOR|Graphics3D.DITHER);g3d.clear(back);/用背景对象清空深度缓冲g3d.setCamera(camera,identity);/设置摄影机if(ps=null)effect=new FireworksEffect(90);/创建粒子效果对象,发射角度为90,正上方ps=new ParticleSystem(effect,30);/创建包含30个粒子的粒子系统ps.emit(g3d);/更新粒子,并绘制粒子if(keyLEFT)effect.setAngle(effect.getAngle()+5);/更改粒子的发射角度if(keyRIGHT)effect.setAngle(effect.getAngle()-5);catch(Exception e)e.printStackTrace();finallyg3d.releaseTarget();flushGraphics();/刷新屏幕tryThread.sleep(30);catch(Exception e)/休眠30mscatch(Exception e)e.printStackTrace();编译、运行程序,其结果如图10-19所示。图10-19焰火粒子系统10.2.6爆炸粒子系统游戏中经常使用到爆炸特效,爆炸可以使用单纯的图片回放,也可以用程序仿真爆炸的物理过程,这样爆炸效果更加逼真。使用粒子系统对爆炸进行模拟的基本原理是用大量粒子对爆炸的流体力学原理进行模拟。在爆炸效果的运动过程中,一开始它是将各种块状物体在一瞬间由一个圆心向外围圆周的任意方向拓展,形成一个爆炸最初期的现象,如图10-20所示。图10-20圆形爆炸示意要营造爆炸粒子系统,可以在上面的焰火喷射的基础上加以改动,将粒子向单一方向发射改为向四面八方喷射,这点可以通过改变例子在x方向和y方向上的增量实现。在ParticleSystem类的构造方法中,将根据粒子的数量对360圆周角进行划分,并在粒子效果初始化粒子时,将该角度传递给初始化方法,当然也可以根据粒子数目在360内随机生成发射角度。代码如下:public ParticleSystem(ExplosionEffect effect,int num)setEffect(effect);parts=new Particlenum;/根据指定个数构造粒子数组for(int i=0;i num;i+)parts=new Particle();effect.init(parts,360*i/num);/初始化粒子,并计算粒子的发射角度在知道发射角度之后,x和y方向的偏移量就可以依次推算出,爆炸过程如果过于规则,会显得不真实,因此还增加了一些随机效果,x和y方向上的速度代码如下:vel0=xyvel*(float)Math.cos(Math.toRadians(angle)+rand.nextFloat()*0.125f-0.0625 f;vel1=xyvel*(float)Math.sin(Math.toRadians(angle)+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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 路灯节能改造工程实施方案(参考范文)
- 2023国培个人研修计划
- 《感恩父母》演讲稿(15篇)
- 科技企业孵化器建设可行性研究报告(范文参考)
- 教育营养配餐项目规划设计方案
- 航空航天装备研发项目可行性研究报告(参考范文)
- 工业遗产活化利用项目实施方案(范文参考)
- 大班安全教育防火知多少
- 新疆维吾尔自治区乌鲁木齐市第97中学(金英外国语学校)2022-2023学年高一上学期期中政治含解析
- 江苏省徐州市铜山区2023-2024学年高一上学期期中考试物理含解析
- 新航道托福雅思培训班
- 数车实训图纸
- 1小学英语教师面试:听力课SpecialdaysinApril全英文教案及试讲逐字稿
- 人教版小学数学一年级下册期末黄冈测试卷(三)
- GB/T 38058-2019民用多旋翼无人机系统试验方法
- GB/T 35354-2017船舶和海上技术大型游艇甲板起重机和登船梯强度要求
- 湖南省2023年普通高等学校对口招生考试电子电工
- 阅读训练,(数句子)
- GA/T 1498-2018法庭科学剪切工具痕迹检验规范
- 机械效率水平滑轮无答案
- 新疆乌鲁木齐天山区2023年中考化学猜题卷(含答案解析)
评论
0/150
提交评论