opengl粒子系统统一性中通常会有一个尾巴粒子的属性,它有什么作用?

  【摘 要】虚拟场景中的自然景物模拟已经成为计算机图形学的一个研究热点使用粒子系统能够相对充分地体现自然景观中模糊物体的随机性和动态性,得到良好的模拟效果本文结合实际情况,在深入分析粒子系统理论基础上结合Windows XP和Microsoft simulatons of nature sceneries fountains.
  本文重点研究了OpenGL 三维图形开发一些关键技术的实现方法与步驟。通过OpenGL 与VC++6.0 编程开发实现了三维喷泉场景模型的一个实例在实例中综合运用灯光、材质及纹理效果构造了一个逼真的三维喷泉场景模型場景,并实现了一些常用的交互操作功能
  1 喷泉粒子的属性具体分析
  下面,将结合喷泉模型来介绍喷泉粒子的各个属性:
  (1)喷泉粒子的空间位置属性
  喷泉粒子系统中所模拟的喷泉具有特定的位置并非要布满整个可视区域。日常生活中我们所看见的喷泉通常都是往上喷出并以抛物线的形式喷射。因此喷泉所喷射出的每一颗粒子都是相对均匀的分布在一个圆柱体的内。喷泉的喷头一开始喷射出来的是竖直向上的水柱因此需要通过相应的算法在VC++6.0平台上利用OpenGL的代码 将喷泉粒子初始化,并且分布设定的圆柱体内为了使粒孓产生的位置看起来是从同一个一个中心点喷出的,设定的圆柱体的轴心必须与显示空间的y轴平行喷泉粒子分布如图1所示。
  (2)喷灥粒子的运动属性
  喷泉的水柱通常是从喷头里面垂直向上的喷出来的但是每一颗粒子在虚拟系统里面又是需要配置相应的重力属性,这要它才能够像现实中的水粒子受到重力的作用,落到地面每颗粒子从喷头喷射出都做自由落体运动,直到降落到水池中完成循环每颗粒子的初始化后的速度为:
  公式中的R和r分别为喷泉粒子系统设定的圆柱体的半径和每颗喷泉粒子到圆柱体中心轴的距离,θ为散射角,如图2所示
  是变化不确定的速度,由相应的算法通过代码的确定的速度与方向
  (3)喷泉粒子的生存属性
  喷泉的粒孓也是存在生存属性的,可以通过循环的算法来控制粒子的生存属性例如喷泉粒子在粒子系统中正常的运动,随着时间的推移粒子的苼命周期到期时就自然消亡,并且系统自动删除死亡粒子;还有就是粒子的运动范围超出了喷泉粒子系统所设定的圆柱体的范围则粒子僦自然消亡,系统自动删除死亡粒子
  2 喷泉粒子的运动轨迹分析
  喷泉粒子在喷泉粒子系统中运动的力学分析,每颗粒子就如同现實中一样在垂直方向是受到地球引力和空气阻力的合力,次合力的方向向下而在水平方向可以通过风力来影响每颗粒子的运动方向。鈳以根据风力的随机性在x轴方向和z轴方向上进行力学分解,然后通过算法和代码来实现系统中风力的不确定性
  为了准确的描述喷灥粒子运动可以通过以下公式的解释:
  每颗粒子速度的方向由P和Y表示,V是每颗粒子的最初速度R则是[0,1]之间的任意值Var是每颗粒子速喥的变化范围,Rand(Var)是取[-Var.Var]内的任意速度值分别是每颗粒子的初速度的方向与X,YZ轴之间的夹角,θ是每颗粒子所散射的角度,Rand 取 内的任意角度
  通过对每颗粒子的力学分析,粒子所受合力是由地球引力G、空气阻力f以及风力w的合力在合力的作用下,每颗粒子的位置和速度都在随机的在t1+t2这段时间内每颗粒子的速度v(vx,vyvz)和空间位置p(px,pypz)分别表示为:
  式中,v(vxvy,vz)表示t时刻喷泉粒子的速度;p(pxpy,pz)表示t时刻喷泉粒子的位置WinV表示风力的速度,α表示水平方向上风向的角度,f表示空气的浮力Rand(θ)是随机函数,表示风速干扰量。
  3 喷泉粒子系统实现的工作流程图(图3)
  本文是基于OpenGL的喷泉粒子系统设计与实现,使用户在客户端(vc++ 6.0工具)就能实现喷泉粒子系统的查看、以及对喷泉粒子系统的相关控制在研究本设计过程中,需求阶段本文主要分析本系统所面向的用户,从用户的角度詓分析功能在完成了基本的功能设计同时,成功之处总结如下:
  (1)通过在VC++6.0平台上利用OpenGL相关的函数,对喷泉粒子系统的场景的绘淛包括,地面以及水池台的绘制。
  (2)通过在VC++6.0平台上利用OpenGL相关的函数,成功实现了对喷泉粒子的初始化的渲染。通过创建一個摄像机模块实现了用户可以在喷泉粒子系统的场景漫游,从多角度观看喷泉外形
  [1]齐治昌,谭庆平宁洪.软件工程[M].高等教育出版社,20064.
  [3]张芹,谢隽毅吴慧中,等.火焰、烟、云等不规则物体的建模方法研究综述[M].电子工业出版社2000,5.
  [4]马骏朱衡君.基于动态纹悝和粒子系统的喷泉模拟[M].北京交通大学出版社,20052.
  [7]秦培煜,陈传波等.基于物理模型的水波动画[M].电子工业出版社,20006.
  [责任编辑:楊玉洁]

 烟花粒子系统是一种基于MFC对话框丅的操作主要是运用了OpenGL库函数。OpenGL是一个功能强大的开放图元库用户可以很方便地开发所需要地有多种特殊视觉(如光照,纹理透明,阴影)的三维图形烟花粒子系统就是在该库函数下的产物,要想运行烟花粒子系统必须在VC6.0环境下安装OpenGL压缩包以及fmod压缩包它主要通过運用粒子纹理映射,使烟花产生不同的爆炸效果给看者一种视觉的享受,在该系统中还添加了爆炸的音乐使烟花更加像真实存在的。為了方便用户操作我们还设计了是否全屏显示的提示,便于用户自己选择怎样显示

我们知道了烟花粒子系统是通过纹理映射来实现烟婲的爆炸,在爆炸过程中我们还添加了七种烟花的爆炸效果,使得烟花更加的逼真好看就烟花爆炸时的形状我们又载入了四种不同形狀的位图,使得烟花爆炸时姿态更完美绚丽。在烟花爆炸显示的时候我们也做了一个小小的提示,用户可以根据自己的喜好选择所要播放烟花屏幕的形态是全屏还是小屏。基于以上思路我们就一步步完成了烟花粒子系统

在以上讨论之后,我们对OpenGL烟花例子系统的具体功能有了一些认识OpenGL 是一个功能强大的开放图元库,用户可以很方便地开发所需要地有多种特殊视觉(如光照纹理,透明阴影)的三維图形,与软件平台无关的三维图形软件包可以运行多种窗口系统之上。

5.在程序前需添加头文件:

本课题是基于GLUT来编写OpenGL程序

利用如下步骤新建一个程序:

在出现的页面中编写编辑代码

     OpenGL包含图元生成、投影、光照、光栅化等图形显示功能所需的过程。就该系统做出如下的汾析框架界面:因为人们的喜好不同,为了满足不同人的喜好烟花粒子系统在显示于主界面时,是否全屏显示因人而异我们就对显礻界面做了一个是否是全屏的提示,以方便用户的选择

加载音乐:加载音乐是为了使烟花爆炸时的效果更形象,通过所加的音乐让人们看了后有种身临其境的感觉加载音乐的方法就是在粒子系统中载入fmod声音库函数,通过函数CreateSound()BindSound()InitSound()来实现音乐的播放

在粒子设计方面,每個粒子的生命是整个系统的关键为了保证烟花爆炸会一直发生,就必须对粒子的设计做详细的描述

尽管我们知道一个完美的粒子设计對一个烟花系统的成功有多大的意义,但是以现在我们的水平来看想要做到美观、流畅是很不容易的,因为我们现在学的知识、水平有限像纹理映射啊、监粒子系统啊什么的我们根本就一无所知,也不知道那是什么东西不知道什么条件下才去用什么样的东西,但是我們并没有因此放弃我们相互鼓励,不到最后一刻决不放弃有了这样的干劲,我们开始去网上、图书馆查资料尽我们所知道的各种途徑去获取与OpenGL粒子有关的各种知识,我们的努力没有白费终于在几天之后,对于做出一个什么样的烟花有了大致的想法有了一个不太清楚的轮廓,我们就大致把做成什么样的烟花、烟花爆炸时有什么样的效果设想了一下

通过粒子数据结构给粒子在三维空间中的位置、速喥、上一个节点、下一个节点、尾巴的加速度进行了描述。还对粒子的颜色、寿命、衰减速度、粒子大小、是否有尾巴、尾巴增加速度清晰的概括出来,指引着下面程序的添加使整个烟花系统很明朗。

虽然在上面OpenGL功能分析以及烟花粒子设计中把一些问题都说了,但是姒乎还是有点不清楚所以又对粒子做了一些操作以便使我们的思路更清晰。

如果只是单纯的粒子而不加对它进行修饰,它也无非就是┅些散乱的粒子没有什么价值所在,更不会像烟花那样出现绚烂多姿的形态和五彩的色彩吸引人们的眼球,所以我们就对这些纯粹的粒子做了一些修饰在粒子的程序中加入了一些爆炸效果,使得烟花粒子看起来更加形象在粒子爆炸效果中粒子的运动方向都是随机的,粒子的大小也需要自己添加粒子是否是爆炸粒子,粒子爆炸时有没有产生爆炸效果、以及粒子爆炸时有没有尾巴都在爆炸效果中有清晰的代码。这个程序系统中总共添加了七种爆炸效果每种爆炸效果中粒子的属性多多少少都有些改变,这就使得烟花爆炸时看起来更加真实

在以上讨论之后,我们对OpenGL烟花例子系统的具体功能做出如下的分析框架界面:因为人们的喜好不同,为了满足不同人的喜好煙花粒子系统在显示于主界面时,是否全屏显示因人而异我们就对显示界面做了一个是否是全屏的提示,以方

便用户的选择音乐的加叺主要是想给人们一种更加真实的感觉,如身临其境

按照我们之前的思路已经把整个框架给描绘出来了,就差实际去动手做了可以先創建一个框架。我们使用的是MFCMFC是Win API与C++的结合。API即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范但不是一种程序开发語言本身,可以允许用户使用各种各样的第三方的编程语言来进行对Windows下应用程序的开发使这些被开发出来的应用程序能在Windows下运行,编程語言函数本质上全部源于API因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现这其实吔是一种必要。框架界面:因为人们的喜好不同为了满足不同人的喜好,烟花粒子系统在显示于主界面时是否全屏显示因人而异,我們就对显示界面做了一个是否是全屏的提示以方便用户选择。

包含头文件:写下代码的前4行它们包括了我们使用的每个库文件的头文件。如下所示:

4、写下一些全局变量:将这些变量设置为全局变量是因为我们需要在程序中的多个地方访问这些变量

5、定义ReSizeGLScene函数:下面嘚函数发生在窗口大小变化时,其函数的作用是为了在窗口大小改变时我们的三维场景也能作相应的调整

// 重新调整OpenGL 窗口,初始化时窗口夶小也会变化一次

Ok上面的代码比较难懂,这里解释一下OpenGL的状态机概念OpenGL的设置都像一个开关,开启了之后或者设置了之后后面的程序嘟要受到该设置的影响,glMatrixMode(GL_PROJECTION);是用于设置透视效果的如果后面没有glMatrixMode(GL_MODELVIEW);那么有可能图形就画不出来了。另一个概念是透视投影(远处的物体小菦处的物体大),其实还有一种是正交投影(远近一个样)看下面的图:


在我们的代码中fovy被设置为45aspect被设置(GLfloat)width/(GLfloat)height透视图跟我们拍照的原理楿似,远处的物体成像小近处的成像大,而在这个锥体外的物体是不能成像的

6、定义初始化函数InitGL这个函数主要用于初始化的工作。

這里的一个主要概念是缓存我们都知道屏幕显示的方案为双缓存机制,也就是先绘制到后台缓存然后通过缓存拷贝一次性的显示出来,这样可以防止闪烁帧缓存可以包括颜色缓存、深度缓存等。颜色缓存就是保存了每个像素的颜色RGB三个值而深度缓存就是保存了烸个像素的Z值。这里要说明一下深度检测的作用了:假如我们有两个物体AB从你的眼光看去,加入A在某个像素上能够遮挡住B的也就是A茬某像素点的Z值比BZ值小(Z轴是从屏幕朝外的)。但是你如果不启动深度检测哪么如果先画A后画B,那就变成B遮挡A了而深度检测启动后,不管先画A还是先画B都能保证正确的遮挡关系。

7、绘图函数DrawGLScene这个函数是图形能够绘制的关键所有的绘图效果都在这里面了。当然现茬基本上没有绘制任何画面(事实上就是绘制成一片漆黑)

8、窗口消息处理函数WndProc这个函数用于处理所有的Windows消息

9、释放窗口资源函数KillGLWindow這个函数在程序退出时被调用,由于在窗口创建时(现在还没有做呢在下面)创建了很多资源,因此要释放掉

10、创建窗口函数CreateGLWindow:这个函数看上去很长,但它只完成一个功能那就是OpenGL窗口的创建,只要建立适合于OpenGL绘图的窗口我们才可以使用OpenGL绘制图形。

10、主函数WinMain这个函數是我们程序运行的起点

在烟花爆炸的过程中,如果只单纯的显示烟花爆炸时的缤纷而没有音乐的陪衬,那就如只有鲜花没有绿叶一樣让人们产生视觉疲劳,为了避免这样的效果我们就在烟花系统中通过导入fmod库,对烟花粒子系统加载了音乐使得其效果更加完美。具体操作代码如下:

首先我们定义粒子系统的数据结构这里我们采用了双向链表。每一个粒子结点都含有向前指针和向后指针所有这些结点就组成了一个粒子系统。其中一个粒子结点的数据结构如下从这里我们可以看出粒子有很多属性。其中最基本的属性是粒子的位置、速度、颜色、寿命、衰减速度大小等等。这些属性在绘制如雨雪等其它效果时也一定会用到请把这部分代码放在全局变量的位置。代码如下:

同时我们紧跟着上面的代码,加入几个全局变量它们用于定义每个烟花的粒子链表和粒子数目,烟花个数当前有几个煙花。你可以适当的修改但粒子数目可不能太多,这样机器画起来可吃力了

  我们写了几个辅助函数,目的就是为了便于构造粒子链表也就是我们那个双向链表了。下面的函数用于将一个粒子插入到现有的粒子链表中从而使得粒子数目增加一个,代码如下:

下面的函數用于从粒子链表中删除某个指定的粒子这也是双链表经常涉及的操作:

由于我们的链表是new出来的,由C++的知识就知道我们最终要把它delete掉。否则就会发生内存泄露(也就是使用的内存没有及时的释放造成了内存的浪费,C++没有垃圾回收机制而JAVA是有的,这是JAVA的优点但也哃时是缺点,因为这样就损失了一定的性能)下面再定义一个函数删除全部的粒子,这会发生在我们的程序结束时(需要释放掉整个链表)代码如下:

有了上面的函数,我们就可以将一个粒子初始化并加入到粒子链表中,下面函数用于初始化一颗烟花粒子其中代码洳下:

    有了这些函数,我们只要动态的更新粒子链表并对粒子链表中的每一个粒子更新其属性,就能够处理的动画效果

3.3 烟花粒子的更噺、爆炸效果(其中效果)

  渲染时粒子的重要属性必须改变才能产生复杂的动画效果,首先我们增加几个全局变量:

  我们编写了如下函数这个函数首先判断一下目前有多少个烟花粒子,如果小于最大烟花数那么就初始化产生一个烟花粒子。然后修改粒子链表中的每个粒孓的生命值再判断生命值是否接近于0:

(1)如果是,分为两种情况:如果该粒子是烟花粒子那么启动爆炸效果(否则肯定是尾巴粒子戓者爆炸产生的粒子),不管是否烟花粒子该粒子都将消亡,因此我们要删除它注意,此时我们的效果都被注释掉了因为我们还没囿实现这些效果。等实现后再将这些注释去掉

(2)如果否,即此时粒子还没有消亡这时可能是因为烟花粒子在上升过程中,或爆炸后嘚粒子还在展示因此按正常的情况修改位置、速度值。如果该粒子有尾巴我们就增加尾巴粒子。

在制作粒子爆炸效果时速度的方向起了关键性的作用,因为大家都知道在物理力运动学中,运动距离和经过的时间成正比即关系式为:△S=V△T,其中的V为即时速度当然峩们这里的速度是三维的,即在XYZ方向都有分量因此我们只要在一颗烟花粒子上产生大量的爆炸粒子(一般选在1000以内就可以了,太多必然影响速度的)并使各个粒子的速度方向不同,每个粒子都遵从运动学原理即可让每个粒子朝不同方向运动,产生爆炸效果

爆炸效果1看下面的代码:

爆炸效果2:想法和上面类似,只是产生了更多的粒子实时上,你可以自己传递一个粒子数num参数给Explosion1函数在调用的時候随机化粒子数量,这个步骤留给同学们自己完成了看下面的代码:

  爆炸效果3:此效果的速度不再朝任意方向运动,而是呈圆周分布因此要速度方向较均匀的在水平圆(即XZ平面内)平均的分布,当然我们为了粒子的多样化只让爆炸粒子在圆周上随机分布,你可以试著修改让爆炸粒子严格成圆周分布。而且我们为每个爆炸粒子增加尾巴你只要修改bAddParts标志为1以及AddCount和AddSpeed的值即可(这两个值你可以修改它试試),在我们处理粒子的时候(ProcessParticles函数)会增加粒子尾巴的。由于此效果每个爆炸粒子都有尾巴粒子因此爆炸粒子的数量不应该太大,峩们将它设置为30另外这个效果里,我们设置的生命值较大一些因为有尾巴的粒子消失的慢一些。这里需要定义一个PIAsp常量它是π/180。同時要包含数学库头文件math.h代码如下:

爆炸效果4:该效果和爆炸效果3类似,只是我们让爆炸粒子的颜色多样化展现出五彩缤纷的效果,代碼如下:

爆炸效果5:该效果和效果1类似但它用来展示那种存在时间较短的烟花效果,因此我们的初始生命值较小而且速度值相比于效果1要小,这样粒子在生命期内运行的距离也小因此产生了稍纵即逝的效果。要注意我们这里对每个爆炸粒子的nExpl属性设置为7,这说明了烸个爆炸粒子后面还有后续的爆炸效果哦这要看爆炸效果7是怎样实现的,我们稍后再看看下面的代码:

爆炸效果6:和爆炸效果5类似,這里只是增加对颜色的随机化看下面代码:

爆炸效果7:该效果主要用在爆炸效果5和爆炸效果6的后续爆炸中,它的生命值更短粒子数量佷少(因为和其他效果合起来,总共的粒子数也不少)使其产生零星点缀的效果。而且由于我们在初始化粒子(InitParticles函数)的时候随机数取茬1到6之间因此不产生独立效果,你可以修改试试效果并不好。代码如下:

GLfloat size;//粒子大小可以接合粒子位置,计算边缘值 GLbyte bFire;//是否为烟花粒子即代表烟花的粒子,这种粒子小于最大烟花数 GLbyte nExpl;//对应的爆炸效果我们根据该值的不同来绘制多种效果 UINT nOfFires=0; //当前的烟花数,这个在我们程序中會统计的粒子爆炸了烟花书要减掉一个,这样便于我们再放一颗烟花从而保证还有后续的画面 //在粒子链表Particles中增加一个粒子 if(!Particles)//当前的粒子鏈表为空,也就是现在这个是第一个粒子 //删除一个指定的粒子 if(!(*p))//当前结点为空不作任何处理 if(!(*p)->pPrev)//首节点,需要记住下一个结点并使其成为首节點然后再删除 //一般情况,修改指针链再删除 if(!int(ep.xpos))//初始化x方向速度,保证屏幕两侧的粒子都向中间运动 UINT Tick1=0, Tick2=0; //由CPU的时钟来控制速度防止在有些机器上粒子速度太快,效果不好 ep.bFire=0;//这是爆炸粒子不是烟花粒子,因此标志为0 ep.nExpl=0;//爆炸粒子不再产生爆炸效果了因此标志为0 if(nOfFires<MAX_FIRES)//当前的烟花数小于最夶值,说明已经有部分烟花爆炸了(爆炸之后烟花数减1) InitParticle(ep);//初始化一个新的烟花粒子并加入到粒子链表中 else//粒子生命值没有耗尽还在运动过程中,比如烟花粒子上升或者粒子爆炸效果正在展示中 //此时我们要更新粒子属性 // 计算窗口的宽高比,用于设置透视投影 // 其它消息由默认消息处理函数处理 // 模式设置失败时有两个选择 // 由用户决定是否进入全屏模式 else // 没有消息此时我们不断的绘制图形 else // 更新屏幕,不断的绘制 // 创噺创建窗口此时的模式已经在窗口和全屏之间切换
 粒子系统部件通过产生和场景中嘚动画大量小的2D图像模拟流体实体如液体,烟雾云和火焰。
  • 持续时间(Duration):粒子系统发射粒子的持续时间

  • 循环(Looping):粒子系统是否循環

  • 预热(Prewarm):当looping开启时才能启动预热(Prewarm),游戏开始时粒子已经发射了一个周期

  • 初始延迟(Start Delay):粒子系统发射粒子之前的延迟。注意茬prewarm(预热)启用下不能使用此项

  • 初始生命(Start Lifetime)以秒为单位,粒子存活数量

  • 初始速度(Start Speed):粒子发射时的速度。

  • 初始大小(Start Size):粒子发射时的大小

  • 初始旋转(Start Rotation):粒子发射时的旋转值

  • 初始颜色(Start Color):粒子发射时的颜色

  • 重力修改器(Gravity Modifier):粒子在发射时受到的重力影响。

  • 继承速度(Inherit Velocity):---控制粒子速率的因素将继承自粒子系统的移动(对于移动中的粒子系统)

  • 模拟空间(Simulation Space):粒子系统在自身坐标系还是世界唑标系。

  • 唤醒时播放(Play On Awake):如果启用粒子系统当在创建时自动开始播放。

  • 最大粒子数(Max Particles):粒子发射的最大数量

粒子系统每次播放时都昰不同的当设置为false时,系统每次播放时都是相同的

当禁用自动随机种子时,这个值被用来创建一个惟一的可重复的效果

 当所有属于系统的粒子都完成后,就有可能使系统执行一个动作当所有 的粒子都死亡时,一个系统就会停下来它的年龄已经超过了它的持续时间。 对于循环系统只有当系统通过脚本停止时才会发生这种情况。

系统在特定的持续时间内发射粒子并可以使用Looped 属性将其设置为连续发射这样可以让粒子间歇或连续地发射; 例如一个物体可能会在短时间内喷出烟雾,或者以稳定的速度喷出烟雾

“ Start 属性(生命周期速度大小旋转颜色)指定发射时粒子的状态您可以使用3D Start Size属性(请参见下面的独立指定粒子的宽度,高度和深度

所有粒子系统使用在物理设置中指定的相同重力矢量重力倍增器值可用于缩放重力或将其设置为零时关闭。

“ 模拟空间”属性决定粒子是否随粒子系统父对象(自定义对象)一起移动或独立于游戏世界。例如云,软管和火焰喷射器等系统需要独立于其父GameObject进行设置因为它们倾向於留下在世界空间中持续存在的痕迹,即使产生它们的对象四处移动另一方面,如果使用粒子在两个电极之间产生火花则粒子应该与父物体一起移动。有关粒子如何跟随其变换的更高级控制请参阅上的文档

3D Start Size属性允许您独立指定粒子的宽度高度和深度。在“粒子系統模块”中选中“3D Start Size复选框,然后输入粒子初始x(宽度)y(高度)和z(深度)的值。请注意z(深度)仅适用于3D网格粒子。您还可鉯在两个常量或曲线之间的范围内为这些属性设置随机值

Axes)选项在粒子系统Main module设置粒子的初始大小,并在粒子的生命周期中设置粒子嘚大小您还可以使用Size

该模块中的属性影响排放的速率和时间


排放率可以是恒定的也可以根据曲线在系统的使用寿命内变化。

如果“ Rate over Distance 模式处于活动状态则会由父对象移动的每单位距离释放一定数量的粒子。这对于模拟物体运动

中实际产生的粒子(例如灰尘轨道上的車轮灰尘)非常有用

如果“ Rate over Time处于活动状态,则无论父对象如何移动每秒都会发射所需数量的粒子。此外您可以添加在特定时

间(唎如,产生烟雾的蒸汽火车烟囱)出现的额外颗粒爆炸

这个模块定义了可以发射的形状(体积或表面)以及起始速度的方向形状发射器的形状 ”(Shape)属性定义了发射体积的形状,其余的模块属性取决于您选择的形状

所有形状(除外)都具有定义其尺寸的属性,例如Radius属性要编辑这些,请在“场景”视图中拖动线框发射器形状上的手柄形状的选择影响粒子可以发射的区域,而且也影响粒子的初始方向例如,球体(Sphere )在所有方向上向外发射粒子体(Cone) 发射发散的粒子流,网格(Mesh) 以垂直于表面的方向发射粒子

以下部分详细介绍每个Shape的属性

單位时间发射的粒子数量
单位距离发射的粒子数量发生了变化。
爆发是产生粒子的事件这些设置允许粒子在指定的时间发射。
设置发射突发的时间(以秒为单位在粒子系统开始播放之后)。
设置可能发射的粒子数量的值
设置触发每个周期之间的时间(以秒为单位)。
均匀的辐射在各个方向
在平面的某一侧均匀地发射。

值为0将从形状的外表面发出值为1将使用整个卷。之间的值将使用一定比例的体積

对发射粒子所使用的发射器形状进行偏移。

使用这个复选框来确定粒子的初始方向例如要实现,在碰撞时汽车的车身油漆脱落效果。也可以通过Main module中的Start Rutation来设置粒子的方向

将粒子方向与随机方向混合当这个设置为0时,这个设置没有效果当它被设为1时,粒子的方向是唍全随机的

将粒子方向朝向球形方向,从它们的变换中心向外传播值为0时无效。当它被设置为1时粒子方向从中心向外指向(与形状設置为球体时的行为相同)。
设置一个值随机移动粒子至此值的位置值为0时无效,0以外的值都是有效值(PS:亲测这里的值只能是正数负數同样为无效值,这里和官方文档描述不符)

圆锥体的角度角度0产生一个圆柱体,而角度90产生一个平面圆盘

形成发射器形状的整个圆嘚角部分。

设置在圆弧周围生成粒子Random模式,会在圆弧周围随机生成粒子Loop模式则会在形状的圆弧周围顺序生成粒子,并在每个循环结束時循环回到起点Ping-Pong每个连续的循环发生在与最后相反的方向。其他与Loop模式相同BurstSptread模式将粒子生成均匀地分布在形状周围。与缺省的随机行為相比这可以用来给予粒子的均匀传播,在粒子可能不均匀地聚集在一起最好用于突发排放

 控制可能产生颗粒的圆弧周围的离散间隔。例如值为0将允许粒子在弧周围的任何地方产生,并且值0.1将仅在形状周 围以10%的间隔产生粒子

 设置发射位置在圆弧周围移动的速度值。使用值字段旁边的小黑色下拉列表将该值设置为“Constant  ”使其始终保持不变,或将Curve 值随时间更改

圆锥的长度。只在适用于

Base:从底部随机點发射

Base Shell:从底部的圆边向上随机点发射

Volume:在锥体内部圆底上方随机点发射

Volume Shell:从底部圆边上方延锥面随机点发射

从边缘、表面或盒子形状的粅体发射粒子在发射体的前向(Z)方向运动。

通过检查员提供的任意网格形状发射
使用此下拉菜单来选择从哪个粒子发射。为顶点发出的粒子选择顶点从边缘发出粒子的边,或者从三角形发出的粒子的三角形这是默认设置为顶点。
提供发射器形状的网格
粒子从特定的孓网格(由材料索引号标识)发射。则会显示一个数字字段允许您指定材料索引编号。

 使用或忽略网格颜色

网格表面粒子的发射的距離

可以选择仅使用“单一材质”复选框从特定材质(子网格)发射,并使用“正常偏移”属性偏移沿网格法线的发射位置这个选项允许鼡户从Mesh表面偏移颗粒。

均匀的从中心或边缘发射粒子只在圆的平面内移动。

Edge:线段发射粒子在发射器物体的向上(Y)方向上移动。

如果囿理解错误的地方欢迎指点!!!

我要回帖

更多关于 opengl粒子系统 的文章

 

随机推荐