3D飞行训练系统设计与实现毕业论文.doc

上传人:小** 文档编号:13343633 上传时间:2020-06-16 格式:DOC 页数:28 大小:886KB
收藏 版权申诉 举报 下载
3D飞行训练系统设计与实现毕业论文.doc_第1页
第1页 / 共28页
3D飞行训练系统设计与实现毕业论文.doc_第2页
第2页 / 共28页
3D飞行训练系统设计与实现毕业论文.doc_第3页
第3页 / 共28页
资源描述:

《3D飞行训练系统设计与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《3D飞行训练系统设计与实现毕业论文.doc(28页珍藏版)》请在装配图网上搜索。

1、论文) 论文题目:_3D飞行训练系统的设计与实现_ 系 别: 计算机系 专业年级: 学 号: 姓 名: 指导教师、职称 年5月10号目录 摘 要1第一章 绪论21.1研究3D飞行训练系统的背景及研究的意义21.2 飞行训练系统的国内外研究现状21.3 本论文的基本路线3第二章 基于OpenGL+MFC的建模基础42.1 OpenGL的概念42.2 OpenGL的发展历程42.3 OpenGL的渲染管道52.3.1显示列表 52.3.2求值程序62.3.3基于顶点的操作62.3.4初步组装62.3.5像素操作62.3.6纹理装配62.4 MFC的概述62.5MFC的特点72.5.1封装72.5.

2、2继承72.5.3虚拟函数和动态约束72.6 MFC的编程框架82.6.1 MFC的宏观框架体系82.7MDI应用程序构成82.7.1构成应用程序对象82.7.2构成应用程序的对象之间的关系102.7.3构成应用程序的文件102.8 基于OpenGL+MFC的三维模拟的编程环境配置11第三章飞行训练系统的设计及实现143.1 系统的设计143.1.1系统结构的类143.1.2 场景绘制及渲染163.1.3 飞机训练系统的关键模拟技术173.1.4 加载矩阵,控制模型变换193.2系统实现的原理及关键技术193.2.1基本的OpenGL几何变换203.2.2 三维平移203.3 实验结果效果图2

3、2第四章 结论与展望24参考文献25致 谢26摘 要研究在普通的PC 机下开发高质量的视景仿真系统。在Windows NT 系统下,以Visual C + + 为开发平台,利用OpenGL和串口技术,运用面向对象的编程思想,采用MFC 的编程方法1。首先简介了OpenGL 及如何利用它进行复杂的三维建模、文本显示、天空和地形绘制以及动画生成的技术。本文在OpenGL的开发基础上,开发通过鼠标和键盘进行操作的虚拟飞行训练系统,通过飞行训练系统为飞行员提供了零危险的飞行训练,飞行训练系统提供了一个身临其境的交互式仿真环境,对飞行训练中的场景进行模拟,实现了人机自然交互;实验表明本文的方法在Open

4、GL场景中仿真飞机的飞行状态,如实的反应出飞机的飞行状态。最终,较好地解决了飞行器三维实时显示与逼真的场景之间的矛盾2。关键词:开放式图形库;动画;仿真;建模;ABSTRACTThis article focus on the study of developing simulation system running on PC. We implement the simulation using OOP method on the platform integrated with VC+ and OpenGL. First introduced the OpenGL and how to u

5、se it for complex 3d modeling, text display, the sky and the terrain rendering and animation of technology. The developed virtual flight training system provided users with friendly manipulations of keyboard and mouse for rich control. This kind of flight training system can remarkably reduce the fl

6、ying risk. Besides, it provides a vivid simulation process for users with the true scene of flying training through the man-machine interfaces. Experiments showed that our method was feasible which make sense of controlling flying state. Finally, a decision of the balance of real-time and reality wa

7、s presented.KEYWORDS : OpenGL ; Animation ; Simulation ; Modeling1第一章 绪论1.1研究3D飞行训练系统的背景及研究的意义过去,在航空航天和军事仿真等领域的许多系统的开发研制过程中,飞行器的研制往往依靠飞行实验来完成型号的定型,研制过程漫长而且花费巨大。目前,随着计算机多媒体技术、可视化技术及图形学技术的发展,我们可以使用计算机来精确地再现现实世界中的绚丽多彩的三维物体,并充分发挥自身的创造性思维,通过人机交互来模拟、改造现实世界,这就是目前最为时髦的虚拟现实技术。通过这种技术,建筑工程师可以直接设计出美观的楼房模型;军事指挥员

8、可以模拟战场进行军事推演,网民可以足不出户游览故宫博物馆等名胜古迹等。而虚拟现实技术最重要的一部分内容就是三维图形编程。用三维仿真系统进行模拟飞行训练是国内外通常采用的有效方法。OpenGL是一个开放式的针对图形硬件的三维图形软件包,具有良好的平台无关性,开发者可以利用它来建立三维模型和进行三维实时交互,从而实现所谓的“虚拟的真实”,所以多采用OpenGL进行飞机三维仿真。1.2 飞行训练系统的国内外研究现状国外对于飞行训练系统的研制最早从六自由度运动平台开始逐步向集成化、综合化发展,目前的系统已经成为集电气、机械、控制、自动化为一体的现代化高科技产品。国外的许多院校和研究机构都进行了飞行训练

9、系统的研究,比较著名的如Delft大学、荷兰的NLR实验室等3,为系统的开发提供了技术支持。美国空军早在1969年就开始利用仿真系统4代替部分实际飞行,使用仿真系统后的飞行费用下降幅度达66%至95%。3D飞行训练系统在模拟系统开发里起到了重要作用,它把研制的虚拟场景,在视觉上、操作训练环境和程序形成高度逼真,有效解决院校和部队飞行教学训练中的难题,缩短了训练周期,提高了训练效益。飞行训练系统已有了惊人的进步。其主要表现是:1、飞行训练视景系统经历了多次变革,经由机械式、光学造影型和闭路电视系统发展到高逼真度的计算机成像视景系统。2、飞行员动感模拟,由原来无法模拟过载的固定机舱,发展成为可借助

10、六自由度运动模拟系统支撑的模拟活动座舱。除此,还可以提供先进廉价的G座椅、抖动座椅、高G负荷黑视头盔、模拟抗荷服等形式的动感模拟设施。3、作为飞行模拟器核心的仿真计算机系统,在经历了三次变革浪潮后,已进入全数字实时仿真阶段,不仅有很宽谱型的仿真计算机体制结构可供人们选择,而且高性能价格比的超级实时工作站已加入飞行模拟器的仿真计算机系统行列。4、多媒体技术、虚拟现实技术、分布交互仿真技术正在从根本上改变传统飞行训练系统的形式和结构。其次是系统功能和应用范围的不断扩大。飞行训练系统由最初的仅提供飞行员操作使用,扩展到目前成为新机研制必不可少的手段,是现代航空理论、技术和方法研究的主要支柱和新机首飞

11、前的试飞员培训的唯一工具。特别是地面飞行模拟技术同空中飞行模拟技术的结合所出现的空地综合飞行模拟系统,给改善飞行训练系统性能和扩大模拟器应用领域开辟了一个新的途径,进一步展现出了飞行训练系统的广阔发展空间。我国计算机训练系统领域在50年代末开始对飞机控制系统进行仿真实验5,自行研制了仿真设备,在“七五”、“八五”期间,我国建立了一批大型的仿真实验室或仿真系统,我我国研制飞机的过程中发挥了重要的作用。通过对比国内外飞行训练系统的发展状况可以得到下述结论:1、国外飞行训练系统具有丰富的经验,国内对于飞行训练系统在军用模拟上虽有较大的发展,但军用飞行训练系统考虑到战术、机动性等方面的要求,较多采用的

12、为固定基座的模拟,通过视景和抖振座椅实现飞机的动感模拟,逼真度相对较差。在民用飞行模拟器上的发展缓慢。2、在系统集成上,国外具有较好的经验积累,可以进行多种条件下的综合集成,而国内在飞行训练系统方面,还处于尝试阶段,主要的产品还依靠国外的系统,主要系统的集成化程度不高。3、国内使用的技术多数参照国外的经验技术,自主开发的较少,没有形成独有的技术体系,同国外相比竞争力等相对较差。1.3 本论文的基本路线由于硬件的限制,本文着重的模拟通过鼠标和键盘的系统交互式操作,进而对仿真飞行训练系统的的实现。论文的的章节安排如下:第一章:分析研究飞行训练系统的重要性,对飞行训练系统的特点、研究现状进行了概述,

13、对飞行仿真技术进行了介绍。第二章:简单的介绍了OpenGL及MFC的建模基础,分析了OpenGL的渲染管道,MFC中的各种类结合起来构成了一个应用程序框架,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。第3章 :飞行训练系统的设计及实现。首先对系统的设计展开介绍,用结构图表面系统的实现的步骤,阐述了系统的模型导入,关于矩阵的变换,所有变换都在三维空间中定义。要完成一次平移,需要引用平移子程序且设定三维平移向量。在旋转函数中需指定经过坐标系原点的旋转轴的角度和方向。以及对系统中场景绘制和渲染,使它看起来更真实。第四章: 在导入飞机模型后,使用键盘操作控制模型,运行系统得到很好的

14、演示效果。3第二章 基于OpenGL+MFC的建模基础2.1 OpenGL的概念OpenGL 是行业领域中最为广泛接纳的 2D/3D 图形 API, 其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,

15、功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然DirectX在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。 在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用。其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,

16、创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩

17、指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。 2.2 OpenGL的发展历程1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。包括提高顶点位置、法线、颜色、色彩指

18、数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。1997年,Windows 95下3D游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D图形接口,而当时微软公司自己的3D图形接口DirectX 3.0功能却是很糟糕。因而以制作雷神之锤等经典3D射击游戏而著名的id公司同其它一些游戏开发公司一同强烈要求微软在Windows 95中加入对OpenGL的支持。微软公司最终在Windows 95的OSR2版和后来的Windows 版本中加入了对OpenGL的支持。这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL

19、标准的3D加速卡,大大提高其3D图形的处理速度。2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式扩展规格绘制语言“OpenGL Shading Language”。OpenGL 1.5的新功包括:顶点Buffer Object、Shadow功能、隐蔽查询、非乘方纹理等。2004年8月,OpenGL2.0版本发布OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。OpenGL12.0支持OpenGL Shading Language、新的shader扩展特性以及其他多项增强特性。

20、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,可以充分发挥当前可编程图形硬件的潜能。同时,OGL3.0还引入了一些新的功能,例如顶点矩阵对象,全帧缓存对象功能,32bit浮点纹理和渲染缓存,基于阻塞队列的条件渲染,紧凑行

21、半浮点顶点和像素数据,四个新压缩机制等等。2009年3月又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。2009年8月Khronos小组发布了OpenGL 3.2,这是一年以来OpenGL进行的第三次重要升级。该版本仍然延续了OpenGL发展的方向让图形

22、程序开发者能在多种操作系统和平台下更好的利用新的GPU功能。OpenGL3.2版本提升了性能表现、改进了视觉质量、提高了几何图形处理速度,而且使Direct3D程序更容易移植为OpenGL。除OpenGL之外,Khronos还将其开发的其它标准进行了协调改进,以求可以在更广泛的领域提供强大的图形功能和计算生态系统,这些标准包括用于并行计算的OpenCL、用于移动3D图形开发的OpenGL ES和用于网络3D开发的WebGL。Khronos旗下的OpenGL ARB(Architecture Review Board)工作组推出了GLSL 1.5OpenGLShading Language(Op

23、enGL着色语言)的升级版,以及在OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版OpenGL之间的兼容性。2.3 OpenGL的渲染管道 大部分OpenGL的实现都有一个的相类似的操作顺序,一系列处理阶段称为OpenGL渲染管道。这个顺序(如下图所示),对OpenGL的实现来说不是一套严格的规则,但是对我们了解OpenGL将做什么有很好的帮助。下面的图表显示了一条福特工厂装配流水线的过程,这就是OpenGL处理数据的过程。几何数据(顶点、线、多边形)跟随着这些路径通过这些代表求值程序和每一个顶点操

24、作的盒子,而像素数据(像素、图像、位图)的部分加工处理过程有些不同。在将最后的像素数据写到帧缓存前,两种类型的数据都要经过最后相同的步骤(光栅化和碎片操作)。图2.1 OpenGL处理数据流程现在可以看到OpenGL渲染管道中关键步骤的更加详细的信息。2.3.1显示列表所有数据,无论是几何描述或像素,都要被保存在一个显示列表中以备用。(如果要将数据保留在显示列表中,就要马上处理这些数据,这就是立即模式)。一旦显示列表被执行,保留数据将从显示列表中发送出去,就像在立即模式下被发送一样。2.3.2求值程序所有几何元素最后都要用顶点来描述。量化曲线和曲面可以用控制点和多项式函数(称为基础函数)来初始

25、描述。求值程序提供了一种方法可以从控制点来表示曲面。这个方法是多项式映射,它能够从控制点产生曲面法线、材质坐标、颜色、空间坐标值。2.3.3基于顶点的操作对于顶点数据,下一步就是每一个顶点的操作步骤,它将这些顶点转化程原始图元。一些顶点数据(例如空间坐标)是用4x4的浮点矩阵转换来的。空间坐标是从3D世界上的一个点映射到你屏幕上的一个点。假如使用了更高级的属性,这个步骤甚至更加复杂。假如使用了纹理,纹理坐标将要产生并转换。假如光照效果开启,光照效果将使用转换过的顶点、曲面法线、光源位置、材质属性、其他光源的信息进行计算,产生一个颜色值。2.3.4初步组装裁剪,一个初步组装最主要的部分,是将可视

26、空间外的部分几何元素消除。点裁剪只是简单的忽略或删除该点;线或多边形裁剪将会增加一些附加的点,当然这依赖于怎么裁剪。在有些情况下,这是随着透视处理发生的,它使远处的几何物体看起来更小一些。然后是视点和景深(z坐标)处理。假如淘汰功能是打开的,且是多边形元素,它有可能通过淘汰监测而被抑制。根据多边形模式,一个多边形有可能被画成点或线。这个步骤的结果是用相关的颜色、景深、有时还有纹理坐标值和辅助线完成几何元素的转换和裁剪处理,为光栅化做准备。2.3.5像素操作在几何数据通过OpenGL渲染管道的过程中,像素数据走的另外一条不同的路径。像素从系统内存的一个数组中首先用其中一种格式解包到适当数量的组件

27、中。然后数据将被缩放、偏离,和被像素表处理。结果被汇总然后写入纹理内存或送入光栅化步骤。假如像素数据是用帧缓存中读取的,像素转换操作(缩放、偏离、映射、clamping)将被执行。然后这些结果将被打包成适当的格式重新返回到系统内存的一个数组中。这儿有一些特殊的像素拷贝操作,用于一个帧缓存中拷贝数据到另外一个帧缓存或纹理内存。整个像素传输操作可以在数据写到纹理内存或写回到帧缓存中之前通过一条单独的路径进行。2.3.6纹理装配一个OpenGL程序也许希望能够将图像贴到几何物体上去,使它看起来更加真实。假如使用了很多纹理贴图,将它们放到纹理对象中是个明智的选择,因为你能够更容易的切换它们。一些Ope

28、nGL实现也许有专用的方法用于加速纹理贴图的性能。这儿也许有专用的、高性能的纹理内存。假如这个内存是存在的,纹理对象将优先使用这种有限的且非常有用的资源。光栅化光栅化是将几何物体和像素数据转换成片断的转换器。每一个片断块对应一个帧缓存中的像素。线和多边形点、线宽、点大小、阴影模型、反走样的平均计算都被综合考虑,与顶点被连接成线或用于填充多边形的点都被计算出来。每一个片断块的颜色和景深值都被赋值。2.4 MFC的概述MFC是一个编程框架,面前最新版本为10.0。MFC (Microsoft Foundation Class Library) 中的各种类结合起来构成了一个应用程序框架,它的目的就是

29、让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后编译,则通过类库实现了应用程序特定的逻辑。2.5MFC的特点MFC (Microsoft Foundation Class Library

30、)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。2.5.1封装构成MFC框架的是MFC

31、类库。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应

32、用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。MFC把许多类似的处理封装起来,替程序员完成这些工作。另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。(3)对COM/OLE特性的封装 OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。MFC的OLE类封装了OLE API大量的复杂工作,这些类提供了实现OLE的更高级接口。 (4)对ODBC功能的封装 以少量的能提供与ODBC之间更高级接口的C+类,封装了OD

33、BC API的大量的复杂的工作,提供了一种数据库编程模式。 2.5.2继承首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。 针对每

34、种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。 程序员将结合自己的实际,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。 2.5.3虚拟函数和动态约束MFC以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Wind

35、ows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。本书将充分的展示MFC调用虚拟函数和消息处理函数的内幕,让读者对MFC的编程接口有清晰的理解。 2.6 MFC的编程框架2.6.1 MFC的宏观框架体系MFC实现了对应用程序概念的封装,把类、

36、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。 这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。典型的MDI应用程序的构成将在下一节具体讨论。 为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持

37、和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。 MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码

38、来处理应用程序特定的事件。 MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。 2.7MDI应用程序构成用AppWizard产生一个MDI工程t(无OLE等支持),AppWizard创建了一系列文件,构成了一个应用程序框架。这些文件分四类:头文件(.h),实现文件(.cpp),资源文件(.rc),模块定义文件(.def),等。 2.7.1构成应用程序对象下图解释了该应用程序的结构,箭头表示信息流向。 图2.2

39、 应用程序的结构从CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd类对应地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五个类,这五个类的实例分别是应用程序对象、文档对象、视对象、主框架窗口对象和文档边框窗口对象。主框架窗口包含了视窗口、工具条和状态栏。对这些类或者对象解释如下。 (1)应用程序 应用程序类派生于CWinApp。基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。 (2)边框窗口类 如果是SDI应用程序,从CFrameWnd类派生边框窗口类,边框窗口的客户

40、子窗口(MDIClient)直接包含视窗口;如果是MDI应用程序,从CMDIFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含文档边框窗口。 如果要支持工具条、状态栏,则派生的边框窗口类还要添加CToolBar和CStatusBar类型的成员变量,以及在一个OnCreate消息处理函数中初始化这两个控制窗口。 边框窗口用来管理文档边框窗口、视窗口、工具条、菜单、加速键等,协调半模式状态(如上下文的帮助(SHIFT+F1模式)和打印预览)。 (3)文档边框窗口类 文档边框窗口类从CMDIChildWnd类派生,MDI应用程序使用文档边框窗口来包含视窗口。 (4)

41、文档类 文档类从CDocument类派生,用来管理数据,数据的变化、存取都是通过文档实现的。视窗口通过文档对象来访问和更新数据。 (5)视类 视类从CView或它的派生类派生。视和文档联系在一起,在文档和用户之间起中介作用,即视在屏幕上显示文档的内容,并把用户输入转换成对文档的操作。 (6)文档模板类 文档模板类一般不需要派生。MDI应用程序使用多文档模板类CMultiDocTemplate;SDI应用程序使用单文档模板类CSingleDocTemplate。 应用程序通过文档模板类对象来管理上述对象(应用程序对象、文档对象、主边框窗口对象、文档边框窗口对象、视对象)的创建。 2.7.2构成应

42、用程序的对象之间的关系图2.3 MFC类的继承和派生关系26用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如图所示意。 图所示的类都是从CObject类派生出来的;所有处理消息的类都是从CCmdTarget类派生的。如果是多文档应用程序,文档模板使用CMultiDocTemplae,主框架窗口从CMdiFarmeWnd派生,它包含工具条、状态栏和文档框架窗口。文档框架窗口从CMdiChildWnd派生,文档框架窗口包含视,视从CView或其派生类派生。2.7.3构成应用程序的文件通过上述分析,可知AppWizard产生的MDI框架程序的内容,所定义和实现的类。下面,从文件的角度来考

43、察AppWizard生成了源码和作用。表2.1列出了AppWizard所生成的头文件,表2.1列出了了AppWizard所生成的实现文件及其对头文件的包含关系。 表2.1 AppWizard所生成的头文件 头文件 用途Stdafx.h标准AFX头文件resource.h定义了各种资源IDt.h#includeresource.H定义了从CWinApp派生的应用程序对象CTAppchildfrm.h定义了从CMDIChildWnd派生的文档框架窗口对象CTChildFramemainfrm.h定义了从CMDIFrameWnd派生的框架窗口对象CMainFrametdoc.h定义了从CDocume

44、nt派生的文档对象CTDocTview.h定义了从CView派生的视图对象CTView表2.2 AppWizard所生成的实现文件 实现文件所包含的头文件实现的内容和功能stdafx.cpp#includestdafx.h用来产生预编译的类型信息。t.cpp#includestdafx.h#includet.h#includeMainFrm.h#includechildfrm.h#includetdoc.h#includetview.h定义CTApp的实现,并定义CTApp类型的全局变量theApp。childfrm.cpp#includestdafx.h#includet.h#include

45、childfrm.h实现了类CChildFramechildfrm.cpp#includestdafx.h#includet.h#includechildfrm.h实现了类CMainFrametdoc.cpp#includestdafx.h#includet.h#includetdoc.h实现了类CTDoctview.cpp#includestdafx.h#includet.h#includetdoc.h#includetview.h实现了类CTview从表2.2中的包含关系一栏可以看出: CTApp 的实现用到所有的用户定义对象,包含了他们的定义;CView 的实现用到CTdoc;其他对象的

46、实现只涉及自己的定义; 当然,如果增加其他操作,引用其他对象,则要包含相应的类的定义文件。2.8 基于OpenGL+MFC的三维模拟的编程环境配置1创建MFC项目创建项目文件。选择File|New菜单项,新建一个基于对话框的项目文件MyDlgOpenGL; 修改对话框模板。删除对话框中的静态文本,调整控件的位置;添加OpenGL开发库文件到项目在编译程序的时候选择Project|Setting菜单,在Link标签中的Object/library modules编辑框中输入“opengl32.lib, glut32.lib ,glu32.lib,glaux.lib”;创建新类,添加消息映射。选择

47、View|ClassWizard菜单项,打开对话框,在Add Class之中选择New,以便添加一个新类COpenGL,且该类的基类选择generic CWnd;最后利用MFC ClassWizard为COpenGL类添加消息WM_CREATE,WM_PAINT的映射。2. 配置基于OpenGLMFC的开发环境将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/

48、GL目录中中。将glaux.lib,glu32.lib,glut32.lib,opengl32.lib拷贝到Microsoft Visual Studio/VC98/Lib目录中。3初始化OpenGL:(设置像素格式、创建OpenGL dc、rc,设置OpenGL视口变换),设置像素格式:为CMyTestView 类添加成员函数 BOOL bSetupPixelFormat(void),用于与OpenGL 相关的设置 /*定 义 像 素 存 储 格 式 */ PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / pfd结构的大

49、小 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 pix

50、elformat; 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

51、_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(); 设置视口变

52、换:/ Set the viewport视口 to be the entire window glViewport(0, 0, w, h); gluPerspective(45,ratio,1,1000);设置OpenGL模型变换glMatrixMode(GL_MODELVIEW); glLoadIdentity(); 4 实现应用程序逻辑:首先添加结构网struct Meshint m_materialIndex;int m_numTriangles;int *m_pTriangleIndices;然后再添加三角结构struct TriangleGLfloat m_vertexNormals

53、33;GLfloat m_s3, m_t3;int m_vertexIndices3;进而添加结构顶点struct Vertexchar m_boneID;/ for skeletal animationGLfloat m_location3;5. 清理工作:(析构函数中释放dc,rc指针)void CMyRainView:OnDestroy() CView:OnDestroy(); ;第三章飞行训练系统的设计及实现3.1 系统的设计任何复杂的几何结构都是由点、线、多边形等基本图原构成。OpenGL 的基本库提供了绘制各种基本类型的3D 图元函数。而OpenGL 工具库(glu32. lib)

54、 提供了用来形成锥体、柱体,盘状体和球体的镶嵌工具以及渲染它们的功能。这些形状函数使用了一个名为quadric (二次曲面) 的专门镶嵌工具。利用这些函数可以建立飞机和地面模型6。本系统设计的结构如下图。系统由用户层、处理层和数据层三部分组成的,用户层就是用户通过鼠标或键盘实现操作系统。处理层包含了模型组织管理、模型渲染及模型操作。模型的组织和管理是控制模型的输入和输出,而模型的操作则主要是通过矩阵变换的运算来实现的。图3.1 系统结构3.1.1系统结构的类本系统中用到以下几个类:CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多

55、小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)。CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd:Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CDia

56、log对话框。CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。图3.2 系统结构CView类图系统使用下面的结构体存储导入的模型的三维实体数据Struct tVectloat x,Y,z; 用来保存模型中顶点的3D坐标struct ModelContextint facetCount; /面的数量int triangleFlag;Vertex vertexListVERTEX_MAX;/模型中的顶点列表int vertexCount;Vertex lineListLINE_M

57、AX;/线中的顶点数组int lineCount;/顶点数量Vertex lineStripListLINE_STRIP_MAX; int lineStripCount;int edgeListEDGE_MAX2;int edgeCount;Vertex objVertexListOBJ_VERTEX_MAX; /OBJ文件中的顶点int ovCount;int onCount;ColorStruct colorListCOLOR_MAX;/模型中的颜色列表int colorCount;/模型中的边界盒GLfloat boundBoxLeft, boundBoxBottom, boundBox

58、Near;GLfloat boundBoxRight, boundBoxTop, boundBoxFar;GLdouble rotX, rotY;GLdouble scaleObj;GLdouble rotMat16;GLdouble windowWidth, windowHeight;GLdouble minimumScale;int haveNormals;int needToUpdateViewMat;int pointerMotion;3.1.2 场景绘制及渲染飞机的机身是由锥形机头和柱形机体组成的,飞机模型数据在导入时存储在前述的结构体中,并在导入后创建显示列表以加速OpenGL对飞

59、机模型的渲染,因此调用下面的语句进行飞机模型的绘制 :glCallList(MODEL);/ 绘制飞机模型glDisable(GL_LIGHTING);接下来就是关于画面的初步绘制:地形、天空、水、飞机尾焰及太阳DrawTerrain();/ 绘制地形DrawSky();/ 绘制天空if(water) DrawWater();/ 绘制水 DrawPlane();/ 绘制飞机及其尾焰DrawSun();/ 绘制太阳一个OpenGL程序如果能够光栅化,使它看起来更真实。每一个片断块对应一个帧缓存中的像素。线和多边形点、线宽、点大小、阴影模型、反走样的平均计算都被综合考虑,与顶点被连接成线或用于填充

60、多边形的点都被计算出来。每一个片断块的颜色和景深值都被赋值8。设置光照效果GLfloat LightAmbient= 0.5f, 0.5f, 0.5f, 1.0f ;GLfloat LightDiffuse= 1.0f, 1.0f, 1.0f, 1.0f ;GLfloat LightSpecular= 0.5f, 0.5f, 0.5f, 1.0f ;GLfloat LightPosition= 0.0f, 0.0f, 0.0f, 1.0f ;glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);glLightfv(GL_LIGHT1, GL_SPECULAR,LightSpecular);glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);glEnable(GL_LIGHT1);3.1.3 飞机训练系统的关键模拟技术3.1.3.1 OpenGL矩阵栈和矩阵操作对可用glMatrixMode选择的4种模式(建模观察、投影、纹理和颜色)中的每一种,OpenGL都维护一个矩

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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