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

2018-12-24 12:44

tdoc.h Tview.h 定义了从CDocument派生的文档对象CTDoc 定义了从CView派生的视图对象CTView 表2 AppWizard所生成的实现文件

实现文件 stdafx.cpp t.cpp 所包含的头文件 #include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\#include\实现的内容和功能 用来产生预编译的类型信息。 定义CTApp的实现,并定义CTApp类型的全局变量theApp。 childfrm.cpp 实现了类CChildFrame childfrm.cpp 实现了类CMainFrame tdoc.cpp 实现了类CTDoc tview.cpp 实现了类CTview 从表2中的包含关系一栏可以看出:CTApp的实现用到所有的用户定义对象,包含了他们的定义;CView的实现用到CTdoc;其他对象的实现只涉及自己的定义;

当然,如果增加其他操作,引用其他对象,则要包含相应的类的定义文件。 2.4基于OpenGL+MFC的三维模拟的编程环境配置 1.创建MFC项目

①创建项目文件。选择File|New菜单项,新建一个基于对话框的项目文件MyDlgOpenGL; ② 修改对话框模板。删除对话框中的静态文本,调整控件的位置; 2. 配置基于OpenGL+MFC的开发环境

①将glu.dll,glu32.dll,glut.dll,glut32.dll,opengl32.dll文件拷贝到操作系统WINNT/System32目录下。

②将gl.h,glaux.h,glu.h,glut.h拷贝到Microsoft Visual Studio/VC98/Include/GL目录中中。

③将glaux.lib,glu32.lib,glut32.lib,opengl32.lib拷贝到Microsoft Visual Studio/VC98/Lib目录中。

④添加OpenGL开发库文件到项目:在编译程序的时候选择Project|Setting菜单,在Link标签中的Object/library modules编辑框中输入“opengl32.lib, glut32.lib ,glu32.lib,glaux.lib”。 ⑤创建新类,添加消息映射。选择View|ClassWizard菜单项,打开MFC对话框,在Add Class之中选择New,以便添加一个新类COpenGL,且该类的基类选择generic CWnd;最后利用MFC

12

ClassWizard为COpenGL类添加消息WM_CREATE,WM_PAINT的映射。 3.初始化OpenGL

①设置像素格式:为CMyTestView类添加成员函数BOOL bSetupPixelFormat(void),用于与OpenGL 相关的设置

/*定 义 像 素 存 储 格 式 */ PIXELFORMATDESCRIPTOR pfd = {

sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小 1, // 版本号

PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 PFD_SUPPORT_OPENGL | // 支持 OpenGL PFD_TYPE_RGBA, // RGBA 颜色模式 24, // 24 位颜色深度 0, 0, 0, 0, 0, 0, // 忽略颜色位

0, // 没有非透明度缓存 0, // 忽略移位位 0, // 无累加缓存 0, 0, 0, 0, // 忽略累加位

32, // 32 位深度缓存 0, // 无模板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主层 0, // 保留

0, 0, 0 // 忽略层 , 可见性和损毁掩模 };

int pixelformat;

if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 ) {

MessageBox(\return FALSE; }

if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE) {

MessageBox(\return FALSE; }

return TRUE;

②初始化创建OpenGL RC:hrc = wglCreateContext(m_pDC->GetSafeHdc()); wglMakeCurrent(m_pDC->GetSafeHdc(), hrc); 并 添加WM_CREATE 消息处理函数,然后在 OnCreate函数中进行调用:

// TODO: Add your specialized creation code here Init();

③初始化的获取dc:m_pDC = new CClientDC(this); ASSERT(m_pDC != NULL);

④设置OpenGL视锥体即投影变换矩阵

glMatrixMode(GL_PROJECTION); //在修改前重设坐标系 glLoadIdentity();

13

⑤设置视口变换:

// Set the viewport视口 to be the entire window glViewport(0, 0, w, h);

gluPerspective(45,ratio,1,1000); ⑥设置OpenGL模型变换

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); 4.实现应用程序逻辑

在本雨雪粒子系统中为CMyTestView 类添加了许多成员函数:InvertWaveMap()函数来编程下雨效果;DrawWave()函数用来编程雨粒子下落时的水波属性;LnitializeOpenGL()行数用来编程初始化openGL场景;OnSize()函数用来添加窗口缩放时的图形变换函数;OnTime()用来添加定时器响应函数和场景更新函数;Lnit()函数用来编程雪粒子属性。 5.清理工作:(析构函数中释放dc,rc指针) void CMyRainView::OnDestroy() {

CView::OnDestroy();

// TODO: Add your message handler code here }

14

3 粒子系统

3.1 粒子系统概述

粒子系统(Particle System)是用于不规则模糊物体建模的一种方法,1983年由Reeves首次提出[1]

。粒子系统在模拟不规则模糊物体方面具有独特的优点,是传统图形学建模方法所不能相比的。粒子系统是由大量结构简单的粒子图元构成,每个粒子都有各自的属性,如大小、颜色、位置、运动速度和生命周期等;粒子系统是一个动态实体,每个粒子的属性均是时间的函数,随时间的推移而不断变化,组成粒子系统的有效粒子的属性共同确定了被模拟物体的特征。粒子的这种动态变化体现了不规则模糊物体运动的随机性,因此粒子系统是迄今为止模拟不规则模糊物体最为有效的一种建模方法。

3.2 粒子系统的原理

粒子系统的基本原理是采用大量的、具有一定生命和属性的微小粒子图元作为基本元素来绘制不规则的模糊物体对象.在粒子系统中,粒子图元的形状可以是小球、立方体、正四面体或其它的形体。此外每个粒子还具有大小、颜色、透明度、位置、运动速度和运动方向、生命周期等属性。粒子在系统中要经过“产生”、“运动”和“消亡”三个阶段,在这三个阶段中粒子的大小和形状随时间变化,其它性质如粒子的透明度颜色和运动都将随机变化,从而充分体现出不规则物体的动 态性和随机性。粒子系统理论主要由以下5部分组成心引:

1.物质的粒子组成假设。粒子系统中,把运动的模糊物体看作由有限的具有确定属性的流动粒子所组成的集合,这些粒子以连续或离散的方式充满它所处的空间,并处于不断的运动状态,粒子在空间和时间上具有一定的分布。

2.粒子独立关系假设。这里包含两个意思,一是粒子系统中各粒子不与场景中任何其它物体相交,二是粒子之间不存在相交关系,并且粒子是不可穿透的。

3.粒子的属性假设。系统中的每个粒子并不是抽象的,它们都具有一系列的属性,比如质量属性、存在的空间位置属性、外观属性(如颜色、亮度、形状、尺寸等)、运动属性(如速度、加速度等)、生存属性(生命期),其中颜色、亮度等属性随着时间不断地发生变化。

4.粒子的生命机制。粒子系统中的每一个粒子都具有一定的生命周期,在一定的时间周期内,粒子经历新生、活动和消亡三个基本生命历程。

5.粒子的运动机制。粒子在存活期间始终是按一定的方式运动的。 3.3 粒子的属性初始状态

对于每个粒子,系统都要赋予其一定的属性,粒子的属性决定了粒子的状态,I对于模拟不同对象的粒子,粒子的属性没有统一的标准,通常是在满足基本视觉效果的前提下建立比较简单的模型,主要包括外观属性、空间属性、运动属性、生命属性等。 1.外观属性

外观属性包括粒子的形状、尺寸和颜色,它们共同决定了系统对不规则模糊物体模拟的逼真程度。 (1)粒子形状:Reeves的经典粒子系统将粒子的初始形状设置为点,即使用点光源进行建模,在实现时只需用一个像素来显示点,这是最简单的粒子系统模型;在较复杂的粒子系统中,单个粒子的形状可以采用线段、多边形、圆形、椭圆形和球形等复杂元素来取得较好的视觉效果。

(2)粒子尺寸:粒子尺寸的大小是与粒子形状同时被确定的,粒子尺寸越大,生成的图形真实感越差,但由于计算量减少,系统的实时性提高了,相反,如果减小粒子的尺寸,则提高了图像的分辨率,增强了真实感,但计算量也将同时增加,因此导致实时性下降。在具体实现的过程中,粒子尺寸的大小体现了图像真实感和系统实时性的折衷。

(3)粒子颜色:粒子的初始颜色由系统设定,粒子从生成到消亡的过程中,粒子颜色从初始颜色变成消亡颜色,体现了颜色分布的物理特性。粒子的初始颜色分量包括粒子的三原色(R,G,B)和粒子的透明度值(Alpha),粒子颜色的初始值由下式确定:

15

InitialColor(R,G,B)=MeanColor(R,G,B)+Rand()×VarColor(R,G,B) InitialColor(Alpha)=1.0

系统根据被模拟对象的物理特征来确定粒子颜色的透明度,Alpha的取值范围为(0,1)的实数,式InitialColor(Alpha)=1.0中Alpha取值1.0,表示粒子的颜色最亮,即完全不透明。 2.空间属性

空间位置属性包括初始位置坐标和方向。在一个粒子系统中通常有几个参数来确定粒子的初始位置,首先是粒子在三维空间中的几何坐标(x,y,z),它确定了粒子在空间中的方位,其次是粒子在空间中的方向,它由粒子的本地坐标系统旋转得到,可表述为一个二维向量(angx,angy),分别表示粒子绕由粒子中心决定的本地坐标系的x轴和y轴旋转的角度。如图4以球形粒子为例描述了粒子的初始位置。

图4 粒子的初始位置

3.运动属性

运动属性是指粒子的运动速度,粒子的初始运动速度由大小和方向两部分组成:

InitialVelocity=MeanVelocity+Rand()×VarVelocity

MeanVelocity和VarVelocity分别表示粒子的平均速度和随机速度变化范围。粒子的速度方向由粒子系统模拟的物体物理特征确定,通常是某个固定方向或某个区域内的随机方向。 4.生命属性

新粒子生成时都被系统赋予了生命周期(Lifetime),生命周期是用来计算粒子在系统中的存活时间,随着时间的推移,不断有粒子消亡同时不断有新粒子生成,生命周期(粒子寿命)用粒子在系统中存活的帧数来表示。 3.4 粒子的生成

粒子的产生包括粒子产生的时间、粒子产生的空间以及数量。 1.粒子生成的时间

通常粒子系统在初始化的时候就生成了一定数量的粒子,这部分粒子很大程度上决定了模糊物体的形态。在系统运行的过程中,每隔一定时间周期生成新的粒子并加入系统中。 2. 粒子产生的空间

确定了粒子的生成时间后,要确定的是粒子生成的空间。粒子生成的空间是指系统选取一定的区域范围来生成新的粒子,根据粒子系统所模拟的对象不同而有所区别,雨雪粒子产生区域是长方体发

16


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

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

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

马上注册会员

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