清华大学DirectX游戏编程第15章(全20章)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

15
15.3.1 示例:雪景
Snow类声明如下: 类声明如下: 类声明如下
class Snow : public PSystem { public: Snow(d3d::BoundingBox *boundingBox, int numParticles); void resetParticle(Attribute *attribute); void update(float timeDelta); };
4
15.1.1 结构格式
下面的顶点结构用于描述粒子的位置和颜色: 下面的顶点结构用于描述粒子的位置和颜色:
struct Particle { D3DXVECTOR3 _position; D3DCOLOR _color; static const DWORD FVF; }; const DWORD Particle::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
float d3d::GetRandomFloat(float lowBound, float highBound) { if(lowBound >= highBound) // 无效的输入 return lowBound; // 获得[0, 1]上的随机数 float f = (rand() % 10000) * 0.0001f; // 返回[lowBound, highBound]之间的随机数 return (f * (highBound - lowBound)) + lowBound; }
Snow::Snow(d3d::BoundingBox *boundingBox, int numParticles) { _boundingBox = *boundingBox; _size = 0.8f; _vbSize = 2048; _vbOffset = 0; _vbBatchSize = 512; for(int i=0; i<numParticles; i++) addParticle(); }
13
15.2.2 粒子的随机性
下面的方法输出用最小点min和最大点 和最大点max 下面的方法输出用最小点 和最大点 描述的立方体中的一个随机矢量: 描述的立方体中的一个随机矢量:
void d3d::GetRandomVector( D3DXVECTOR3 *out, D3DXVECTOR3 *min, D3DXVECTOR3 *max) { out->x = GetRandomFloat(min->x, max->x); out->y = GetRandomFloat(min->y, max->y); out->z = GetRandomFloat(min->z, max->z); }
7
15.1.3 粒子及其属性
粒子除了位置和颜色之外还有很多别的属性,例如, 粒子除了位置和颜色之外还有很多别的属性,例如,粒子会 有一定的速度。 有一定的速度。 当创建、删除、更新粒子的时候,操作的是粒子的属性; 当创建、删除、更新粒子的时候,操作的是粒子的属性;当 准备渲染的时候,将位置和颜色信息拷贝到Particle结构中。 结构中。 准备渲染的时候,将位置和颜色信息拷贝到 结构中 大部分粒子系统并不需要以下的全部属性, 大部分粒子系统并不需要以下的全部属性,然而有的系统需 要更多没有列出来的属性: 要更多没有列出来的属性:
此外还需要指定顶点缓冲大小、块大小和起始偏移。 此外还需要指定顶点缓冲大小、块大小和起始偏移。
17
15.3.1 示例:雪景
resetParticle方法在包围盒内创建了具有随 方法在包围盒内创建了具有随 机的X坐标和 坐标的雪花,并设置Y轴的位置 坐标和Z坐标的雪花 机的 坐标和 坐标的雪花,并设置 轴的位置 为包围盒顶部。然后给予雪花一定的速度,这 为包围盒顶部。然后给予雪花一定的速度, 样就可以看到雪花下落, 样就可以看到雪花下落,并稍微向左移动的情 雪花颜色被指定为白色: 景。雪花颜色被指定为白色:
雪景示例的效果截屏如图15.2所示。 所示。 雪景示例的效果截屏如图 所示
16ቤተ መጻሕፍቲ ባይዱ
15.3.1 示例:雪景
构造函数的参数是一个指向盒型包围盒结构的指针和系统所 需的粒子数量。包围盒描述了雪花的运动范围。 需的粒子数量。包围盒描述了雪花的运动范围。如果雪花超过 了这个范围,就被销毁或者重建。 了这个范围,就被销毁或者重建。 构造函数如下: 构造函数如下:
现在来看看渲染方法的代码: 现在来看看渲染方法的代码:
参见教材P239
12
15.2.2 粒子的随机性
在d3dUtility.h/cpp中添加下面两个函数来实现这种 中添加下面两个函数来实现这种 随机性。 随机性。 第一个函数返回在[lowBound, highBound]之间的 第一个函数返回在 之间的 随机浮点数: 随机浮点数:
struct Particle { D3DXVECTOR3 _position; D3DCOLOR _color; float _size; static const DWORD FVF; }; const DWORD Particle::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE |D3DFVF_PSIZE;
struct Attribute { D3DXVECTOR3 _position; D3DXVECTOR3 _velocity; D3DXVECTOR3 _acceleration; float _lifeTime; float _age; D3DXCOLOR _color; D3DXCOLOR _colorFade; bool _isAlive; };
③ 渲染第i段。 ④ i++。
11
15.2.1 粒子系统的渲染
为了更容易地进行渲染工作,需要 为了更容易地进行渲染工作,需要PSystem 中的下列成员: 中的下列成员:
_vbSize——顶点缓冲所可以装载的最大顶点数, 该数值与具体粒子系统的粒子数无关。 _vbOffset——该变量指定了顶点缓冲中“需要拷 贝的下一部分粒子数据的起始地址”的偏移量(以 “粒子数”为单位,而不是字节数)。例如,第一 块数据占据了顶点缓冲的0~499元素,那么就应该 从500个元素开始拷贝第二块数据。 _vbBatchSize——每一个数据块中的粒子数量。
9
15.2.1 粒子系统的渲染
由于粒子系统是动态的, 由于粒子系统是动态的,所以需要每一帧都 更新系统中的粒子。 更新系统中的粒子。最直接也是最低效的渲染 方法如下: 方法如下:
创建一个足以装下所有粒子的顶点缓冲,在每一 帧中进行如下操作:
A、更新所有粒子的状态。 B、拷贝所有仍存活的粒子到顶点缓冲。 C、渲染顶点缓冲。
(1) (2) 更新所有的粒子。 进行以下的循环直到所有存活的粒子都被渲染。
① 如果顶点缓冲中仍有空间,则:
通过D3DLock_NOOVERWRITE标志来锁住第 段。 标志来锁住第i段 通过 标志来锁住第 个粒子拷贝到第i段 把500个粒子拷贝到第 段。 个粒子拷贝到第
② 如果顶点缓冲已满,则:
设置i=0。 设置 。 标志锁住第i段 用D3DLOCK_DISCARD标志锁住第 段。 标志锁住第 拷贝500粒子到第 段。 粒子到第i段 拷贝 粒子到第
学习粒子的属性,以及怎样在Direct3D中描述粒子。 设计一个灵活的粒子系统基类,它包括适用于所 有粒子系统的属性和方法。 建立三个具体的粒子系统,分别模拟雪花、爆炸 的火花和粒子枪射出的子弹。
3
15.1 粒子和点精灵
粒子是一个很小的物体, 粒子是一个很小的物体,数学上它经常被当 作是一个点。 作是一个点。 点图元(在 点图元 在D3DPRIMITIVETYPE中选择 中选择 D3DPT_POINTLIST)是一个实现粒子的很好的 是一个实现粒子的很好的 方案。 方案。 Direct3D 8.0引入了一种称为 引入了一种称为Point 引入了一种称为 Sprite(点精灵,由于中英文的差别,Point 点精灵, 点精灵 由于中英文的差别, Sprite和Point Primitive有时都被翻译为点图 和 有时都被翻译为点图 为了避免这种混淆, 元,为了避免这种混淆,在后文中将直接使用 英文)新的图元类型 它最适用于实现粒子效果。 新的图元类型, 英文 新的图元类型,它最适用于实现粒子效果。
该结构仅仅存储了粒子的位置和颜色。 该结构仅仅存储了粒子的位置和颜色。
5
15.1.1 结构格式
可以为Particle结构中添加一个 可以为 结构中添加一个float变量来描述粒 变量来描述粒 结构中添加一个 子的大小,然后在灵活顶点格式加入D3DFVF_PSIZE 子的大小,然后在灵活顶点格式加入 标志。 标志。在每个粒子中保存对自身大小的描述可以更方 便地指定和更改粒子的大小。 便地指定和更改粒子的大小。 加上了size成员的顶点结构如下: 成员的顶点结构如下: 加上了 成员的顶点结构如下
resetparticle方法设置粒子的位置为摄像机的位置并把当前的摄像机所面对的方向的向量乘上100作为粒子的运动速率这样就能实现从摄像机所望的方向射出子弹的效果同时设置粒子的颜色为绿色
2
第15章 粒子系统
粒子系统就是专门用来产生、 粒子系统就是专门用来产生、控制以及渲染 这些粒子的系统。 这些粒子的系统。本章将会讲述粒子的具体概 念,以及粒子系统的实现。 以及粒子系统的实现。 主要目标:
6
15.1.2 Point Sprite渲染状态
Point Sprite的行为大部分通过渲染状态来进行控制的。 的行为大部分通过渲染状态来进行控制的。 的行为大部分通过渲染状态来进行控制的 (1) D3DRS_POINTSPRITEENABLE——布尔变量,默认是 false。用法如下: _device->SetRenderState(D3DRS_POINTSPRITEENABLE, true); (2) D3DRS_POINTSCALEENABLE——布尔值,默认是 false。用法如下: device->SetRenderState(D3DRS_POINTSCALEENABLE, true); (3) D3DRS_POINTSIZE——指定Point Sprite的大小 (4) D3DRS_POINTSIZE_MIN——指定Point Sprite的大小 可以取到的最小值 (5) D3DRS_POINTSIZE_MAX——指定Point Sprite的大小 可以取到的最大值 (6) D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B、 D3DRS_POINTSCALE_C
创建一个大小合适的顶点缓冲(例如,一个可以装 载2000个粒子的顶点缓冲)。然后把顶点缓冲分成 段。如图15.1所示,把它分成4段,每段中有500 个粒子。
10
15.2.1 粒子系统的渲染
创建一个全局变量i=0来跟踪当前所在的段, 创建一个全局变量 来跟踪当前所在的段,并在每 来跟踪当前所在的段 一帧中进行如下操作。 一帧中进行如下操作。
8
15.2 粒子系统组件
粒子系统是诸多粒子的集合, 粒子系统是诸多粒子的集合,而且负责这些粒子的维护和显 示工作。粒子系统保存着影响系统中所有的粒子的全局属性, 示工作。粒子系统保存着影响系统中所有的粒子的全局属性, 诸如大小、起始位置、应用的纹理等。 诸如大小、起始位置、应用的纹理等。 粒子系统就是负责粒子的更新、显示、销毁和创建的系统。 粒子系统就是负责粒子的更新、显示、销毁和创建的系统。 下面来看看PSystem类的声明: 类的声明: 下面来看看 类的声明 参见教材P233 对函数成员说明如下。 对函数成员说明如下。 (1) PSystem / ~PSystem——构造函数初始化一些默认 值,析构函数会释放设备接口(顶点缓冲、纹理)。 (2) init——这个函数是与Direct3D设备相关的初始化函 数,创建存放Point Sprite的顶点缓冲、创建纹理都是这个 函数的任务。 (3) reset——该方法重置粒子系统中所有粒子的属性: 参见教材P235
14
15.3 实现三个具体的粒子系统:雪景、焰火和粒子枪
在示例中实现了雪景、 在示例中实现了雪景、焰火以及粒子枪三个 系统, 系统,从这三个系统的名字就可以看出它们所 模拟的场景。 模拟的场景。 雪景模仿雪花飘落,火模仿焰火爆炸,当我 雪景模仿雪花飘落,火模仿焰火爆炸, 们按下鼠标按键时, 们按下鼠标按键时,粒子枪会从摄像机的位置 朝摄像机所看的方向发出粒子弹, 朝摄像机所看的方向发出粒子弹,这可以用于 游戏中枪械系统的基础。 游戏中枪械系统的基础。
相关文档
最新文档