DIRECT3D粒子系统.docx
《DIRECT3D粒子系统.docx》由会员分享,可在线阅读,更多相关《DIRECT3D粒子系统.docx(16页珍藏版)》请在冰豆网上搜索。
DIRECT3D粒子系统
DIRECT3D粒子系统
基于Direct3D技术的粒子系统
专业网络工程
3D粒子系统作品名称
班级
姓名
指导教师
年月日
摘要粒子系统特效是游戏的常用技术,对于现今的3D游戏时代来说,3D粒子系统更加是必不可少。
例如,魔兽世界、Aion、剑侠情缘等等都大量的使用了3D粒子特效技术。
本文是主要介绍基于DirectX技术制作的3D粒子特效。
关键词粒子系统,雪,火焰,喷泉
AbstractParticlesystemeffectsiscommontechnologyinthegame,inthecurrenteraof3Dgames,3DParticleisessentialmore.Forexample,Worldof
Warcraft,Aion,SwordsmanFoodofLoveandsoarealotofuseofa3DParticleeffectstechnology.ThisarticleismainlybassedonDirectXtechnologyintroducedproduced3Dpaticleeffects.
KEYWORDSParticleSystem;Snow;Fire;Fountain
前言
在科技时代的今天,计算机模拟真实世界已经在各领域广泛的应用(如游戏,
,这种模拟技术我们称之为虚拟技术。
在逼真的模拟效果电影,军事战场模拟等)
和巨大的经济效益的前提下,虚拟技术更加受人青睐。
在虚拟现实系统中,营造的虚拟环境是它的核心内容,而营造虚拟的环境中更是少不了自然现象的模拟。
自然现象(如云,水,火,烟雾等)都是不规则的模糊物体,要对其进行模拟,一些科技人员就提出了用粒子来构成不规则物体的理论,我们称之为粒子系统。
粒子系统现今比较普遍使用的两种技术分别是DirectX和OpenGL,这两只技术各有长短,而本文主要是介绍基于DirectX技术下的粒子系统。
这设计是我一个学期的努力成果,文章中会叙述到我从构思到实际设计的全过程,对每一种效果都有所讲解,在指导老师的提点下,我尽量对文章和设计进行了完善,如有不足之处,恳请赐教与指正。
第一章绪论.................................................................................1
1.1粒子系统介绍..............................................................................1
1.2使用DirectX设计的原因...............................................................................2
1.3Direct3D概述............................................................................................2
1.4开发环境介绍..............................................................................3
第二章初步设计分析..........................................................................4
2.1软件预定雏形...............................................................................................4
2.2程序设计构想...............................................................................................4
2.3初定模块......................................................................................................5
第三章粒子系统设计..........................................................................6
3.1窗口设计......................................................................................................6
3.2Direct3D初始化..........................................................................................6
3.3Direct3D所用组件加载.................................................................................6
3.4粒子系统核心设计分析..................................................................................6
3.4.1运动粒子场景介绍........................................................................9
3.4.2雪花飘落和火焰场景介绍.............................................................11
3.4.3泡泡效果场景介绍......................................................................12
3.4.4喷泉场景介绍.............................................................................13第四章系统优化.............................................................................14
第五章结论..................................................................................15
第六章总结..................................................................................15
3D粒子系统
第一章绪论
1.1粒子系统介绍
粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的gamephysics。
经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。
通常粒子系统在三维空间中的位置与运动是由发射器控制的。
发射器主要由一组粒子行为参数以及在三维空间中的位置所表示。
粒子行为参数可以包括粒子生成速度(即单位时间粒子生成的数目)、粒子初始速度向量(例如什么时候向什么方向运动)、粒子寿命(经过多长时间粒子湮灭)、粒子颜色、在粒子生命周期中的变化以及其它参数等等。
使用大概值而不是绝对值的模糊参数占据全部或者绝大部分是很正常的,一些参数定义了中心值以及允许的变化。
典型的粒子系统更新循环可以划分为两个不同的阶段:
参数更新/模拟阶段以及渲染阶段。
每个循环执行每一帧动画。
模拟阶段:
在这个阶段,系统根据生成速度以及更新间隔计算新粒子的数目,每个粒子根据发射器的位置及给定的生成区域在三维空间位置生成,并且根据发射器的参数初始化每个粒子的速度、颜色、生命周期等等参数。
然后检查每个粒子是否已经超出生命周期,一旦超出就将这些粒子剔除模拟阶段,否则就根据物理模拟更改粒子的位置与特性,这些物理模拟可能象将速度加到当前位置或者调整速度抵消摩擦这样简单,也可能象将外力考虑进取计算正确的物理抛射轨迹那样复杂。
另外,经常需要检查与特殊三维物体的碰撞以使粒子从障碍物弹回。
由于粒子之间的碰撞计算量很大并且对于大多数模拟来说没有必要,所以很少使用粒子之间的碰撞。
每个粒子系统都有用于其中每个粒子的特定规则,通常这些规则涉及到粒子生命周期的插值过程。
例如,许多粒子系统在粒子生命周期中对粒子的Alpha值即透明性进行插值直到粒子湮灭。
渲染阶段:
在更新完成之后,通常每个粒子用经过纹理映射的四边形sprite进行渲染,也就是说四边形总是面向观察者。
但是,这个过程不是必须的,在一些
1
3D粒子系统
分辨率或者处理能力有限的场合粒子可能仅仅渲染成一个像素,在离线渲染中甚至渲染成一个元球,从粒子元球计算出的等面值可以得到相当好的液体表面。
另外,也可以用三维网格渲染粒子。
1.2使用DirectX设计的原因
Direct是微软公司开发的一套功能丰富的底层API,其功能涵盖了对2D/3D图形加速的支持、对各种输入设备的控制,以及对声音输出的混音和采样、对多玩家网络游戏的控制、对各种多媒体流模式的控制等。
DirectX设计者的初衷是让Windows成为理想的游戏开发平台,如今他们正逐步实现这一理想。
实际上,虽然
如OpenGL)的挑战,但目前的形势是DirectX在游戏不断遭遇同样出色的竞争对手(
开发领域已经无可争议地占据王者地位,而且这张趋势有可能极有可能保持下去。
当然,这并不是说Direct能够完全取代其他API,只是各自有优势而已。
DirectX在体系结构上很突出的优点是它使用了两层驱动:
HAL和REF,那些为硬件所支持的特定可由HAL来控制(即充分地发挥硬件的加速功能),从而可以获得理想的运行速度。
而对那些不为硬件所支持的功能,借助REF,程序能够以软件方式来模拟相应的运算或处理过程,从而使得无论硬件配置是否高端,开发人员都可以完整地体验和测试DirectX所提供的全部功能。
所以,综合以上的原因,我最后采用了DirectX技术对本粒子系统的开发。
1.3Direct3D概述
Direct3D是DirectX与图形绘制及渲染相关的一个核心子集。
过去,Direct3D的初始化一直是一件相当繁琐的工作。
但是,基于现今DirectX的强力对手的优势使得微软开始对Direct进行改进,它希望把对手的优点都涵盖进去。
所以从DirectX8.0起就采用了一种简化模型,而且DirectX9.0也遵从了同一模型。
Direct3D是一套底层(low-level)图形API(ApplicationProgramming
Interface,应用程序编程接口),借助该API,我们能够利用硬件加速功能来绘制3D场景。
Direct3D可以被视作应用程序与图形设备(3D硬件)交互的中介。
它是基于微软的通用对象模式COM(CommonObjectMode)的3D图形API。
它是由微软(Microsoft)一手树立的3DAPI规范,微软公司拥有该库版权,它所有的语法定
2
3D粒子系统
义包含在微软提供的程序开发组件的帮助文件、源代码中。
Direct3D是微软公司DirectXSDK集成开发包中的重要部分,适合多媒体、娱乐、即时3D动画等广泛和实用的3D图形计算。
自1996年发布以来,Direct3D以其良好的硬件兼容性和友好的编程方式很快得到了广泛的认可,现在几乎所有的具有3D图形加速的主流显示卡都对Direct3D提供良好的支持。
Direct3D(简称:
D3D)是微软公司在MicrosoftWindows操作系统上所开发的一套3D绘图编程接口,是DirectX的一部份,目前广为各家显示卡所支援。
1.4开发环境介绍
VisualStudio是一套完整的开发工具集,用于生成ASP.NETWeb应用程序、XMLWebServices、桌面应用程序和移动应用程序。
VisualBasic、VisualC++、VisualC#和VisualJ#全都使用相同的集成开发环境(IDE),利用此IDE可以共享工具且有助于创建混合语言解决方案。
另外,这些语言利用了.NETFramework的功能,通过此框架可使用简化ASPWeb应用程序和XMLWebServices开发的关键技术。
其功能是创建满足关键性要求的多层次的智能客户端、Web、移动或基于MicrosoftOffice的应用程序。
使用VisualStudio2005,
专业开发人员能够:
使用改进后的可视化设计工具、编程语言和代码编辑器,享受高效率的开发环境。
在统一的开发环境中,开发并调试多层次的服务器应用程序。
使用集成的可视化数据库设计和报告工具,创建SQLServer2005解决方案。
使用VisualStudioSDK创建可以扩展VisualStudioIDE的工具。
Microsoft为单独工作或在小型团队中的专业开发人员提供了两种选择,VisualStudio2005ProfessionalEdition和用于MicrosoftOffice系统的VisualStudio2005工具。
每种版本都在标准版的特性上进行了扩展,包括用于远程服务程序开发和调试、SQLServer2005开发的工具,以及完整的、没有限制的开发环境。
每种产品都可以单独购买或打包定购。
3
3D粒子系统
专业开发人员喜欢自由的使用.NETFramework2.0,它是一种稳健的、功能齐备的开发环境,支持创建扩展VisualStudio集成开发环境的工具。
第二章初步设计分析
2.1软件预定雏形
使用的语言和设计方向既然已经固定了下来,接下来我就对要设计的粒子系统作了一个大概的构思,构思如例图图2.1:
2.1系统用例图
我初步设计是让用户可以可以看到3D场景,而窗口上有用户操作的说明,用户在操作说明的指引下可以对粒子模块在虚拟空间的各个角度进行变换(即视觉变换控制操作),接着用户可以切换到下一个粒子场景(效果变换),而在某些模块下,粒子与物体之间可能有碰撞发生。
2.2程序设计构想
大概的系统画面初步构思完成,接着需要的是如何着手程序设计。
经过初步考虑,我大致对程序模块进行了划分。
构图如2.2
4
3D粒子系统
流程图2.2
必然的一步就是创建窗口。
接着需要用到Direct3D技术,所以就要加载D3D所需要的各种组件。
按着图1.1的构思,要在虚拟空间里变换视觉,就需要用到摄像机。
然后对核心内容粒子系统的构建。
最后的加载天空盒子,地板和模型等。
其实最后一项不是必要使用的。
那是因为我学习D3D技术,很想把所学到的东西使用到系统里面。
所以就有了以上的构想。
2.3初定模块
1(对雨、雪类似的自然现象模拟。
在场景中粒子会受到风,重力的的影响自然飘落。
2.火焰模拟。
在火焰场景中火焰粒子会随着时间的年龄的增长而消亡,达到慢慢淡出的效果。
3.泡泡世界。
在旋风泡泡场景中,用户会看到粒子(即泡泡)会迎面而来,同时泡泡有旋转运动的效果,这是我想模拟一些屏保的效果。
4.喷泉模拟。
在喷泉模块中,用户会看到粒子(即水花)从喷出到下落,和地面碰撞的过程。
5.粒子运动。
在粒子运动模块中,简单的算法与粒子系统结合后,粒子场景会更加生动真实。
5
3D粒子系统
第三章粒子系统设计
3.1窗口设计
整个系统的开端就是从简单的Windows窗口创建开始,为了便于测试与运行,我对窗口的大小设定为800X600,而初步的创建方法就是通过:
注册窗口类->创建窗口->显示和更新窗口->消息循环。
在这一步,我简单的带过,因为这不是重点。
不过有一点比较重要的是,在消息循环里应该采用PeekMessage的方案比较客观。
因为我要做的粒子系统需要不断的更新。
如果采用传统的GetMessage函数会等到有了消息后程序才触发,继续进行下去。
而PeekMessage则是不等消息,程序继续进行,如果消息来到,就暂停当前函数,响应消息,完了继续进行。
3.2Direct3D初始化
D3D初始化大概的步骤是获取IDirect3D9指针->检查设备性能(D3DCAPS9)->初始化D3DPRESENT_PARAMETERS结构的一个实例->利用已初始化结构的实例创建IDirect3DDevice9对象。
3.3Direct3D所用组件加载
在这一步主要是为已初始化的D3D添砖加瓦,除了观察坐标系,世界坐标系投影坐标系等这些必要的函数外,我还加入了摄像机(Camera),地板(floor)和天空盒子(Sky)等。
希望能令模拟更加真实。
3.4粒子系统核心设计分析
各种粒子模拟虚拟现象其实都是从发射器发射出的大量的例子不断运动产生的结果,所有粒子在生产时被赋予了各种属性(生命,年龄,颜色,速度等等),随着时间的变化,粒子的属性会不断的变化。
粒子系统主要负责更新、显示、杀死和创建粒子的功能。
其工作原理如图3.1
6
3D粒子系统
粒子系统工作原理图3.1
具体的粒子系统类图如图3.2
3.2粒子系统主要类图
从图3.2的粒子系统主要类图,我们可以看到该核心系统是由3个数据结构和,6个类构成。
下面我们先看程序的3个结构。
(1)Attribute:
该结构是包含了一些通用的粒子属性的结构。
该结构代码如下structAttribute
{
D3DXVECTOR3_position;
D3DXVECTOR3_velocity;
D3DXVECTOR3_acceleration;
7
3D粒子系统
float_lifeTime;
float_age;
D3DXCOLOR_color;
bool_isAlive;
};
粒子在世界坐标系中的位置。
_position:
_velocity:
粒子的速度,度量单位常用单位/秒。
_acceleeration:
粒子的加速度,度量单位/秒?
。
_lifeTime:
粒子的自诞生到消亡所需的时间。
例如,我们可能会在一段时间后,杀死一段光速粒子。
_age:
粒子的当前年龄。
_color:
粒子的颜色。
_isAlive:
布尔值,若为true,表面粒子处于活动状态,否则表明粒子处于死亡状态。
(2)BoundingBox:
该结构是为了一些范围性粒子活动做准备。
它是一个限制粒子的活动范围的外接体。
例如,假定在一个雪粒子系统中,我们想让雪只落在地板周围的某个空间体积内时,我们就可以定义包含了改体积的外接体,然后只需要将那些跃出该外接体的粒子杀死就可以了。
该结构如下
structBoundingBox
{
boolisPointInside(D3DXVECTOR3&p);
D3DXVECTOR3_min;
D3DXVECTOR3_max;
};
isPointInside():
布尔型的函数,该函数是判断粒子是否超出外接体,如果
超出则返回true。
_min:
外接体三维空间的各个最小值。
_max:
外接体三维空间的各个最大值。
(3)Particle:
该结构存储了粒子的位置和颜色信息。
该结构代码如下structParticle
8
3D粒子系统
{
D3DXVECTOR3_position;
D3DCOLOR_color;
staticconstDWORDFVF;
};
_position:
粒子在世界坐标中的位置。
_color:
粒子的颜色。
_FVF:
灵活顶点格式。
在Direct3D中,顶点除了包含空间信息外,还可以包
含其他的附加属性。
例如顶点颜色属性,法线属性。
而Direct3D赋予了我们
自行定义顶点格式的自由。
程序中定义的是空间位置和漫反射颜色属性。
(4)从上面的结构可以看出,程序中定义的结构Particle和Attribute基本
功能类似,那为什么要用两个结构呢,因为一个粒子除了位置和颜色外往往
还有许多其他属性。
例如,粒子可具有一定的速度。
但是,绘制粒子时并不
需要这些附加属性。
所以,我们将用于绘制粒子的数据与粒子属性分别存储
在两个不同的结构中。
当我们要创建、销毁或更新粒子时,需要涉及粒子的
属性;当我们通过准备绘制粒子时,可将粒子的位置和颜色信息复制到
Particle结构中。
3.4.1运动粒子场景介绍
第一介绍的是粒子运动的场景,整个场景的重点是算法与粒子系统结合,使得场景比较有动感,更加贴近现实。
效果图如图3.3
3.3运动粒子效果图
9
3D粒子系统
如果你仔细观察我的运动粒子效果图你会发现其运动的特定时程波浪状的在指定范围里运动。
这里我对粒子的位置(x,y,z)添加了一些算法:
用正弦(sin)或者余弦(cos)的方式来设定粒子的运动路径,如
x=Acos(fThetaHoriz*K)+R
(1)
X:
粒子当前的横坐标。
A:
粒子运动幅度。
fThetaHoriz:
初始为0,范围是0~359的角度,它与timeDelta(画面更新前后的时间差)构成了一个变换的数值(fThetaHoriz+=k*timeDelta(k控制粒子运动快慢系数))。
R:
当前粒子的位置
3.4正弦(sin)与余弦(cos)图
由上图可以看出,正弦和余弦图都是程波浪形,两者在相同的角度有不
同的值,这恰好可以通过赋值给粒子的x,y和z坐标,构成运动粒子在三维空
间里运动。
假设fThetaHoriz=0,fThetaVert=180,通过计算公式估量
出,X=4;Y=4.9;Z=4,随着时间变化(timeDelta),根据上面的正余弦图可
知,cos第一个区间[0,π/2]是递增,sin在第一个区间[π,3π/4]是递减,
所以下一个时间片,粒子的位置大概是X=5,Y=4,Z=5,同理,第三个时
间片,粒子的大概位置是X=6,Y=3,Z=6。
10
3D粒子系统
3.5粒子运动轨迹模拟图
用描点法对各个估量点连起可得一个大概的运动轨迹模型(如图)。
粒子时随着
时间的推移,X坐标先是递减,Y坐标递增,Z坐标递增,而在下一个区间,
可能出现的情况是X坐标递增,Y坐标递减,Z坐标递增,就这样在各个区间
的不断变化,构成了粒子的运动轨迹。
3.4.2雪花飘落和火焰场景介绍
通过考虑,我决定把下雪,地板,天空盒子和火焰共同成一个场景。
场景图如图1.7
3.6雪花飘落和火焰场景
11
3D粒子系统
雪花飘落的原理是通过设定雪花发射器在设定的最高点(_position.y),然后给每个粒子的y坐标随着时间的推移相应的增大,当粒子到了指定最低点(地板)时,或者边缘(