基于粒子系统的喷泉模拟_本科毕业论文(编辑修改稿)内容摘要:

的交迭过程的计算机模拟,采用了 OpenGL显示列表 (DisplayLists)方法绘图,优化了程序性能,效果逼真实现了真正的三维实时绘制。 马骏和朱衡君 [25]基于动态纹理和粒子系统实现了对喷泉的模拟,其方法是渲染一定量的图像作为贴图纹理,采用公告板技术和动态纹理技术来实现纹理喷泉的绘制,但缺乏一定的灵活性;赵静谧,张慧 [3]等提出了用 基于粒子系统与 Particle System API的景物模拟方法,并采用 Line方式渲染粒子,结合纹理映射方法对喷泉进行了模拟;张从辉,万华根 [26]从物理建模技术出发构建了音乐喷泉模型。 本论文的技术路线 本文主要根据国内外模拟喷泉的研究现状进行了分析和借鉴。 对粒子系统进行了研究。 结合粒子系统和流体动力学原理,对喷泉粒子系统的原有模型进行了进一步的分析和研究通过对喷泉运动的分析,利用随机粒子在系统中不规则运动来模拟喷泉粒子运动,从而使喷泉粒子的运动更加灵活。 并针对于喷泉模拟效果上进行了 改进。 本论文主要从下面几章阐述利用粒子系统实现喷泉的模拟: 第一章:主要综述了课题的国内外研究现状。 对本文的研究内容、研究目标、研究方法和预期研究结果进行了概述,多层次反应了本课题的科学意义和实用价值。 第二章:提出基于 OpenGL+MFC的建模基础,分析了 OpenGL渲染管道 ,MFC编程框架, 陈述了 基于OpenGL+MFC的三维模拟的编程环境配置。 第三章:主要介绍粒子系统的原理和关键技术包括了粒子的发射,初始状态,生命周期等的控制。 第四章:通过喷泉粒子的运动规律,特征,轨迹 的分析研究 来实现系 统的设计。 并对设计的过程,实现的原理,关键技术和实验结果进行详细 陈述。 第五章: 总结本文方法并给出进一步的研究展望。 6 2 基于 OpenGL+ MFC的建模基础 OpenGL概述 OpenGL 是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。 OpenGL 是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。 1992 年 7 月, SGI 公司发布了 OpenGL 的 版本,随后又与微软公司共同开发了 Windows NT版本的 OpenGL。 1995 年 OpenGL的 版本面市。 20xx 年的 7 月 28 日, SGI和 ARB 公布了 OpenGL。 20xx 年 8 月, 版本发布 ~OpenGL 标准的主要制订者并非原来的 SGI,而是逐渐在 ARB 中占据主动地位的 3Dlabs。 20xx 年 8 月初 Khronos 工作组在 Siggraph 20xx 大会上宣布了OpenGL 图形接口规范, shader 语言和其他新增功能将再次未来开放 3D 接口发展指明方向。 OpenGL API 开发代号为 Longs Peak,和以往一样, OpenGL 仍然作为一个开放 性和跨平台的 3D 图形接口标准,在 Shader 语言盛行的今天, 增加了新版本的 shader 语言: GLSL ,可以充分发挥当前可编程图形硬件的潜能。 20xx 年 3 月又公布了升级版新规范 OpenGL ,也是这套跨平台免费 API 有史以来的第九次更新。 20xx 年 8 月 Khronos 小组发布了 OpenGL ,这是一年以来 OpenGL进行的第三次重要升级。 Khronos旗下的 OpenGL ARB(Architecture Review Board)工作组推出了 GLSL Language(OpenGL 着色语言 )的升级版,以及在 框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版 OpenGL 之间的兼容性。 OpenGL渲染管道 绝大多数 OpenGL的实现都有一个的相类似的操作顺序,一系列处理阶段称为 OpenGL渲染管道。 如图 1 显示了 OpenGL处理数据的过程。 几何数据(顶点、线、多边形)跟随着这些路径通过这些代表求值程序和每一个顶点操作的盒子,而像素数据(像素、 图像、位图)的部分加工处理过程有些不同。 在将最后的像素数 据写到帧缓存前,两种类型的数据都要经过最后相同的步骤(光栅化和片段操作)。 图 1 OpenGL渲染管道 下面我们更为详细的介绍 OpenGL 渲染管道 的一些关键阶段。 求值器 所有的几何图元最终都要通过顶点来描述。 参数化曲线和表面最初可能是通过控制点以及成为基函数 (Basic function)的多项式函数进行描述的。 求职器提供了一种方法。 根据控制点计算表示 显示 列表 求值器 基于 顶点 操作与 图元 装配 光栅化 逐 片断操作 帧缓存 像 素 操作 纹理装配 顶点数据 像 素数据 7 表面的顶点。 这种方法是一种多项式 映射,它可以根据 控制点产生表面法线、纹理坐标、颜色以及空间坐标。 基于顶点的操作 对于顶点数据,接下来的一个步骤就是 基于顶点的操作 ,就是把顶点变换为图元。 有些类型的顶点数据 (例如空间坐标 )是通过一个 4*4 的浮点矩阵进行变换的。 空间坐标从 3D 世界的一个位置投影到屏幕上的一个位置。 如果启用了高级特性,这个阶段将更为忙碌。 如果使用了纹理,这个阶段还将生成并变换纹理坐标。 如果启用了光照,就需要综合变换后的顶点,表面法线,光源位置,材料属性以及其他光照信息进行光照计算,产生最终的颜色值。 图元装配 图元装配的一个主要内容就是剪裁,它的任务是消除位于半空间 (halfspace)之外的那部分几何图元,而这个半空间是由一个平面所定义的。 点剪裁就是简单地接受或拒绝顶点,直线或多边形剪裁则可能需要添加额外的顶点,具体取决于直线或多边形是如何进行剪裁的。 在有些情况下,接下来需要执行一个称为透视除法 (perspective division)的步骤。 它使远处的物体看起来比近处的物体更小一些。 接下来所进行的是视口 (viewport)和深度 (z 坐标 )操作。 如果启用了剔除功能(culling)并且该图元是个多边形,那么 它就有可能被剔除测试所拒绝。 取决于多边形模式,多边形可能被画成点的形式或者直线的形式。 这个阶段所产生的结果就是完整的几何图元,也就是根据相关的颜色,深度 (有时还有纹理坐标值以及和光棚化处理有关的一些指导信息 )进行了变换和剪裁的顶点。 像素操作 在 OpenGL 的渲染管线中,和单路径的几何数据相比,像素数据所经历的流程有所不同。 首先,来自系统内存的一个数组中的像素进行解包,从某种格式 (像素的原始格式可能有多种 )解包为适当数量的数据成分。 接着,这些数据被缩放、偏移,并根据一副像素图进行处理。 处理结 果先进行截取,然后或者写入到纹理内存,或者发送到光棚化阶段。 如果像素数据时从帧缓冲区读取的,就对他们执行像素转换操作 (缩放、偏移、映射和截取 )。 然后,这些结果被包装为一种适当的格式,并返回到系统内存的一个数组中。 OpenGL 有一种特殊的像素复制操作,可以把数据从帧缓冲区复制到帧缓冲区的其他位置或纹理内存中。 这样,在数据写入到纹理内存或者写回到帧缓冲区之前,只需要进行一道像素转换就可以了。 纹理装配 OpenGL 应用程序可以在几何物体上应用纹理图像,使它们看上去更为逼真。 如果需要使用多幅纹理图 像,把它们放在纹理对象中是一种明智的做法。 这样,就可以很方便地在他们之间进行切换。 有些 OpenGL 实现拥有一些特殊的资源,可以加速纹理的处理。 这种资源可能是专用的,高性能的纹理内存。 如果确实拥有这种内存,纹理对象可能会优先进行处理,以控制这种有限和宝贵的资源的使用。 光棚化 光棚化就是把几何数据和像素数据转换为片断 (fragment)的过程。 每个片断方块对应用于帧缓冲区中的一个像素。 把顶点连接起来形成直线或者计算填充多边形的内部像素时,需要考虑直线和多边形的点画模式,直线的宽度,点的大小,着 色模型以及用于支持抗锯齿处理的覆盖计算。 每个片断方块都将具有各自的颜色和深度值。 片断操作 在数据实际存储到帧缓冲区之前, 将要执行一系列的操作。 这些操作可能会修改甚至丢弃这些片断。 所有这些操作都可以被启用或禁用。 第一个可能遇到的操作是纹理化。 在纹理内存中为每个片断生成一个纹理单元 (texel,也就是 8 纹理元素 ),并应用到这个片断上。 接着可能进行的是雾计算,然后是剪裁测试, alpha 测试,模板测试和深度缓冲区测试 (深度缓冲区用于消除被隐藏的表面 )。 如果一个片断无法通过一个启用的测试,它的连续处 理过程可能会被中断。 随后,将要执行的可能是混合,抖动,逻辑操作以及根据一个位掩码的屏蔽操作。 最后,经过完整处理的片断就被绘制到适当的缓冲区,最终成为一个像素并到达它的最终 归宿。 MFC 概述 MFC,微软基础类 (Microsoft Foundation Classes), 用于在 C++环境下编写应用程序的一个框架和引擎。 该类库提供一组通用的可重用的类库供开发人员使用。 大部分类均从 CObject 直接或间接派生,只有少部分类例外。 MFC 类库作为 C++与 Windows 的接口,建立在 Win32 应用程序编 程接口 API 之上,封装了大多数的 API 函数,主要是 API 中与程序结构相关的部分和最常用的部分。 MFC 还封装了重要的 Windows扩展,如 COM, ActiveX, ODBC 和 Inter APIs,为这些难以编程实现的功能提供了简便方法。 MFC 中的各种类结合起来构成了一个应用程序框架,让程序员在此基础上来建立 Windows 下的应用程序。 MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。 Visual C++提供了相应的工具 来完成这个工作: AppWizard 可以用来生成初步的框架文件(代码和资源等);资源编辑器用于直观地设计用户界面; ClassWizard 用来协助添加代码到框架文件;最后进行编译,则通过类库实现了应用程序特定的逻辑。 在 MFC 编程中,入口函数 WinMain()被封装在 MFC 的应用程序框架内,已经不用也不可以再定义为另一个 WinMain()函数。 MFC 编程最好的办法是使用 MFC 的应用程序向导工具 AppWizard。 AppWizard 为程序员提供了一种快捷方便的工具来定制基于 MFC 的应用程序框架,程序员只需以此为 基础,添加与修改程序代码来实现所需功能。 MFC 是一个编程框架, MFC 中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立 Windows 下的应用程序,这是一种相对 SDK 来说更为简单的方法。 因为总体上,MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。 Microsoft Visual C++提供了相应的工具来完成这个工作: AppWizard 可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮 助直观地设计用户接口; ClassWizard 用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。 MFC 编程框架具有如下特点 : 封装 构成 MFC 框架的是 MFC 类库。 MFC 类库是 C++类库。 这些类或者封装了 Win32 应用程序编程接口,或者封装了应用程序的概念,或者封装了 OLE 特性,或者封装了 ODBC 和 DAO 数据访问的功能,等等,分述如下。 ( 1)对 Win32 应用程序编程接口的封装 用一个 C++ Object 来包装一个 Windows Object。 例如: class CWnd 是一个 C++ window object,它把 Windows window(HWND)和 Windows window 有关的 API 函数封装在 C++ window object 的成员函数内,后者的成员变量 m_hWnd 就是前者的窗口句柄。 ( 2)对应用程序概念的封装 使用 SDK 编写 Windows 应用程序时,总要定义窗口过程,登记 Windows Class,创建窗口,等等。 MFC 把许多类似的处理封装起来,替程序员完成这些工作。 另外, MFC 提出了以文档 视图为中心的编程模式, MFC 类库封装了对它的支持。 文档是用户操作 的数据对象,视图是数据操作的窗口, 9 用户通过它处理、查看数据。 ( 3)对 COM/OLE 特性的封装 OLE 建立在 COM 模型之上,由于支持 OLE 的应用程序必须实现一系列的接口( Interface),因而相当繁琐。 MFC 的 OLE 类封装了 OLE API 大量的复杂工作,这些类提供了实现 OLE 的更高级接口。 ( 4)对 ODBC 功能的封装 以少量的能提供与 ODBC 之间更高级接口的 C++类,封装了 ODBC API 的大量的复杂的工作,提供了一种数据库编程模式。 继承 首先, MFC 抽象出众多类的共同特性,设计出一些基 类作为实现其他类的基础。 这些类中,最重要的类。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。