基于粒子系统的雨雪模拟 计算机毕业论文(5)

2018-12-24 12:44

射器,可以使用面发射器,所以用随机函数初始粒子位置的时候使其在一定的范围内,并且在速度上也引入了随机函数,使得降雪效果看起来更逼真。 3.粒子产生的数量

粒子系统中粒子的产生分两部分,一是初始时刻产生的粒子,这部分粒子的数量十分关键,一般较大,它在很大程度上决定了模拟物体的形态;二是为了补充系统中消亡的粒子,每隔一定的时间周期如每帧新生的粒子,这部分粒子数量较少。粒子通过受控的随机过程加入到粒子系统中,在系统确定初始粒子数量时,采用以下方法:

给定粒子数量的平均值和随机变化范围,实际粒子数量如下

NpartSf MeanPartSf + Rand()×VarPartSf

上式中,Rand()是一个返回在-1.0到+1.O之间均匀分布的随机数的过程,MeanPartSf是预先设定的粒子平均数,VarPartSf是预先设定随机数分布范围。

粒子的数量直接关系到图形的逼真度和实现的实时性,是粒子系统最重要的参数之一,它决 定了模拟物体的密度,数目过小,图形将会严重失真,然而失真度与粒子数量并不成严格的线性关系,当粒子数量过多时,计算及绘制的时间增大,又会使粒子系统的实时性严重下降,二者同样不成线性关系。合适的粒子数量仅仅局限在很小的区域中,因此选择合适的粒子数量很关键。一般需根据图形的真实感和实时性在实际中的重要程度,来确定粒子数量的范围。 3.5 粒子的运动

粒子产生并初始化后,粒子根据初始化时速度的大小及方向开始在系统中运动,粒子的运动体现在粒子属性随时间的不断变化。 1.外观属性的变化

粒子的形状与尺寸大小在不发生碰撞的情况下不会发生变化,只有粒子的颜色与透明度随时间推移而不断变化,i帧时刻粒子属性与i+l帧时粒子属性变化规律如下(下文的i与i+1均是此含义):

Colori+l=Colori+ΔColor×Δt Alphai+l=Alphai+ΔA]pha ×Δt

2.空间属性的变化

粒子的空间位置主要由粒子在前一帧时刻的位置、粒子的速度和时间间隔决定:

PositionXi+l=PositionXi+VelocityXi × Δt PositionYi+1=PositionYi+VelocityYi × Δt PositionZi+l=PositionZi+Ve]ocityZi × Δt

3.运动属性的变化

系统在运行过程中,粒子的速度是不断改变的,由经典力学得到粒子在i帧时的速度是由粒子的初速度和粒子所受的合外力决定的,假设粒子在受合外力的作用下产生的加速度为Acceleration,则第i+l帧时粒子的速度为:

VelocityXi+1=VelocityXi+AccelerationXi ×Δt VelocityYi+1=VelocityYi+AccelerationYi ×Δt VelocityZi+1=VelocityZi+AccelerationZi ×Δt

4.生命属性的变化

粒子的寿命随时间的推移不断减少,当前时刻i+l帧粒子的生命周期数为i帧粒子生命周期的衰减变化,如下式所示:

Lifetimei+l=Lifetimei一AttenuationPerframe × Δt

其中AttenuationPerframe是每帧粒子的生命衰减率,表示每经过一帧图像减少的生命周期数。 3.6 粒子的消亡

系统运行随着时间的推移,粒子的生命周期数逐渐减少。当粒子的寿命为零时,即粒子消亡;

17

=

另外由于粒子运动的不规则性,粒子的空间位置超出了预先设定的区域或者超出屏幕所能显示的区域,系统都会认为粒子消亡并删除这些粒子。

对于雨雪粒子来说,当粒子寿命Llyetime=0时,系统删除粒子;另一种情况就是粒子寿命

Lifetime>0,但随着雨雪粒子的不断运动,粒子的透明度降为零时,即完全透明与背景融合,粒子同样消亡。旧粒子消亡,新粒子生成的循环过程反映了雨雪降落的动态特征。 3.7 粒子的绘制

当某一帧的粒子状态被全部确定以后,粒子控制机制就调用绘制函数将其送到显示缓存进行绘制。粒子的绘制和普通图形一样,如果粒子存在于三维空间,那么粒子之间就会存在遮挡、阴影和反走样等问题。如果在二维空间,粒子间就不存在上述的问题,不用考虑粒子的重叠。

[22]

粒子的绘制包括以下几种:点粒子、线性粒子和面粒子的绘制。

[1]

点粒子的绘制:在Reeves提出的粒子系统里,为了简化绘制算法,提出了两条假设。一是假设所有粒子都以点光源绘制,避免了粒子间的相互遮挡和大量粒子三维中的深度排序。在这个假设中还包含一个隐含假设,即粒子光源的光强独立于粒子的视点的空间距离,因此映射到同一个像素点上的粒子的光强可以不用经过深度排序而直接叠加。另一个假设是绘制时只考虑不规则模糊物体本身,即粒子系统中的各个粒子不会与背景环境中的其他物体出现交错、融合和碰撞,只对系统中的粒子进行绘制。这样的假设大大降低了系统的消耗,提高了模拟的实时性。

[7]

线性粒子的绘制:Sims提出了一种适合并行实现的灵活的粒子绘制法。为每一个线性粒子定义了一个头一个尾,头尾都有自己的位置、颜色和透明度等属性,头和尾中间用切线相连,所有的参数都通过从头到尾的线性插值得到。透明度从中心到边缘递减。线性粒子绘制时,首先将粒子的头尾位置和半径换到坐标系,然后将粒子分割为像素基片,按深度进行排序和隐藏计算,最终显示。

[23]

面粒子的绘制:Stolk和van Wijk提出了面粒子的绘制方法。他们把粒子造型为非常小的有向光源面片,用这些面片构造出离散的流面和时面,并将其用于3D流场的可视化。

18

4 系统的设计及实现

本模拟系统基于OpenGL和Microsoft Visual C++ 6.0平台,在Windows环境下开发而成;系统配置为Intel(R) pentium(R)4 2.66Ghz 处理器,1G内存,ATI Radeon X300/X550/X1050 Series 128M显存图形卡。

4.1系统的软件开发平台

Microsoft Visual C++ 6.0包括了综合的微软基本类库(MFC Library),MFC库是Microsoft为利用VC++开发的windows应用程序而提供的应用程序框架,在这个框架的支持下,对于不同的应用程序,编程的主要任务是填写各自特殊部分的代码,这样,可以大大减少编码工作,使得开发windows应用程序变得简单而高效;VisualC++6.O提供有复杂的资源编辑器,可以编辑对话框、菜单、工具栏、图像和其它许多Windows应用程序的组成元素;Microsoft Visual C++ 6.0还有一个非常好的集成开发环境(DeveloperStudio),用它可以在编写C++程序时对程序的结构进行可视化的管理。此外,Microsoft Visual C++ 6.0还提供了一个完全集成的Debug工具,可以让你从各个角度来检查程序运

[24]

行中的微小细节。

Microsoft Visual C++ 6.0不仅仅适用于Windows编程,还为网络编程和数据库编程提供了强大的支持。开放性图形库OpenGL是专业图形处理、科学计算等高端应用领域的标准图形库,最初是美国SGI公司为图形工作站开发的一种功能强大的三维图形机制(或者说是一种图形标准)。它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,它还可以与各种编程语言紧密相接。 4.2 系统的设计路线

本文采用粒子系统模拟雨雪现象,由于自然雨雪具有复杂的与外界在不停的交互,受到风力等的作用,本文在雨雪粒子的基本模型的基础上对雨雪粒子的绘制算法进行了简化。使用长方体的面发射器生成初始粒子系统,采用数组交替计算运动轨迹,采用定时器时间计算粒子生命,内存上也使用数组组织粒子系统。系统总体结构如下图:

图5 系统总体结构图

4.3 系统的实现

4.3.1 雨雪粒子属性设计如下 雨粒子属性代码:

void CMyRainView::InvertWaveMap() { int temp = cmap;

19

}

cmap = nmap; nmap = temp;

水波渲染的代码:

void CMyRainView::DrawWave() { int i, j; glDisable(GL_TEXTURE_2D); glColor4f(1, 1, 1, 0.2); glBegin(GL_TRIANGLES); // 以三角形组近似波和平静的水面, 由两个数组交替计算实现,wavemap数组的值(即y值)含雨和波涟漪 for (i=0; i

glVertex3f(j*2, wavemap[cmap][i][j], i*2);

glVertex3f((j+1)*2, wavemap[cmap][i][j+1], i*2); glVertex3f((j+1)*2, wavemap[cmap][i+1][j+1], (i+1)*2); } } glEnd(); glEnable(GL_TEXTURE_2D); }

雪粒子系统的初始化,即发射器的设置: VOID CGoodView::InitSnow() { srand( GetTickCount() ); for (int nidex=0;nidex

20

for ( int i = 0; i < X; i++ ) { m_snow[ i ].nIndexTexture = rand() % 3; m_snow[ i ].x = GLfloat( rand() % 200 - 100 ); m_snow[ i ].z = GLfloat( rand() % 200- 100 ); m_snow[ i ].y = 100.0f + GLfloat( rand() % 25 ); m_snow[ i ].xrot = 0; m_snow[ i ].yrot = 0; m_snow[ i ].zrot = 0; m_snow[ i ].dropSpeed = 0.01f * ( rand() % 50 + 2 ); m_snow[ i ].rotSpeed = 0.1f * ( rand() % 10 + 2 ); } }

4.3.2系统框架相关的类

本系统中用到以下几个类:

CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。

CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)。

CView视图,这个类是最重要的类,所以下面只给出这个类的类图,如图6。CView类负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息,视图类的代码如下: class CGoodView : public CView {

protected: // create from serialization only CGoodView();

DECLARE_DYNCREATE(CGoodView) public:

CGoodDoc* GetDocument(); // Operations

virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual BOOL PreTranslateMessage(MSG* pMsg); // Implementation

virtual ~CGoodView(); private:

VOID InitOpenGL (); VOID DrawOpenGLScene(); BOOL LoadOpenGLTextures(); BOOL SetupPixelFormat ();

21


基于粒子系统的雨雪模拟 计算机毕业论文(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公车调度及管理调研报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: