游戏设计之粒子系统

上传人:子 文档编号:51718312 上传时间:2018-08-16 格式:PPT 页数:50 大小:1.65MB
返回 下载 相关 举报
游戏设计之粒子系统_第1页
第1页 / 共50页
游戏设计之粒子系统_第2页
第2页 / 共50页
游戏设计之粒子系统_第3页
第3页 / 共50页
游戏设计之粒子系统_第4页
第4页 / 共50页
游戏设计之粒子系统_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《游戏设计之粒子系统》由会员分享,可在线阅读,更多相关《游戏设计之粒子系统(50页珍藏版)》请在金锄头文库上搜索。

1、LECTURE 17PARTICLE SYSTEMS粒子系统MM许多自然现象是由很多小的小颗粒组成,它 们有相似的行为,例如,雪花落下,闪烁的火 焰,冲出枪管的“子弹” ,粒子系统用来模拟这 种现象。MMCONTENTS粒子和点精灵粒子系统粒子系统实例MM粒子和点精灵粒子(Particle)是一个很小的对象,数学上通常用点来表 示其模型。在显示粒子时,点图元是用来显示粒子的很好的方案, 可是点图元被光栅化成一个简单的像素。这没给我们多 少灵活性,因为我们想有各种大小不同的粒子,并且把 整个纹理平滑映射到这些粒子上。 Direct3D 8.0引入一个特殊的点图元叫点精灵(Point Sprite

2、),多数时候被应用在粒子系统中。与一般的点元 不同的是,点精灵有纹理映射并能改变大小。 MM粒子和点精灵粒子结构格式 使用下面的顶点结构来描述粒子的位置和颜色:这个结构只保存粒子的位置和颜色,这取决于程序的需 要,可以用同样的结构去保存一套纹理坐标 MMstruct sParticle D3DXVECTOR3 position;D3DCOLOR color; ; const DWORD PARTICLE_FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;粒子和点精灵有时需要增加一个浮点变量给Particle结构来表示粒子尺寸。则需要在灵活顶点格式增加一个D3DFVF_PSIZ

3、E标记,以反映这个变化。每个粒子维护自己的大小很有用,因为它允许以具体情况指定并改变粒子的大小。可是,大多数的图形卡不支持控制粒子的大小,检查D3DFVFCAPS_PSIZE在D3DCAPS9结构的FVFCaps成员,因此我们不使用它。一般用渲染状态(render states)去控制粒子的大小MMstrict Particle D3DXVECTOR3 _position;D3DCOLOR _color;float _size; ; const DWORD Particle_FVF = D3DFVF XYZ | D3DFVF DIFFUSE | D3DFVF_PSIZE;注意:通过vertex

4、 shader,能够获取每 个粒子的大小,即使 你的硬件不支持 D3DFVFCAPS_PSIZ E。粒子和点精灵点精灵(Point Sprite)渲染状态 D3DRS_POINTSPRITEENABLE: A Boolean value. The default value is false.True表示将当前的纹理 全部映射到点精灵上。False 表示用指定的纹理坐标映射到点精灵 的点(图素)上。 _device-SetRenderState(D3DRS_POINTSPRITEENABLE, true);D3DRS_POINTSCALEENABLE:A Boolean value. The

5、default value is false. True表示用视图空间 单位来解释点的大小。视图空间单位仅用来描述摄像机坐标系中 的的3D点,点精灵尺寸依据近大远小的原则将自动缩放。False 表 示点的大小将用屏幕空间单位(像素)来解释。因此如果你指定 false且设置点精灵的尺寸为3, 则点精灵在屏幕区域中的尺寸为33 像素。. _device-SetRenderState(D3DRS_POINTSCALEENABLE, true);MM粒子和点精灵D3DRS_POINTSIZE:表示点精灵的尺寸. 这个值可以任意指 定视图空间或屏幕空间的点精灵的尺寸, 取决于 D3DRS_POINTSC

6、ALEENABLE状态如何设置. 设置点的尺寸为2.5个单位。:_device-SetRenderState( D3DRS_POINTSIZE, float_to_dword(2.5f) );D3DRS_POINTSIZE_MIN表示点精灵的最小尺寸。将设置最小值为0.2:_device-SetRenderState(D3DRS_POINTSIZE_MIN, float_to_dword(0.2f);MMDWORD DWORD float_to_dword(floatfloat_to_dword(float f) f) return *(DWORD*) return *(DWORD*) 粒子和

7、点精灵D3DRS_POINTSIZE_MAX表示点精灵的最大尺寸。将设置最小值为5.0:_device-SetRenderState(D3DRS_POINTSIZE_MIN, float_to_dword(5.0f);D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, D3DRS_POINTSCALE_C这3个常量表示如何根据距离控制 点精灵的尺寸,这个距离是点精灵到摄像机的距离。D3D用以下的公式去计算点精灵的最终尺寸,这取决于距离和 这3个常量。MM粒子和点精灵其中:FinalSize:距离计算后,点精灵的最后尺寸。ViewportHeight:视口的高度。Si

8、ze:对应于由绘制状态D3DRS_POINTSIZE所指定的值A,B,C: 分别为D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, and D3DRS_POINTSCALE_C值。D:在视图空间中点精灵与照相机的距离。因为照相机被放置在 视图空间中的原点,这个值是: 也是点精灵所在的位置。 MM粒子和点精灵下面设置点精灵的距离常量,这样点精灵将会随着距离增大而 变小。_device-SetRenderState(D3DRS_POINTSCALE_A, float_to_dword(0.0f);_device-SetRenderState(D3DRS_POINTSC

9、ALE_B, float_to_dword(0.0f);_device-SetRenderState(D3DRS_POINTSCALE_C, float_to_dword(1.0f);MM粒子和点精灵粒子及其属性一个粒子系统是由除了位置、颜色以外的更多的属性组成,例如 ,一个粒子可具有速度。然而,这些额外的属性对于渲染粒子来 说不是必须的。因此,在单独的结构中保存渲染粒子所必须的数 据和属性。当创建、显示或更新粒子时,使用属性来工作。当准 备渲染时,从sParticle(粒子)结构中COPY位置和颜色。 对于模拟的具体粒子系统,粒子的属性也是不同的 ,因此能够归 纳一些通用的属性 MM粒子和点

10、精灵MMstruct sParticleAttribute sParticleAttribute()life_time = 0.0f;age = 0.0f;is_alive = true;D3DXVECTOR3 position;/粒子在世界空间中的位置 D3DXVECTOR3 velocity;/粒子的速度,每秒多少个单位 D3DXVECTOR3 acceleration; /粒子的加速度 float life_time; / how long the particle lives for before dyingfloat age; / current age of the particl

11、eD3DXCOLOR color; / current color of the particleD3DXCOLOR color_fade; / how the color fades with respect to timebool is_alive; ; 粒子系统粒子系统是粒子的集合,用来保存和显示这些粒子。粒子系 统维护所有粒子的全部属性,影响系统中的所有粒子:粒子 的尺寸,起始的位置及应用在粒子上的纹理等。粒子系统主要负责更新(updating)、显示(displaying)、杀死 (kill)和创建(creating)粒子。把粒子系统公共的属性放到一个抽象的cParticleSyst

12、em基类 MM粒子系统MM粒子系统数据成员: m_origin粒子系统的原点, 这是粒子系统产生时的位置。 m_bounding_box创建粒子系统使用的边界盒,用于限制粒子的活动 范围。例如,假如我们让雪系统只落在一个围绕高山的峰顶的体积内, 我们会定义一个包括这个体积的边界盒, 出界的粒子将会被杀死。 m_emit_rate新增加到系统中的粒子的速度。通常的标准是;粒子数/ 秒。 m_size系统中所有粒子的尺寸。 m_particles系统中粒子属性的一个列表。 我们用这个列表创建,释 放及更新粒子。 当我们准备画粒子时, 我们COPY列表节点的一部分 到顶点缓存并画粒子,同时我们COP

13、Y另外一批粒子,然后重复这一 过程直到绘制完所有粒子。MM粒子系统数据成员: m_max_particles在给定的时间内,系统中允许的粒子最大数。例如, 如果创建粒子的速度比释放快的话, 随着时间的增长粒子的数量将会是 巨大的,这个成员将避免出现这样的问题。 m_vb_num在给定的时间内顶点缓存中能够保存的粒子的数量,这 个值与实际的粒子系统中的粒子数量无关。 注意:m_vb_offset和m_vb_batch_num数据成员在渲染粒子系统时使 用,我们在稍后讨论。MM粒子系统方法:cParticleSystem/ cParticleSystem用来初始化默认值和用来释放 设备接口 (ve

14、rtex buffer, texture)。MM粒子系统init这个方法做与设备无关的初始化工作,比如创建用来保存点精灵的 顶点缓存或创建纹理。 MM粒子系统注意: p 使用动态的顶点缓存(D3DUSAGE DYNAMIC)。 因为需要在 每帧中更新粒子,即将会去存取顶点缓存的内存。访问一个静态的 顶点缓存慢得不可接受, 所以我们使用动态的顶点缓存。p 使用 D3DUSAGE_POINTS标记,它说明顶点缓存将保存点精灵p 顶点缓存的尺寸是由m_vb_num预先确定的,而且与系统中粒子 的数量无关。 也就是m_vb_num将小于等于系统中粒子的数量。 这是因为渲染粒子系统是一批一批的,不是一次

15、渲染全部。p 使用默认的内存池(pool)代替通常使用的托管内存池,因为动态 顶点缓存不能用在托管内存池中。MM粒子系统reset这个方法重新设置系统中每个粒子的属性:reset_particle这个方法重新设置粒子的属性。如何重设粒子的 属性,这依赖于具体粒子系统的特性。因此定义这个方法为虚拟 的,等待子类去实现。MM粒子系统add_particle这个方法用来在系统中增加一个粒子。在增加它 到粒子列表之前,使用reset_particle方法先初始化粒子: update这个方法更新系统中所有的粒子。因为这个的方法的执 行取决于具体粒子系统的特性,因此定义这个方法为抽象的,等待 子类去实现。render这个方法用来显示系统中所有的粒子。MM粒子系统pre_render用它来初始化渲染状态,在渲染前设置。 因为系统 与系统之间是不同的,所以声明为虚函数。 默认实现如下:MM粒子系统post_render用它去保存所有渲染状态。因为系统与系统间是 不同的,所以声明为虚函数。默认将执行下列代码: is_empty如果为True则在当前的系统中没有粒子, 否则为 false. MM粒子系统is_dead如果为True则系统中的所有粒子都是死的,否则为 false MM粒子系统remove_dead_particles搜索属_particle性表,从表中杀

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号