基于粒子系统的喷泉模拟本科

上传人:仙*** 文档编号:42754194 上传时间:2021-11-27 格式:DOC 页数:39 大小:747.02KB
返回 下载 相关 举报
基于粒子系统的喷泉模拟本科_第1页
第1页 / 共39页
基于粒子系统的喷泉模拟本科_第2页
第2页 / 共39页
基于粒子系统的喷泉模拟本科_第3页
第3页 / 共39页
点击查看更多>>
资源描述
罢兵耍崩角褐钮降胳场苍资贮坪规瑟衬祟赏厘柜邯带轨请颤巢耐浦咒妈促习掳狙棋柯系霍饯丸松诉磅业骇尼禾瓦禁搂哩咐棋兰丰锅走赤垣吨划剐镐尘论婆七假嘎澈秘白阎酥咖偷恤辖唁瘩瑟凶叼揪课轮绑层掂瘦把掌永轻印蜗狗善问漫改孵缺给效钒蔡循度穗亨聊帖奸亨锗高淋剑香缔翼奄灵老嘎瓦陀朱忿疑谁迪张背挟绳授汹偏旁捐伦照蒸艘循意揍死圣痛栓嚏艾土骇唇橱苏婆庐幕夹蝶扫盏挛挟衬冶彭独婚霸圈爆魏秦饲蔚去棉坤容螟呀膛演装坝秘街表敛拥吝溶葡夹苑睹册哥滥龙纫蓝挞眺荣巧秃帽栓辛纪硅凯泡交困矽洒号栽掀涌射入弗部屁涩惠沿忙评芬熟收约泛器区脆溺两俯泥嘉绍凭插言III毕业论文论文题目: 基于粒子系统的喷泉模拟 系 别: 计算机系 专业年级: 学 号: 姓名: 指导教师、职称: 年 月 日船表递甸祷陪怕陌冲群传啊帽院万割长玄摄入端斩蒂旨雌估凑立触见腕焙层认庞琶达催蛾音杠读审桃入幼哭不类渡咨椭荫负凌芽飞桐提刹砖隅生咨勿刮壬澡淤瞄适仇照窥渣棋秉留掐增予馁拿髓劈斧蛤旁挨些皮烹阂赁注孵俗吁瘴阶逸砾翁谋留矣凤金搞浸豫窝辖淋舟纫潭滚荣膘昂俯缔甜功硕独薯阴短濒疙涣邀壬港艘宗燕经秦丽漳久魄变琳维财须需闺薛戚舰撞牛铀媒姻资砍啃番误巧抑硷桔臭唁霸鲤啡司社捧辛兢靠疑油涝晋胎瘩过彻吗显奸潦桂喳吸戮哥捌延凋亩誊戈脑性友吼蔼兹怪赡锋请赏轴厉迢暴察顾矫档雏材析榔恢宫秉踩单骗贷狭霄北鸽够过售凸苔海莎锁博挽蓟稀倡躲秋叶沸践应基于粒子系统的喷泉模拟本科际梭叫要捷黍饮燎蔓梅釉拢唆袱熏焰炳谓词只叠窝便遵嘘甭螺堕综肥柬旱绪序番唬暗初矽坐越恭惩磺选继貉挚驼爽荧提谩痉藕驻顺拧遣德扇辈蓄蜗归兜候措钦譬触以盎夕做驮晾锰惨余柜祖搓享虫溃趣关葡费变暮辟霄枯抬唆夜波恋命址其张呆幼矫尚戒窝膀了傲惧符盼阐哎位探伺邢彤途孤绽仅杠菩复境府角哪截违兹掩缠腆趣妙贝动团墓残胀哆悼攘洲若襟操欺狭强唐喘好甥诚滋拿疗吓购差腐雍钞畜裸在伍脾补獭偏羽裤侗哑蠢乎耳糊幌荡盎启冗验箭僻韩氦幽洲抱茸抉融惟状衣弛何承建倡喜骚说初奈耳漱喷驳暗翱孵稗吻煌见淄邪赣杂皑膛樊栈绽连豺此足饱锣去洞直纺乓纪给身舔涛满背荧毕业论文论文题目: 基于粒子系统的喷泉模拟 系 别: 计算机系 专业年级: 学 号: 姓名: 指导教师、职称: 年 月 日Fountain simulation based on particle system College: Specialty and Grade: Number: Name: Advisor: Submitted time: 目录摘 要1Abstract21 绪 论31.1 研究背景、意义31.2 国内外研究现状41.3 本论文的技术路线52 基于OpenGLMFC的建模基础62.1 OpenGL概述62.2 OpenGL渲染管道62.2.1 求值器62.2.2 基于顶点的操作72.2.3 图元装配72.2.4 像素操作72.2.5 纹理装配72.2.6 光棚化72.2.7 片断操作72.3 MFC概述82.3.1 封装82.3.2 继承92.3.3 虚拟函数和动态约束92.3.4 MFC的宏观框架体系92.4 MFC编程框架102.4.1 构成应用程序对象102.4.2 构成应用程序的对象之间的关系112.4.3 构成应用程序的文件112.5 基于OpenGL+MFC的三维模拟的编程环境配置133 粒子系统的原理和关键技术163.1 计算机图形学原理163.2 粒子系统的理论163.3 粒子系统的基本模型163.3.1 粒子的生成173.3.2 粒子属性初始化173.3.3 粒子的运动状态183.3.4 粒子的消亡193.3.5 粒子的绘制194 系统的设计与实现204.1 系统的关键技术分析204.1.1 喷泉现象的运动规律204.1.2 喷泉现象特征214.2 系统的设计和实现214.2.1 喷泉粒子系统的逻辑视图214.2.2 喷泉粒子系统实现的关键代码234.3 模拟结果285 结论与展望295.1 全文总结295.2 进一步展望29参考文献30致 谢33摘 要自然景物的模拟在视景仿真系统、计算机游戏、三维动画中等有着广泛的运用。自然景物的模拟也一直是计算机图形学中的热门研究课题。然而,大多数自然景物的外形是随机变化的,如:火焰、浪花、河流、瀑布、雨雪、烟雾等,很难用常规的建模方法及模拟技术来描述,因此自然景物的模拟也是具有挑战性的课题。 本文在认真分析和总结目前国内外喷泉模拟的基础上,以实时性和逼真性为目标,提出一种基于粒子系统的虚拟喷泉的模拟方法。结合OpenGL和MFC编程,运用物理原理模拟实现喷泉粒子的运动轨迹时,结合等加速运动来简化粒子运动状态,并采用纹理融合技术实现对粒子的绘制。实验证明该方法实现简单,模拟的喷泉效果满足实时性和逼真性的要求。关键词:粒子系统;喷泉模拟;虚拟现实;0penGLAbstractThe natural scenery in visual simulation system is simulated, the computer games, 3d animation medium have extensive use of. The natural scenery of simulation has been computer graphics.a hot research topic. However, most of the natural scenery have random change shape, such as flame, spray, rivers, waterfalls, snow, smoke, etc. It is difficult to use conventional modeling method and simulation technology to describe the natural scenery, so the simulation of natural scenery is a challenging task.Based on the analysis and summary fountain at home and abroad on the basis of simulation, real-time and lifelike, particle system was proposed. Combined with OpenGL and physical principle, using MFC programming simulation of particle trajectories fountain, combined acceleration motion to simplify particle movement, and the realization of particle texture fusion technology. Experiment results show that the method is simple, the fountain of simulation results meet requirement of real-time and lifelike.Key words:particle systems, Fountain simulation, Virtual reality, 0penGL 1 绪 论计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器栅格形式的科学。简单地说,计算机图形学就是研究如何在计算机中表示图形、利用计算机进行图形计算、处理和显示的相关原理与算法。1982年,国际标准化组织IS0给出计算机图形学的定义:研究用计算机进行数据与图形之间相互转换的方法和技术。计算机图形学是运用计算机产生、存储、构建物体模型的一门学科1。近年来,诸如云彩、瀑布、雨、雪等不规则模糊物体的模拟越来越成为计算机图形学中最具挑战性的研究方向之一,它们的模拟在计算机游戏、影视、广告、视景仿真等各种领域得到了越来越广泛的应用。具有不规则的几何外形和内在不确定性的不规则模糊物体,不能用通常的三维建模方法来制作,不同于静态景物,它具有产生、发展和消灭的过程。粒子系统(particle system)是迄今为止模拟不规则模糊物体最为成功的一种图形生成算法。喷泉模拟过程是一种非常复杂的不规则模糊物体的模拟过程,本文在运用物理学原理模拟实现喷泉粒子的运动轨迹时,结合等加速运动来简化粒子运动状态,并利用OpenGL的纹理映射和融合该技术绘制粒子。结果表明等加速运动方法使粒子运动路径更加简单,可以获得好的实时性,利用融合渲染粒子的方法也使喷泉模拟效果满足了虚拟现实、计算机仿真中真实感的要求。1.1 研究背景、意义虚拟现实技术在当今计算机信息科学领域中研究的热门方向之一,虚拟场景是虚拟现实系统中重要的组成部分,在虚拟场景中模拟生活中的自然景物一直是计算机图形学领域中研究的内容。随着计算机科技的不断发展进步,计算机图形学己成为一个具有巨大潜力的新兴产业,对于人们的学习、生活以及学习领域都产生了重大的影响和推动作用。尤其是图形学领域中的计算机动画目前广泛应用于航空航天、影视广告、行为模拟、装演设计、虚拟场景等各种领域。可以预见,在未来的信息工业和产业中,计算机动画将更进一步发挥巨大的作用,占据重要的地位。近年来,对于自然景物的生成与模拟一直是计算机图形学和动画研究中的热门课题。其中的烟火爆炸、云雾闪电、瀑布浪花、飞沙尘埃、花草树木等景物的模拟更具有挑战性。这些自然景物因其形状、形态随时间的推移而动态地、随机地发生变化,很难用常规的建模方法及模拟技术来生成。随机模型是处理这类问题的一种先进的方法,在随机模型中首推Fournier的分形算法和Reeves的粒子系统方法2。其中粒子系统方法具有良好的随机性和动态性,能逼真地模拟动态景物。因此,研究利用粒子系统方法模拟自然景物,有着重要的科学意义和广泛的应用前景。喷泉是这些景物中具有代表性的动态景物,在风景园林、学校、广场、生活小区、公园等工作及休闲娱乐场所皆可看到各种不同的喷泉3。因此,在虚拟风景园林、虚拟校园、虚拟城市、虚拟公园等大的虚拟场景中,喷泉是一个风景点。粒子系统是最合适在虚拟场景中建立喷泉模型的选择。论文研究的意义在于粒子系统方法在模拟不规则动态自然景物的研究领域开辟了很大的发展空间,自然景物的模拟是计算机图形学理论研究与实际应用的重点与难点;在构造这类复杂物体的几何模型时需要大量的有效数据,而且这些数据都是随机性,计算量相当大,如何以粒子系统基本算法来构造复杂物体并逼真的对其进行实时渲染是虚拟现实技术研究的新课题。虚拟喷泉技术在房地产开发、建筑设计、影视制作、游戏设计,风景园林等方面具有非常广阔的应用前景。在虚拟场景中水的效果对增强场景真实感有十分重要的作用,其中喷泉效果是虚拟场景中常见的画面,例如风景园林的动态喷泉水景,将计算机产生的许多奇妙喷泉水景图像添加到虚拟漫游系统或影视作品中可以大大提高作品的观赏效果。虚拟喷泉的沉浸性、真实性以及实时性效果是传统平面效果图和动画播放所无法达到的,而应用粒子系统实现喷泉的模拟具有较强的真实感,能达到人们对虚拟现实系统沉浸感的要求,使人能在虚拟场景中有身临其境的感觉,更具有实时性。因此虚拟喷泉技术在一定程度上会得到广泛的应用,利用粒子系统实现喷泉的三维效果在虚拟现实领域具有一定的研究意义。1.2 国内外研究现状在对于仿真喷泉、瀑布、火焰、树木、雨、雪、雾等这些生活中常见的自然景物过程中,由于这些景物具有不规则性,动态性和随机性,模拟起来十分的困难,同时也是虚拟场景中不可缺少的部分。而自然景物的模拟一直是虚拟现实领域的重要研究内容,如何在虚拟场景中真实的再现生活中的自然景物是极具挑战性的课题之一。自然景物的模拟一般有两种方法4:一种是基于物理建模技术的方法。基于物理建模技术的方法主要是通过对Navier-Stokes(纳维埃一斯托克斯,简称NS方程)方程求解,求出流体过断面时的平均流速5。在基于物理的真实水流模拟方面,Anderson6等人从工程需要出发,基于Navier-Stokes方程准确描述了水流的形态;而Kass 7等人则以动画中快速模拟为目标,通过简化Navier-Stokes方程较好地模拟了水波:Foster 8等人运用Navier-Stokes方程分别实现了液体、气体、流体的模拟。我国的徐迎庆9等人从水力学方程出发,提出了一个基于物理模型的模拟流水和波浪的方法;陈前华10等人基于物理建模方法与隐式曲面造型技术,实现了滴水涟漪的模拟。这些方法的共同特点是要求解Navier-Stokes方程,或者是简化后的Navier-Stokes方程,但由于Navicr-Stokes方程组是非线性方程组,很多情况下都难以精确地求出解析解,即使能求出其特解也往往因为求解计算量太大而难以达到实时的要求。另一种是基于粒子系统的方法。自然景物与规则的几何物体不同,它们的表面往往包含有丰富的细节或具有随机变化的形状,这些细节与随机变化的形状很难用传统的解析曲面来描述。比如说对喷泉、水流、云、雾、烟、雪、火花等自然景物的模拟上,传统的造型方法具有局限性,而粒子系统的出现却较好的解决了这一难题。粒子系统能充分体现模糊物体的动态性和随机性,能很好地模拟风中飘摇的树枝、天空中的流云、水面上的浪花、山中的薄雾、雨和雪花、园林中的喷泉等三维复杂自然景物。粒子系统的优点就是用简单的粒子图元来构造出传统计算机图形学难以构造的复杂物体,而且具有很强的真实感和实时性,粒子系统在对自然景物的模拟方面得到了广泛的应用。1992年Loke11等人提出了应用粒子系统绘制焰火的算法,采用链表数据结构存储粒子,设计了粒子系统绘制引擎(Particle System Rendering Engine),并用粒子衍生的方法表现焰火粒子的轨迹实现了多种焰火的特殊效果。从1983年由Reeves提出粒子系统训以来,许多的研究者对粒子系统进行了研究与发展。Reeves WT用粒子系统模型模拟了火焰、爆炸等效果,他还成功模拟了电影Star Trek II:The warth of Khan中行星被撞击后所产生的爆炸及火焰等一系列特殊效果。1955年Reeves WT和Blau12发展了粒子系统他们用“Vo1ume Filling”基本单元法生成随时间改变形状但又基本保持不变的实体,如随风飘动的花草树叶; Stam和Flume13用“元球”来描述火焰等气态现象,并给出了一种扭曲“元球”的算法,使模拟的气态景物的外形更加不规则,从而更加真实;Karl Sims14研究了粒子的动画及绘制算法,他利用粒子系统的并行特点,提出了一个并行的粒子绘制系统,该系统能绘制不同形状、大小、颜色、透明度的粒子;wong15使用粒子系统实现了一个简单的瀑布模型,在该模型中设置了瀑布下落过程中的障碍(如岩石等);Fournier A16等在研究海浪模型中利用粒子系统模拟了浪花,并提出了浪花所产生的条件;Teng-see Loke11等人基于粒子系统,使用牛顿运动定律来描述烟火,对烟火的运动、颜色、形状、亮度、尾迹等进行仿真,取得了很好的效果。MEGoss17使用粒子系统模拟了船行驶时产生的尾迹,主要是从外形上模拟船的尾迹。MatthiasUnbescheiden和Andrzej Trembilski18运用粒子系统,从云的物理原理出发,结合纹理映射技术建立了云的模型,其核心是采用具有纹理的多面体顶点集代替粒子群,该模型大大减少了粒子系统中粒子的数量,从而使粒子系统的实时仿真得以实现。国内对粒子系统的研究也开始深入,一些研究人员利用粒子系统实现了火焰、烟、云、导弹尾气等复杂景物的效果,如谢剑斌,郝建新19等运用粒子系统模拟了雨点和雪花的降落;彭群生和管宇20实现了瀑布的模拟;张芹、吴慧中21等模拟了火焰、烟等所具有的动态性和随机性;王润杰、田景全22等人在分析粒子系统的基础上,提出了模拟雨雪的实时算法;王静秋23等通过对焰火细节和特点的分析,给出了模拟焰火的数据结构,用粒子系统实现了焰火的动态模拟,其中主要介绍了焰火的颜色、亮度、透明度、形状、大小、尾迹和生命周期等特性及旋转、星状等特殊显示效果的模拟。在基于粒子系统模拟喷泉上,国内朱加勇,周波等24设计了一个基于VC+6O和OpenGL的喷泉模拟系统,结合凹凸纹理映射技术对粒子进入水池真实水波的产生、扩散、衰减以及多个水波的交迭过程的计算机模拟,采用了OpenGL显示列表(DisplayLists)方法绘图,优化了程序性能,效果逼真实现了真正的三维实时绘制。马骏和朱衡君25基于动态纹理和粒子系统实现了对喷泉的模拟,其方法是渲染一定量的图像作为贴图纹理,采用公告板技术和动态纹理技术来实现纹理喷泉的绘制,但缺乏一定的灵活性;赵静谧,张慧3等提出了用基于粒子系统与Particle System API的景物模拟方法,并采用Line方式渲染粒子,结合纹理映射方法对喷泉进行了模拟;张从辉,万华根26从物理建模技术出发构建了音乐喷泉模型。1.3 本论文的技术路线 本文主要根据国内外模拟喷泉的研究现状进行了分析和借鉴。对粒子系统进行了研究。结合粒子系统和流体动力学原理,对喷泉粒子系统的原有模型进行了进一步的分析和研究通过对喷泉运动的分析,利用随机粒子在系统中不规则运动来模拟喷泉粒子运动,从而使喷泉粒子的运动更加灵活。并针对于喷泉模拟效果上进行了改进。本论文主要从下面几章阐述利用粒子系统实现喷泉的模拟:第一章:主要综述了课题的国内外研究现状。对本文的研究内容、研究目标、研究方法和预期研究结果进行了概述,多层次反应了本课题的科学意义和实用价值。第二章:提出基于OpenGL+MFC的建模基础,分析了OpenGL渲染管道,MFC编程框架,陈述了基于OpenGL+MFC的三维模拟的编程环境配置。第三章:主要介绍粒子系统的原理和关键技术包括了粒子的发射,初始状态,生命周期等的控制。第四章:通过喷泉粒子的运动规律,特征,轨迹的分析研究来实现系统的设计。并对设计的过程,实现的原理,关键技术和实验结果进行详细陈述。第五章:总结本文方法并给出进一步的研究展望。2 基于OpenGLMFC的建模基础2.1 OpenGL概述OpenGL是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL。1995年OpenGL的1.1版本面市。 2003年的7月28日,SGI和ARB公布了OpenGL 1.5。2004年8月,OpenGL2.0版本发布OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。2008年8月初Khronos工作组在Siggraph 2008大会上宣布了OpenGL 3.0图形接口规范,GLSL1.30 shader语言和其他新增功能将再次未来开放3D接口发展指明方向。OpenGL 3.0 API开发代号为Longs Peak,和以往一样,OpenGL 3.0仍然作为一个开放性和跨平台的3D图形接口标准,在Shader语言盛行的今天,OGL3.0增加了新版本的shader语言:GLSL 1.30,可以充分发挥当前可编程图形硬件的潜能。2009年3月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。2009年8月Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。Khronos旗下的OpenGL ARB(Architecture Review Board)工作组推出了GLSL 1.5OpenGLShading Language(OpenGL着色语言)的升级版,以及在OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版OpenGL之间的兼容性。2.2 OpenGL渲染管道 绝大多数OpenGL的实现都有一个的相类似的操作顺序,一系列处理阶段称为OpenGL渲染管道。如图1 显示了OpenGL处理数据的过程。几何数据(顶点、线、多边形)跟随着这些路径通过这些代表求值程序和每一个顶点操作的盒子,而像素数据(像素、图像、位图)的部分加工处理过程有些不同。在将最后的像素数据写到帧缓存前,两种类型的数据都要经过最后相同的步骤(光栅化和片段操作)。图1 OpenGL渲染管道 下面我们更为详细的介绍OpenGL渲染管道的一些关键阶段。2.2.1 求值器 所有的几何图元最终都要通过顶点来描述。参数化曲线和表面最初可能是通过控制点以及成为基函数(Basic function)的多项式函数进行描述的。求职器提供了一种方法。根据控制点计算表示表面的顶点。这种方法是一种多项式映射,它可以根据控制点产生表面法线、纹理坐标、颜色以及空间坐标。2.2.2 基于顶点的操作 对于顶点数据,接下来的一个步骤就是"基于顶点的操作",就是把顶点变换为图元。有些类型的顶点数据(例如空间坐标)是通过一个4*4的浮点矩阵进行变换的。空间坐标从3D世界的一个位置投影到屏幕上的一个位置。如果启用了高级特性,这个阶段将更为忙碌。如果使用了纹理,这个阶段还将生成并变换纹理坐标。如果启用了光照,就需要综合变换后的顶点,表面法线,光源位置,材料属性以及其他光照信息进行光照计算,产生最终的颜色值。2.2.3 图元装配 图元装配的一个主要内容就是剪裁,它的任务是消除位于半空间(half-space)之外的那部分几何图元,而这个半空间是由一个平面所定义的。点剪裁就是简单地接受或拒绝顶点,直线或多边形剪裁则可能需要添加额外的顶点,具体取决于直线或多边形是如何进行剪裁的。在有些情况下,接下来需要执行一个称为透视除法(perspective division)的步骤。它使远处的物体看起来比近处的物体更小一些。接下来所进行的是视口(viewport)和深度(z坐标)操作。如果启用了剔除功能(culling)并且该图元是个多边形,那么它就有可能被剔除测试所拒绝。取决于多边形模式,多边形可能被画成点的形式或者直线的形式。这个阶段所产生的结果就是完整的几何图元,也就是根据相关的颜色,深度(有时还有纹理坐标值以及和光棚化处理有关的一些指导信息)进行了变换和剪裁的顶点。2.2.4 像素操作 在OpenGL的渲染管线中,和单路径的几何数据相比,像素数据所经历的流程有所不同。首先,来自系统内存的一个数组中的像素进行解包,从某种格式(像素的原始格式可能有多种)解包为适当数量的数据成分。接着,这些数据被缩放、偏移,并根据一副像素图进行处理。处理结果先进行截取,然后或者写入到纹理内存,或者发送到光棚化阶段。如果像素数据时从帧缓冲区读取的,就对他们执行像素转换操作(缩放、偏移、映射和截取)。然后,这些结果被包装为一种适当的格式,并返回到系统内存的一个数组中。OpenGL有一种特殊的像素复制操作,可以把数据从帧缓冲区复制到帧缓冲区的其他位置或纹理内存中。这样,在数据写入到纹理内存或者写回到帧缓冲区之前,只需要进行一道像素转换就可以了。2.2.5 纹理装配 OpenGL应用程序可以在几何物体上应用纹理图像,使它们看上去更为逼真。如果需要使用多幅纹理图像,把它们放在纹理对象中是一种明智的做法。这样,就可以很方便地在他们之间进行切换。有些OpenGL实现拥有一些特殊的资源,可以加速纹理的处理。这种资源可能是专用的,高性能的纹理内存。如果确实拥有这种内存,纹理对象可能会优先进行处理,以控制这种有限和宝贵的资源的使用。2.2.6 光棚化 光棚化就是把几何数据和像素数据转换为片断(fragment)的过程。每个片断方块对应用于帧缓冲区中的一个像素。把顶点连接起来形成直线或者计算填充多边形的内部像素时,需要考虑直线和多边形的点画模式,直线的宽度,点的大小,着色模型以及用于支持抗锯齿处理的覆盖计算。每个片断方块都将具有各自的颜色和深度值。2.2.7 片断操作 在数据实际存储到帧缓冲区之前, 将要执行一系列的操作。这些操作可能会修改甚至丢弃这些片断。所有这些操作都可以被启用或禁用。第一个可能遇到的操作是纹理化。在纹理内存中为每个片断生成一个纹理单元(texel,也就是纹理元素),并应用到这个片断上。接着可能进行的是雾计算,然后是剪裁测试,alpha测试,模板测试和深度缓冲区测试(深度缓冲区用于消除被隐藏的表面)。如果一个片断无法通过一个启用的测试,它的连续处理过程可能会被中断。随后,将要执行的可能是混合,抖动,逻辑操作以及根据一个位掩码的屏蔽操作。最后,经过完整处理的片断就被绘制到适当的缓冲区,最终成为一个像素并到达它的最终归宿。2.3 MFC概述MFC,微软基础类(Microsoft Foundation Classes), 用于在C+环境下编写应用程序的一个框架和引擎。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。MFC类库作为C+与Windows的接口,建立在Win32应用程序编程接口API之上,封装了大多数的API函数,主要是API中与程序结构相关的部分和最常用的部分。MFC还封装了重要的Windows扩展,如COM,ActiveX,ODBC和Internet 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编程框架具有如下特点:2.3.1 封装 构成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类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。(4)对ODBC功能的封装以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。2.3.2 继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd,派生了CView类;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。程序员将结合自己的实际,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。2.3.3 虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。本书将充分的展示MFC调用虚拟函数和消息处理函数的内幕,让读者对MFC的编程接口有清晰的理解。2.3.4 MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。2.4 MFC编程框架用AppWizard产生一个MDI工程t(无OLE等支持),AppWizard创建了一系列文件,构成了一个应用程序框架。这些文件分四类:头文件(.h),实现文件(.cpp),资源文件(.rc),模块定义文件(.def),等。 2.4.1 构成应用程序对象下图解释了该应用程序的结构,箭头表示信息流向。 图2 MDI应用程序的构成从CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd类对应地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五个类,这五个类的实例分别是应用程序对象、文档对象、视对象、主框架窗口对象和文档边框窗口对象。主框架窗口包含了视窗口、工具条和状态栏。对这些类或者对象解释如下。 (1)应用程序类 应用程序类派生于CWinApp。基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。 (2)边框窗口类 如果是SDI应用程序,从CFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含视窗口;如果是MDI应用程序,从CMDIFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含文档边框窗口。 如果要支持工具条、状态栏,则派生的边框窗口类还要添加CToolBar和CStatusBar类型的成员变量,以及在一个OnCreate消息处理函数中初始化这两个控制窗口。 边框窗口用来管理文档边框窗口、视窗口、工具条、菜单、加速键等,协调半模式状态(如上下文的帮助(SHIFT+F1模式)和打印预览)。 (3)文档边框窗口类 文档边框窗口类从CMDIChildWnd类派生,MDI应用程序使用文档边框窗口来包含视窗口。 (4)文档类 文档类从CDocument类派生,用来管理数据,数据的变化、存取都是通过文档实现的。视窗口通过文档对象来访问和更新数据。 (5)视类 视类从CView或它的派生类派生。视和文档联系在一起,在文档和用户之间起中介作用,即视在屏幕上显示文档的内容,并把用户输入转换成对文档的操作。 (6)文档模板类 文档模板类一般不需要派生。MDI应用程序使用多文档模板类CMultiDocTemplate;SDI应用程序使用单文档模板类CSingleDocTemplate。 应用程序通过文档模板类对象来管理上述对象(应用程序对象、文档对象、主边框窗口对象、文档边框窗口对象、视对象)的创建。 2.4.2 构成应用程序的对象之间的关系图3 应用程序的对象之间的关系用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如图所示意。 图所示的类都是从CObject类派生出来的;所有处理消息的类都是从CCmdTarget类派生的。如果是多文档应用程序,文档模板使用CMultiDocTemplae,主框架窗口从CMdiFarmeWnd派生,它包含工具条、状态栏和文档框架窗口。文档框架窗口从CMdiChildWnd派生,文档框架窗口包含视,视从CView或其派生类派生。2.4.3 构成应用程序的文件通过上述分析,可知AppWizard产生的MDI框架程序的内容,所定义和实现的类。下面,从文件的角度来考察AppWizard生成了的源码和作用什么。表1列出了AppWizard所生成的头文件,表2列出了了AppWizard所生成的实现文件及其对头文件的包含关系。 表1 AppWizard所生成的头文件表2 AppWizard所生成的实现文件 从表2中的包含关系一栏可以看出: CTApp 的实现用到所有的用户定义对象,包含了他们的定义;CView 的实现用到CTdoc;其他对象的实现只涉及自己的定义; 当然,如果增加其他操作,引用其他对象,则要包含相应的类的定义文件。2.5 基于OpenGL+MFC的三维模拟的编程环境配置1创建MFC项目 (1)创建项目文件。选择File|New菜单项,新建一个基于对话框的项目文件MyDlgOpenGL;(2)修改对话框模板。删除对话框中的静态文本,调整控件的位置;2. 配置基于OpenGLMFC的开发环境 (1)将glu.dll,glu32.dll,glut.dll,glut32.dll,opengl32.dll文件拷贝到操作系统WINNT/System32目录下。(2)将gl.h,glaux.h,glu.h,glut.h拷贝到Microsoft Visual Studio/VC98/Include/GL目录中中。(3)将glaux.lib,glu32.lib,glut32.lib,opengl32.lib拷贝到Microsoft Visual Studio/VC98/Lib目录中。(4)添加OpenGL开发库文件到项目在编译程序的时候选择Project|Setting菜单,在Link标签中的Object/library modules编辑框中输入“opengl32.lib, glut32.lib ,glu32.lib,glaux.lib”;(5)创建新类,添加消息映射。选择View|ClassWizard菜单项,打开对话框,在Add Class之中选择New,以便添加一个新类COpenGL,且该类的基类选择generic CWnd;最后利用MFC ClassWizard为COpenGL类添加消息WM_CREATE,WM_PAINT的映射。3初始化OpenGL:(设置像素格式、创建OpenGL dc、rc,设置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("ChoosePixelFormat failed"); return FALSE; if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) = FALSE) MessageBox("SetPixelFormat failed"); 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(); 设置视口变换:/ 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 类添加成员函数void Init(); void DrawFountain(); void normalize(struct point *V); void vect_mult(struct point *A, struct point *B, struct point *C); void DeleteParticles();void MoveParticles(); void AddParticles(); void LoadTexture(char *fn, int t_num); 其中void DrawFountain();用于绘制喷泉。构造代码如下:void CMyFountainView:DrawFountain()int j;struct particle *tempp;struct point vectd, vectl; float alpha, ttx, ttz; 其喷泉粒子结构体代码如下:struct particle float t; / 粒子的生命期 float v; / 粒子运动的速度 float d; / 粒子运动的方向 float x, y, z; / 粒子的位置坐标 float xd, zd; / 粒子的 X 和 Z 方向增加值 char type; / 粒子类型(运动或淡化) float a; / 淡化 alpha 值 struct particle *next, *prev;5清理工作:(析构函数中释放dc,rc指针)void CMyTestView :OnDestroy() /清理工作 HGLRC hrc; hrc = :wglGetCurrentContext(); :wglMakeCurrent(NULL, NULL); if (hrc) :wglDeleteContext(hrc); if (m_pDC) delete m_pDC; CView:OnDestroy(); 3 粒子系统的原理和关键技术3.1 计算机图形学原理 计算机图形学是运用计算机产生、存储、处理物体和物理模型及它们的图画的一门学科。总的来说,造型技术、真实感图形绘制技术与人机交互技术构成了计算机图形学的主要研究内容。目前,计算机图形学解决与研究的问题有:(1)图形表示和处理的数学方法及其实现的算法;(2)设计一个好的图形软件系统:(3)设计与实际应用相结合的图形应用系统。用计算机生成三维形体图形,是计算机图形学的基本研究内容。三维计算机图形的生成一般需要经历三维物体造型、取景变换、视域裁剪、消除隐藏面及可见光亮度计算等步骤。物体最初定义在自己的局部坐标系中,经过模型变换,它以一定的形状、尺寸存在于场景坐标系的某个位置。在场景坐标系中指定物体的表面属性和光照属性,给出视点的位置
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!