粒子系统原理word版.docx

上传人:b****1 文档编号:2297073 上传时间:2022-10-28 格式:DOCX 页数:33 大小:73.07KB
下载 相关 举报
粒子系统原理word版.docx_第1页
第1页 / 共33页
粒子系统原理word版.docx_第2页
第2页 / 共33页
粒子系统原理word版.docx_第3页
第3页 / 共33页
粒子系统原理word版.docx_第4页
第4页 / 共33页
粒子系统原理word版.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

粒子系统原理word版.docx

《粒子系统原理word版.docx》由会员分享,可在线阅读,更多相关《粒子系统原理word版.docx(33页珍藏版)》请在冰豆网上搜索。

粒子系统原理word版.docx

粒子系统原理word版

粒子系统原理

粒子系统几乎是每个引擎中比不可少的部分,它主要用来解决由大量按一定规则运动(变化)的微小物质组成的大物质,在计算机上的生成与显示的问题。

经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。

如图8-1,8-2他们都是由粒子系统来完成的。

图8-1SimplePhysicsParticles1.0中的截图

图8-2由粒子系统完成的爆炸等效果

通过上面的两幅图我们可以看出,其实粒子系统是一种特效发生器,它可以制造大量的小粒子来达到某种特殊的效果,比如烟雾、火焰或者爆炸。

好的粒子效果甚至比渲染好的动画都出色,正因为如此,当前几乎所有的游戏中都使用了粒子系统。

为了制造真实的粒子效果,粒子发生器必须在不影响帧率的情况下控制成千上万的粒子运动。

简单的粒子系统只允许设置粒子的一些属性,比如生存时间、重力或者颜色;复杂的粒子系统允许为每个粒子的运动函数编写代码。

一些粒子系统也包含了光线生成器来创建光线或者轨迹。

粒子系统基本原理

粒子系统是采用大量的、具有一定生命和属性的微小粒子图元作为基本元素来描述不规则的模糊物体。

在粒子系统中,每一个粒子图元均具有:

形状、大小、颜色、透明度、运动速度和运动方向、生命周期等属性。

而一个粒子究竟有什么样的属性,主要取决于粒子系统用来模拟什么。

粒子系统是动态变

化的,粒子系统的所有属性都是时间t的函数,随着时间的推移,系统中不断有新粒子的加入,旧的粒子死亡,系统中“存活”的粒子其位置及生命值亦随时间变化而变化。

随着虚拟世界时间的流逝,每个粒子都要在虚拟世界经历“产生”、“活动”和“消亡”三个阶段。

一般而言,粒子系统的绘制基本可按照以下步骤进行。

①产生新的粒子加入系统中;

②赋予每个粒子一定的属性;

③删除超过生命值上限的粒子;

④根据粒子属性的动态变化对粒子进行移动和变换;

⑤绘制并显示由有生命的粒子组成的图形。

其中第③、④、⑤步循环形成了物体的动态变化过程。

粒子系统的组成

通过前面的学习,我们知道了粒子系统中每一颗粒子他都具有自己的各种属性,因此这每一颗粒子就是一个粒子对象,所以我们的例子系统首先需要一个代表粒子的类Particle。

由于我们每一种特效都需要很多粒子来实现,这些粒子的运动方式以及发射的频率都是我们能够控制的,所以我们还需要一个用于控制粒子特效的类ParticleSystem。

综上所诉,粒子系统将由粒子(Particle)和发射器(ParticleSystem)组成。

粒子(Particle)

这里我们的粒子类Particle主要就用于表示粒子特效中的每一颗粒子,他将包括每一颗粒子的各种属性,如代码清单8-1是我们用于表示粒子对象的类Particle的实现。

代码清单8-1:

Particle

viewplaincopytoclipboardprint?

1.//粒子类  

2.public class Particle {  

3.    //位置  

4.    YFSPoint pos = YFSPoint.makeZero();  

5.    //开始位置  

6.    YFSPoint startPos = YFSPoint.makeZero();  

7.    //颜色  

8.    YFSColor4F color = new YFSColor4F();  

9.    //辅助颜色变化  

10.    YFSColor4F deltaColor = new YFSColor4F();  

11.    //尺寸和辅助尺寸变化  

12.    float size;  

13.    float deltaSize;  

14.    //自转速度,辅助自转速度  

15.    float rotation;  

16.    float deltaRotation;  

17.    //生命周期  

18.    float timeToLive;  

19.    //方向  

20.    YFSPoint direction = YFSPoint.makeZero();  

21.    //径向加速度,逃离发射原点的速度  

22.    float radialAccel;  

23.    //切线加速度,围绕发射原点旋转速度  

24.    float tangentialAccel;  

25.    //弧度...  

26.    float radian;  

27.    float radianPerSecond;  

28.    //半径...  

29.    float radius;  

30.    float deltaRadius;  

31.}  

//粒子类publicclassParticle{//位置YFSPointpos=YFSPoint.makeZero();//开始位置YFSPointstartPos=YFSPoint.makeZero();//颜色YFSColor4Fcolor=newYFSColor4F();//辅助颜色变化YFSColor4FdeltaColor=newYFSColor4F();//尺寸和辅助尺寸变化floatsize;floatdeltaSize;//自转速度,辅助自转速度floatrotation;floatdeltaRotation;//生命周期floattimeToLive;//方向YFSPointdirection=YFSPoint.makeZero();//径向加速度,逃离发射原点的速度floatradialAccel;//切线加速度,围绕发射原点旋转速度floattangentialAccel;//弧度...floatradian;floatradianPerSecond;//半径...floatradius;floatdeltaRadius;}

从代码清单8-1我们可以看出,这些成员变量实际上都是每一颗粒子所共同拥有的一些通用的属性,其中我们给每一个变量都加入了注解,这里所要说明的就是,粒子特效都是需要运动的,所以大多数数据需要一个初始值,然后还需要指定一个该值的变化范围,比如上面的radius表示粒子的半径,而deltaRadius则表示该半径可以在一个什么样的范围之内变化。

timeToLive则表示该粒子的生命周期,即粒子从激活之后到消亡这段时间,因为我们的每颗粒子都会消亡,这里我们说一下,通常一个粒子消亡之后,我们不会去释放他,而是将其标记为为激活状态,用来作为下一个将要产生的例子(去修改其属性值即可),这样就避免了重复的分配内存空间。

当然如果你确实需要释放也是可以的。

发射器(ParticleSystem)

上面我们介绍了单独的一刻粒子对象,这里我们来分析一下如何实现一个发射器,来控制每一颗粒子的发射情况,在分析这个发射器之前,我们首先看一下粒子系统一般包括哪几种?

粒子系统一般可以按照其特性分为两类:

∙ 模拟重力效果

∙以半径来进行扩散

重力效果相信不用过多的介绍了,就是通过程序来模拟物理重力效果,那么另外一种是以一个中心点,来根据所设定的半径进行扩散的粒子,因此我们首先将这两种不同的粒子通过一个enum分区开来,起定义如代码清单8-2所示。

代码清单8-2:

Mode

viewplaincopytoclipboardprint?

1.//粒子系统模式  

2.public static enum Mode {  

3.    GRAVITY,//模拟重力  

4.    RADIUS;//以半径来扩散  

5.}  

//粒子系统模式publicstaticenumMode{GRAVITY,//模拟重力RADIUS;//以半径来扩散}

稍后我们会在程序中实现这样两种粒子效果,现在大家可以思考一个问题,在我们的粒子系统中,这些微粒他们应该如何运动呢?

实际上运动就是改变这些微粒的坐标位置,那么我们可以按照坐标的位置来将粒子系统分为两种,他们分别是:

自由运动,成组运动。

每一颗粒子他可以按照自己的属性来自由的运动,当然在某些特殊需求时,我们可以将粒子分成很多组,然后对这每一组的所有粒子采用一种运动方式,那么就是我们所说的成组运动的方式,我们同样也先通过一个enum将其分别定义出来,如代码清单8-3所示。

代码青岛那8-3:

PositionType

viewplaincopytoclipboardprint?

1.//位置类型  

2.public static enum PositionType {  

3.    FREE,//自由  

4.    GROUPED;//组  

5.}  

//位置类型publicstaticenumPositionType{FREE,//自由GROUPED;//组}

其中FREE代表自由运动,GROUPED代表成组的运动。

好的,我们已经对粒子系统,也就是发射器进行了分类,下面我们来分析如何实现这个发射器呢?

这里我们将以一个通用的发射器来作为基类进行实现,具体的特殊的特效,我们可以继承自该发射器来完善,首先看一下我们这个发射器他需要包括哪些属性呢?

如代码清单8-4所示。

代码清单8-4:

ParticleSystem成员

viewplaincopytoclipboardprint?

1.//粒子系统基类  

2.public class ParticleSystem extends Node implements Node.IBlendableTextureOwner {  

3.    public static final int PARTICLE_DURATION_INFINITY = -1;  

4.    public static final int PARTICLE_START_SIZE_EQUAL_TO_END_SIZE = -1;  

5.    public static final int PARTICLE_START_RADIUS_EQUAL_TO_END_RADIUS = -1;  

6.    //是否要更新  

7.    private boolean mUpdating;  

8.    //是否激活  

9.    private boolean mActive;  

10.    //运行时间  

11.    protected float mDuration;  

12.    //流失的时间  

13.    private float mElapsed;  

14.    //所有粒子重心,(变化范围)  

15.    protected YFSPoint mCenterOfGravity;  

16.    protected YFSPoint mCenterOfGravityVar;  

17.    //角度,(变化范围)  

18.    protected float mAngle;  

19.    protected float mAngleVar;  

20.    //开始结束尺寸,(变化范围)  

21.    protected float mStartSize;  

22.    protected float mStartSiz

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1