粒子系统基本原理 给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。
2016-09-10 18:12
357 查看
粒子系统基本原理
给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。粒子属性的初始值通常由随机过程产生。粒子往往由位于空间某个位置的粒子源产生。
一个粒子系统是随时间不断变化的,在生命期的每一刻都要完成以下4步工作。
1粒子源产生新粒子:产生一定数目的新粒子,其初始属性由随机过程控制。每个粒子可以具有一个生命期,如果某些粒子不应删除,则可以赋予他们无限长的生命期。
2更新现存粒子的属性:例如粒子有位置和速度属性,就需要根据粒子原来的位置速度和流逝的时间计算粒子的新位置。
3删除已经死亡的粒子:检查所有粒子的生命期如果法线某粒子已经死亡则将该粒子从粒子系统中删除
4绘制粒子:将粒子系统中所有的粒子绘制出来,得到所需要的视觉效果
点精灵point spirits。
具有中心点位置和大小的粒子,并且在渲染时根据其中心位置和大小自动计算出多边形的4个顶点并自动旋转面向观察者方向。
粒子管理器(the Particle Manager)
粒子管理器是一个管理类,用于控制我们的各种粒子系统 .一个管理类将掌管创建,释放,更新和渲染所有的系统.这样,管理类必须有一个属性是指向粒子系统的指针.建立或是使用一个数组模版(array template),会使工作变得简单些.
粒子系统的使用者会希望较容易地增加系统.并且也不想跟踪所有的系统以保证所有粒子均已死亡从而可以从内存中释放它们.这就是设计管理类的目的.管理器将会在需要时自动更新和渲染系统,并删除已死亡的系统.
当使用不定时系统(系统将在给定的时间后死亡)时,有一个检查系统是否已被删除的函数是很有用的(例如,是否它还存在于粒子管理器中).想象你创建了一个系统并存储了指向系统的指针。通过这个指针每一帧访问系统. AddSystem 函数可能只有一个参数:指向粒子类的指针.这将允许你根据需要轻易地增加一个烟系统或火系统.下面是我如何在引擎中增加一个粒子系统的例子: gParticleMgr->AddSystem( new Smoke(nrSmokeParticles, position, ...) ); 在世界更新函数中我调用了gParticleMgr->Update()函数,这个函数自动更新所有的系统并释放死亡的系统.Render函数然后渲染所有的可见粒子系统.
因为我们不想在每一帧跟踪系统中的所有粒子以判断是否所有的粒子均已死亡(这样系统可被删除),我们将使用Update函数来代替.如果这个函数返回TRUE,这意味着系统处于存活状态;反之系统已死亡并可以被删除.
在我的粒子系统中,其中分配的所有具有相同底纹和混合方式的粒子将连续地渲染,同时将底纹转换和上载减到最小.这样,如果在屏幕上有十个可见的烟系统,就只有一个底纹转换和状态改变将被执行.
给出粒子中心点的坐标和粒子的大小,则很容易计算出粒子所需要的4个顶点的位置坐标。粒子系统由大量的粒子构成。每个粒子具有一组属性例如位置大小纹理颜色透明度运动速度加速度生命周期等属性。粒子属性的初始值通常由随机过程产生。粒子往往由位于空间某个位置的粒子源产生。
一个粒子系统是随时间不断变化的,在生命期的每一刻都要完成以下4步工作。
1粒子源产生新粒子:产生一定数目的新粒子,其初始属性由随机过程控制。每个粒子可以具有一个生命期,如果某些粒子不应删除,则可以赋予他们无限长的生命期。
2更新现存粒子的属性:例如粒子有位置和速度属性,就需要根据粒子原来的位置速度和流逝的时间计算粒子的新位置。
3删除已经死亡的粒子:检查所有粒子的生命期如果法线某粒子已经死亡则将该粒子从粒子系统中删除
4绘制粒子:将粒子系统中所有的粒子绘制出来,得到所需要的视觉效果
点精灵point spirits。
具有中心点位置和大小的粒子,并且在渲染时根据其中心位置和大小自动计算出多边形的4个顶点并自动旋转面向观察者方向。
粒子管理器(the Particle Manager)
粒子管理器是一个管理类,用于控制我们的各种粒子系统 .一个管理类将掌管创建,释放,更新和渲染所有的系统.这样,管理类必须有一个属性是指向粒子系统的指针.建立或是使用一个数组模版(array template),会使工作变得简单些.
粒子系统的使用者会希望较容易地增加系统.并且也不想跟踪所有的系统以保证所有粒子均已死亡从而可以从内存中释放它们.这就是设计管理类的目的.管理器将会在需要时自动更新和渲染系统,并删除已死亡的系统.
当使用不定时系统(系统将在给定的时间后死亡)时,有一个检查系统是否已被删除的函数是很有用的(例如,是否它还存在于粒子管理器中).想象你创建了一个系统并存储了指向系统的指针。通过这个指针每一帧访问系统. AddSystem 函数可能只有一个参数:指向粒子类的指针.这将允许你根据需要轻易地增加一个烟系统或火系统.下面是我如何在引擎中增加一个粒子系统的例子: gParticleMgr->AddSystem( new Smoke(nrSmokeParticles, position, ...) ); 在世界更新函数中我调用了gParticleMgr->Update()函数,这个函数自动更新所有的系统并释放死亡的系统.Render函数然后渲染所有的可见粒子系统.
因为我们不想在每一帧跟踪系统中的所有粒子以判断是否所有的粒子均已死亡(这样系统可被删除),我们将使用Update函数来代替.如果这个函数返回TRUE,这意味着系统处于存活状态;反之系统已死亡并可以被删除.
在我的粒子系统中,其中分配的所有具有相同底纹和混合方式的粒子将连续地渲染,同时将底纹转换和上载减到最小.这样,如果在屏幕上有十个可见的烟系统,就只有一个底纹转换和状态改变将被执行.
相关文章推荐
- 根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线
- 根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线
- CCMotionStreak(ccnode子类 可实现拖尾效果 需要设置--- 消隐动画时长,拖尾条带相邻顶点间的最小距离,拖尾条带的宽度,顶点颜色,纹理)
- 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
- 折线图(四)计算坐标轴文字大小,确定准确位置
- Hdu 4052 Adding New Machine(给你W*H大小的矩形,其中有N个地区不能使用(给出了这个地区的两个顶点的坐标即(x1,y1)和(x2,y2)),问能下多少个1*M的矩形)
- Input placeholder属性样式修改(颜色,大小,位置)
- PB 怎么动态(用代码)改变数据窗口的属性(例如窗体的字体大小,字体颜色,背景颜色)
- OGL纹理坐标计算和纹理边框颜色环绕模式过滤方法
- 设置UIButton的文字显示位置、字体的大小、字体的颜色需要注意的问题
- Muli3D <8> 计算Shader中顶点属性相对于屏幕坐标的偏导数
- 计算系统速度
- 关于HttpQueue 处理具有大量数据访问系统的工具
- 计算鼠标所在位置的x,y坐标的JavaScript脚本
- 如何读取系统字体、颜色、大小?
- OpenGL自动计算纹理坐标( By 董士崇 jerrydong@tom.com)
- 系统多种资源文件代码示例(例如一个系统同时具有中文简体,中文繁体,英文,日文等不同资源文件)(示例代码下载)
- 现在,有两个整数A和B,例如A是345,B是478,现在,需要把B插入到A里, 而A有三位,所以有四个位置选择,所得结果分别是: 478345, 347845, 344785, 345478 我们通过对比可以知道,在这当中最小的一个是344785
- 自然系统是分层的,软件项目的设计需要减少层的相干性来推动工作的规划。微软的开发平台还是做得不完善,至少aspx界面需要浪费大量的沟通才能设计好。
- 系统多种资源文件代码示例(例如一个系统同时具有中文简体,中文繁体,英文,日文等不同资源文件)(示例代码下载)