《基于OpenGL的飞机模型运动D实时仿真显示(完整资料).doc》由会员分享,可在线阅读,更多相关《基于OpenGL的飞机模型运动D实时仿真显示(完整资料).doc(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于OpenGL的飞机模型运动D实时仿真显示(完整资料)(可以直接使用,可编辑 优秀版资料,欢迎下载)本科毕业论文(科研训练、毕业设计)题 目:基于OpenGL的飞机模型运动 3D实时仿真显示姓 名:李培锋学 院:物理与机电工程学院系:航空系专 业:航空机械年 级:09级学 号:3#0指导教师(校内):# 职称:教授指导教师(校外): 职称: 013年 5 月 5 日基于OpenL的飞机模型运动3D实时仿真显示摘要 近年来,随着计算机动画技术的高速发展,基于计算机动画技术的实时仿真技术在航天航空、机械设计、游戏开发、地理信息、气象模拟、虚拟现实等领域的应用越来越广泛。本文以计算机图形学,图像处
2、理技术为基础,运用penL这一软件接口,以iualC+.0为集成开发环境,在Widows系统中建立飞机模型运动3仿真应用程序。通过获取传感器采集的飞机模型的姿态数据,对绳牵引机器人控制的飞机模型在试验中的运动进行实时仿真显示.文中详细介绍了OeG构建模型和实现动画仿真显示的原理和过程,以及在编程过程中使用到的双缓冲,Wi3多线程和3DS格式模型导入等关键技术.关键词 实时仿真 OpeGL三维运动 3DS格式模型导入 BSRCT In ecent ears, ithhe rapd vomentof thecomputeanmaion tchnology, real-time simltio tc
3、nology, wich i bas o the oueraimtontechnology, being s n manyeld sucha aerospce,mechaicaldign, gam developmt, georahicnfmtin, wathe simlatin, irtual ealiy and o o mor ad oe wildy.Th papr ismiy bsdo computr gapicsnmage rocen tehnoloy,usinga hig perorn graphics plicato programig interace (API): OenGL
4、and Visul C+ 6.a iteateddeopetevirnmet to ld delairplane and the etenal frame n Window sytm.he ircrf mdel entity dta is cquird y sesor aquisiion to ahieve he ppose tht simulaesthe theedmensinalmotion attitude cange ofe aircraft mdel cotroled by tracin rp oot intime. Thisppertrodues the princpld poce
5、ses of OpeGto buid oel and ahieeanimaon , as wl as the ke tchloiused ite pogrmmn prces suc as ouebuffrg, n2 mulitradin,DS frmat modls imo and soo.Key Wor Reltme simulaiOpenGthree-diesonmoion3DS frmat oelimport目录第一章绪论。1 本文研究的背景意义11 本文的主要工作213 本文的主要内容2第二章pen简介及其实现绘图的原理和过程2. OpenGL简介32.1。1OpenG功能31。2 O
6、peGL图形显示方式42.2 penG绘图前期准备4第三章实时仿真显示的关键技术和关键环节631 C简介63.2 多线程技术3。3 本文涉及的坐标系3.3 3DS格式模型文件的生成73。 3模型文件导入OpenGL9第四章飞机模型运动3D实时仿真显示的实现14.1 实时仿真显示应用程序的总体设计14.2 创建窗口243 程序初始化134.4 模型场景构建及运动仿真14.1 飞机模型运动实时数据的获得和显示14。4。 飞机模型的绘制1第五章成果展示和功能分析7第六章总结19参考文献2致谢语1第一章 绪论11 本文研究的背景意义本文研究目的是完善现有的绳牵引并联支撑系统(WPSS)主控制界面(简称
7、主控制界面)。在分析现有的WPDS原理样机和主控制界面后,发现实验者在实验过程中不便于直接观察飞机模型的运动情况,而现有的主控制界面没有实时显示飞机模型姿态方面的功能.这不利于实验者在实验过程中直观地掌握飞机模型的运动情况并根据实时仿真显示结果对飞机模型的运动姿态进行相应的调整.本文就是针对这一不足,制定合理的方案去解决问题。近年来,随着计算机动画技术的高速发展,利用计算机动画技术实现仿真显示在国内外各个领域都日益成为最热门的研究课题之一.现已有多家公司各自开发出了相应的仿真软件。现在主流的仿真软件主要有由美国MultiGenardim公司开发的能用于虚拟现实、实时视景仿真、声音仿真以及其他可
8、视化领域的软件工具Vega2,由uantm公司开发的软件工具Tree3和由美国MiGenParag公司开发的Mligenrator系列软件等。虽然上述软件工具都被广泛的使用,但是各有侧重的领域。ea提供了稳定、兼容、易用的界面使开发、支持和维护工作更快和高效。Vga能有效地减少在图形编程上花费的时间,在对复杂系统进行仿真的时候有明显的优势。Mulige Crt拥有针对实时应用优化的penFlght数据格式和多种专业选项及插件,能高效、最优化地生成实时三维(D)数据库,能与后续的实时仿真软件紧密结合。tgen Crat在大型的视景仿真和娱乐游戏环境的创建时较为适合。Te则适合于开发高帧速率三维图
9、像应用。OpenGL(全写en Grphs ibry)是由SG公司于199年7月发布的,并且在此之后一直保持对软件相对高频率的更新升级,这使得OpenG的功能越来越强大,现已成为主流的专业三维图形程序接口。OL可以和各种编程语言紧密结合,以它为基础的开发应用程序方便在各个平台间的移植,而且它为实现交互式视景仿真和虚拟现实提供了高效率的库函数,因此功能强大4。对比上述软件工具,OenGL在本文研究的课题中有以下几点优势:首先OpenL的使用相对简单;其次,由于Open发展较为成熟,其各类辅助学习和编程的资料较为完整且容易获取;最重要的是OpenG能容易地在Visual +6.0(简称VC+.0,
10、是Visua Stdio的一个开发工具库)环境下和主控制界面程序编写在一起。因此,本文选择使用OpeGL编写实时仿真显示子界面(简称子界面),完善现有的主控制界面.通过使用子界面,实验者能在实验中直观的了解飞机模型运动情况并据此对飞机模型的运动进行调整。12 本文的主要工作本文研究目的是通过使用OpnGL实现飞机运动3D实时仿真显示。具体而言就是以计算机图形学和图像处理技术为理论基础,在Win32基础上运用OpenL,以VC+.0为集成开发环境,对实验过程中飞机模型的运动情况进行实时仿真显示。为了达到这个目的,本文完成工作主要包含以下几方面:。学习和了解OpenGL和其他必要软件。研究坐标变换
11、、双缓冲和多线程等关键技术。2。 使用OeL搭建飞机模型场景,研究如何设计应用程序实现飞机模型运动实时仿真.创建一个OenGL窗口,显示飞机模型的运动仿真.3。 使用多线程技术将设计好的子界面链接到主控制界面中。1.3 本文的主要内容本文详细介绍了研究课题的实现过程和设计方法,具体的章节安排如下。第一章为绪论部分,主要简述了本文研究课题的背景意义、主要工作和主要内容。第二章中对OpG的特点和功能进行了简要的介绍。分析了在本文研究课题中使用到pnL的主要技术环节,并且说明了上述技术在本文中的使用.第三章首先对OnGL的开发环境进行介绍,并通过使用多线程技术,实现主控制界面和子界面的链接,最后研究
12、如何使用MA生成3S模型文件和3DS模型文件导入OnGL。第四章编写了基于OpenGL的飞机模型运动3D实时仿真显示的应用程序(简称应用程序)。通过分析总体结构和介绍具体模块的流程及重要代码,阐述了应用程序的开发过程。第五章对应用程序编写的成果和功能进行基本的介绍。第六章是对本次毕业设计的总结和分析。介绍应用程序设计的不足和设计过程中的得失。第二章 OpnGL简介及其实现绘图的原理和过程本章首先对OpnGL的概念、特点、基本功能进行分析,在此基础上着重研究了OeGL图形显示和OenGL绘图的前期准备两个方面.通过对OeG的初步研究为接下来应用程序的编写做准备。2。 OpenGL简介OenGL是
13、一图形硬件的一种软件接口5,被广泛应用于游戏开发、地理信息、气象模拟、虚拟现实等领域。OpenGL是高性能图形和交互场景处理的行业标准,它是一个函数库而不是一种编程语言.开发人员可以使用它提供的功能自由选择操作系统,在合适的开发平台上编写出功能强大的三维图形应用程序。OenGL是一个开发的标准,虽然由SI公司首创,但是它的标准是由OpenL体系结构审核委员会(A)掌管。AR由IBM、ntl、icoot、AT等著名公司创立,每隔四年举行一次会议,对OpeGL规范进行维护、改善和升级,使OpenGL能一直保持与时代同步。OpnGL的主要特点是具有高度的可移植性,丰富的函数库,简单易记的函数功能及命
14、名,高性能的图形渲染和与C语言能紧密结合能力.优秀的性能使得OpenGL成为当下主流的计算机仿真软件工具。21.1 OpenGL功能总的来说OpeGL是一个功能非常强大的专业三维图形程序接口,主要具有以下八大功能:1。 建模:OeGL图形库除了提供点、线、多边形等基本图元的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。2。 矩阵变换:复杂的图形都是由基本图元组成并经过一系列的变换实现的,而OpGL的变换都是通过乘以对应的矩阵来实现的。OpenGL提供了两种变换方式:基本变换和投影变换。其中基本变换包含了平移、缩放、旋转和镜像四种,投影变换包含了平行投影
15、(正射投影)和透视投影两种.3. 颜色模式设置:penGL提供了RA模式和颜色索引模式(Cor Iex)两种颜色模式。RGA模式为每个像素点指定颜色,而颜色索引模式则提供一个颜色表,各像素点通过索引颜色表得到颜色值.4 光照和材质设置:pn假设光由三原色(RGB)组成,物体对三原色分别有不同的反射率,通过物理光学模型,计算物体实际颜色。5。 纹理映射:OpnGL提供了完善的纹理映射机制可以十分逼真地表达物体表面细节。6. 位图显示:OpenL提供基本的拷贝和像素读写能力。 图像增强:OpenL提供融合、雾和反走样这三种特殊图像效果处理,使被仿真物体更具真实感,增加图形显示效果。8。双缓冲动画:
16、双缓冲技术是penGL出色的动画效果的重要保障.OpenL绘图前会先分配两个颜色缓冲区,在绘图时,一个缓冲区执行绘图命令(后台),另一个进行图形显示(前台)。循环反复,保证屏幕(前台)上总是显示已经画好的图形,以此实现图形显示的连续变化,达到动画效果,其中动画交换帧函数为SwapBf(ghDC).此外,利用peL还能实现深度暗示、运动模糊等特殊效果,从而实现消隐算法6。在本文应用程序编写过程中主要需要使用到建模、矩阵变换、颜色模式设置、光照和材质设置、位图显示及双缓冲动画等功能。2。1. OpenG图形显示方式绝大多数OpenGL在实现图像显示时都有相似的操作顺序,一系列相关的处理阶段叫做Op
17、enGL渲染管线7,如图1所示.虽然没有严格的规定OpenGL必须采用这样的实现方式,但是图1所示的顺序是一个已经得到证明的可靠的操作顺序,所以本次论文中选择通过这一顺序来实现图形显示。几何顶点数据求值器图像像素数据显示列表图像操作纹理装配逐个顶点操作与图元装配光栅化帧缓冲区片段操作图1。 OpnGL渲染管线2. eG绘图前期准备OpnGL绘图的前期准备的第一步是选择一个编译环境。现在Window系统的主流编译环境有Visal Sdio,Broland C+ Builder,Dv+等,这些编译环境都是支持OpeL的。在本文中,现有的主控制界面的编写环境是VC+60,因此同样选择VC+6。作为应
18、用程序的开发环境。第二步是要安装导入OpenGL工具包。几乎对于所有的OpnGL应用程序,在使用之前都需要导入OpeG头文件和工具函数库(GL),本文中编写程序的过程也不例外,另外Mirosf Windows要求在OenGL头文件之前包含winwh头文件。所以在本文的应用程序编程前先将OpeGL头文件和GU导入程序目录下,然后在源代码开头编写以下代码:incleidow。hnlude nudeopngl.hinclde ncudopggl。h#include iclude icuenglgt.h#nclude includeopenglglext。hinclude iludeoenlwglex
19、t。h第三步是建立OpG应用程序的框架,也就是创建OpenL窗口并对OpenGL进行初始化。这部分的具体内容在本文第四章中会有详细介绍.第三章实时仿真显示的关键技术和关键环节在上一章对peGL进行研究的基础上,本章主要介绍了在实现飞机运动实时仿真显示过程中使用到的关键技术环节,为应用程序的编写提供技术支持。本章首先介绍了本文应用程序的VC+6.0开发环境,然后分析使用多线程技术链接子界面和主控制界面的过程.由于在使用计算机动画技术实现仿真的过程中涉及各种坐标系,在实际操作中易因为混淆而产生错误,所以本章详细介绍了本文中用到的几个坐标.在本章的最后,对3DS模型文件的生成和导入OpGL这两个关键
20、环节进行研究。通过对本章中内容的研究,为应用程序的开发奠定理论基础。3。1 简介Viua C+.是crsoft公司推出的一种开发Widow应用程序的高级语言,具有强大的功能和较高的执行效率。它提供了程序设计领域中所涉及的多种技术,如文件访问,图形图像处理,数据处理和多媒体等,VC的开发对象几乎涵盖所有领域.VC是一个基于Winos操作系统的可视化且面向对象的集成开发环境8,用户可使用该环境开发有关C和C+的各种应用程序,包括了建立,编辑,浏览,保存,编译,链接和测试等操作。其中应用程序的开发主要有两种模式:Widos API方式和MFC方式,两种模式各具特色。 多线程技术在一个程序中,独立运行
21、的程序片断被叫作“线程(Thrad)9。多线程的基本概念是程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务.其目的不是为了提高运行效率,而是为了通过提高资源使用效率来提高系统的效率。Wn2多线程技术提供线程创建,线程挂起,恢复线程,线程退出、获取当前线程I和条件锁等基本操作,用户通过使用这些操作可以实现基本功能。在本文研究中,已经存在有主线程.本文为防止Open应用程序的运行对主线程产生影响,把penGL应用程序独立编写成一个线程,保证两个界面窗口能正常的同时运行.本文创建线程的具体操作如下:1. 定义一
22、个penG线程的入口函数,代码如下所示DWORD WINITeadFnc(LPVOI )peGL_Min();return 0;在上述函数中,penGMain()是OpnGL应用程序的入口函数.使用线程创建函数创建子线程后,可以调用ThreadFc1这个线程函数进入子线程.。 创建线程:用函数Creathred(NLL,0,Treaunc1,0,0,NULL)创建线程.该线程在点击了主控制界面中特定的按钮后开始创建。线程创建之后,OeGL窗口打开,开始绘制飞机模型。窗口打开的具体过程在第五章中会详细介绍.3 本文涉及的坐标系本文需要涉及到坐标系的过程主要是在OpenG窗口中模型的绘制以及模型平
23、移旋转。上述两个过程涉及多个坐标系,在编写时需要明确具体涉及哪坐标系并根据该坐标系的特点进行处理,这样才能保证程序正确运行。本文涉及的四种OpenGL坐标系,包括世界坐标、模型坐标、设备坐标和视点坐标。接下来对这四种坐标系分别进行介绍.世界坐标是OenGL中用来描述场景的坐标,Z轴正方向垂直屏幕向外,轴正方向从左到右,Y轴正方向轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置.模型坐标是以模型某一点为原点而建立的“世界坐标”,仅对模型本身适用,用来方便对模型坐标的描述。模型在OpenGL中移动时,整体的相对位置是不变的,所以用模型自身的坐标来描述模型,和人的思维习惯一致
24、。设备坐标是指将三维的世界坐标经过变换、投影等计算后最终算出的在显示设备上对应的位置.视点坐标是以视点坐标为原点,以视线的方向为Z轴正方向的坐标系。3。 3DS格式模型文件的生成目前使用OpenL绘制模型的方法主要有两种。第一种是使用pnG图形库提供的点、线、多边形等基本图元绘制函数或者相对复杂的三维物体以及复杂曲线和曲面的绘制函数,通过高级语言环境(主要是C语言)进行开发。此方法比较灵活,适用性强,在模型结构较为简单的时候有明显的优势,但要求开发者熟练掌握编程技术和OpnL,当模型结构比较复杂的时候工作量极大,而且并容易出错。另一种方法是使用专业的三维模型绘制软件绘制生成OpeGL能够读取的
25、模型文件,通过将模型文件导入OenG实现模型的绘制。此方法由于其在处理复杂模型结构时有明显优势,被广泛地使用。图2。 DAX中的飞机模型在本文的研究中,为保证Opn中的模型是飞机模型实体按比例缩小的结果,同时考虑到已有SodWrs生成的飞机模型RL格式文件,故而采用第二种方法对飞机模型进行绘制。nGL强大的功能使得自身支持FX,3S等多种模型文件的导入。由于3S格式文件ntel式的存储方式很符合wino系统下编程习惯,不需要对文件进行进一步转换,因此本文选择使用3S格式模型文件导入OpenG。为此在应用程序编写前首先需要使用D MA软件将原有的飞机模型WR格式文件转化为3DS格式,并且对模型自
26、身的三维坐标系进行调整设置。飞机模型自身坐标系调整后原点与飞机重心重合,机身长轴及短轴分别与X,Y轴重合。原点到机头顶点方向为轴正方向,从飞机正前方观察向右为Y轴正方向,机身垂直向下为Z轴正方向.最后将生成的S模型文件命名为“ei3DS”,放在程序目录下。飞机模型在D 软件中调整后的最终效果如图2所示.3.4 3DS模型文件导入OpenGL3DS模型文件由许多的块(Cu)组成的,每个块包含头和主体。众多块之间是相互嵌套的,即块是有分层的。通常一个块会包含下级子块作为自己的数据,因此在读取3DS模型文件时,必须用递归的方式读取块。在DS模型文件导入OpeGL过程中主编辑块、材质块、物体块、纹理块
27、和颜色块等对模型绘制起关键作用。DS模型文件导入OpenL的过程本质上就是合理读取块的过程,下面对几个主要的块进行介绍:1. 主编辑块(0X33)主编辑块是主块(X4D4D)的一个子块,其中包含了场景中使用的材质、配置和视口的定义方式、背景颜色等一系列相关信息。主编辑块存储了当前编辑场景的状况和当前窗口的配置数据,是3DS模型文件导入pen过程的重点研究对象。2. 材质块材质块定义了3D文件材质库中的信息,包括材质名称、颜色和纹理等.3. 物体块物体块包括了物体网格块和物体材质块。此处的物体材质块和材质块是不同的,物体材质块定义的是当前物体所使用的材质信息而材质块则定义了整个文件中所有用到的材
28、质信息。在VC+60中读取DS模型文件首先需要定义若干结构体变量并分配内存空间用于保存对应块的数据。读取3D模型文件的基本过程是先使用RadChun()函数分别读出单个块并为该模块分配内存空间,完成后释放当前模块的内存空间并将当前模块设置成前面模块。循环使用上述方法将所有需要读取的块进行内存空间分配后,将每个块的数据分类导入对应的定义好的模块结构体中。直到所有需要的块读取完毕后,将每个块的相关数据生成显示列表,DS模型文件导入penL过程结束。具体过程的流程图如图3所示。NY打开3DS文件读取一个块读取一个块ID分配内存空间储存块信息生成显示列表清空这个块的内存空间是否读取所有块清空内存空间结
29、束开始图3。 3S模型文件导入Op流程图第四章 飞机模型运动实时仿真显示的实现在前几章研究的基础上,本章将详细研究飞机模型运动3D实时仿真显示应用程序的开发过程。具体组成是首先对整个应用程序进行了总体设计,然后通过介绍各个子模块的具体实现过程,对整个应用程序的编写进行研究和说明。4 3实时仿真显示应用程序的总体设计在对penG、3DX等软件进行研究之后,为了解决如何基于OpeG实现飞机模型运动的实时仿真显示这一课题,首先对整个应用程序进行了总体设计。在本次研究中,应用程序编写的思路主要是模块化设计.模块化设计的含义就是对应用程序进行分析后将整个程序分成若干个子模块,然后对子模块分别进行设计,最
30、后将子模块有机结合在一起满足应用程序功能上的需求.模块化设计的采用有利于使应用程序的结构更加清晰、调试更加容易,从而提供程序的可靠性、可修改性、可读性和可移植性。根据OpenGL绘图的特点和程序整体功能的要求,应用程序主要分为创建窗口,程序初始化和模型场景构建及运动仿真三个模块。对三个模块分别进行设计编辑之后,完成的应用程序的流程图如图4所示。本章接下来将对三个模块程序编写的具体流程和关键的程序代码进行分析,研究整个应用程序的实现过程。YNY窗口创建开始初始化OpenGL是否是3ds文件写入模型文件读入模型文件模型信息分配模型信息内存空间生成模型信息显示列表显示姿态数据导入姿态数据设置视点和光
31、照处理姿态数据遍历显示列表绘制飞机模型OpenGL线程是否结束清空模型信息显示列表释放模型信息内存空间结束图4. 3D实时仿真显示程序的总体设计4。2 创建窗口实时仿真显示功能的实现首先需要建立一个penGL窗口。在本文应用程序中通过自行定义的ND CeteMWindow(PTR trindwame, int wdh,nt heit,DWORD dwtye, HISTANCE hInstan)函数来创建显示窗口的.窗口创建程序的流程如图5所示.最后生成一个初始大小为800,名字为“飞机动态飞行模拟”的窗口。窗口创建函数将HNl_hnd设置为窗口句柄。用WNDCLSS nclas这个窗口类结构来
32、保存窗口信息,在窗口信息中包含了nProc函数,用来处理Window消息及键盘响应.然后通过ReitrClss(ndcass)函数注册窗口。在设置完窗口的属性和大小以后,用reateWin()函数完成窗口的创建.最后用ShwWndo()函数设置窗口的显示状态后,返回窗口句柄。Wndroc函数用于处理窗口消息,主要添加的消息主要是两个部分:第一个部分是用于控制窗口的形状变化,响应窗口右上角的最小化和最大化功能,并且使窗口能够通过拉伸来调整大小。第二个部分是用于关闭窗口的,响应窗口右上角的关闭功能。实际上在本文中关闭窗口并没有将penG线程停止,而是调用ShowWindow(gl_hd,HID)将
33、窗口隐藏起来.设置窗口句柄设置并保存窗口信息响应Windows消息拓展窗口风格设置窗口显示状态返回窗口句柄图5。 创建窗口流程图4.3 程序初始化程序初始化部分承接了创建窗口,并为模型场景构建及运动仿真做准备,是应用程序重要的组成部分。本文中用vid I(ND gl_hWnd)此函数实现程序初始化,其流程如图6所示。获取窗口坐标用tClinRct(g_hWn,rRc)函数实现.初始化OpenGL就是对整个OpenGL绘图环境进行设置,总共可分为三步。第一步是重新设置窗口的像素格式,并声明一个PIXELFOMADSCRIPOR的结构体变量用来保存相关信息。第二步是为OpenL建立一个图形操作描述
34、表RC.具体步骤是先用wgreteuret(ghD)函数建立图形操作描述表。该函数的作用是以设备描述句柄_hR为参数,返回与设备描述表相关的图形操作描述表句柄g_hD.再以g_RC和g_C两个句柄为参数调用akeCurret(g_C, g_hR)函数,使建立的图形操作描述表成为线程当前使用的图形操作描述表。第三步是对投影变化进行初始化。3DS文件导入penGL的技术和原理在本文第三章中已经做过具体的分析在这里就不加以赘述.根据上述原理,在C语言程序中编写S模型文件导入函数g_Load3ds。Iort3D(&g_3DMoel, ILE_NAM)。程序初始化中导入3DS文件的具体过程是首先在程序开
35、头将飞机3DS模型文件名feiji。3DS定义到LE_AME中,然后在Ini(HND gl_hd)函数中调用导入函数,把3DS文件装入模型结构体中。获取窗口客户区坐标设置像素格式建立图形操作描述表RC初始化投影变换导入3DS模型文件图。 程序初始化流程图4。4 模型场景构建及运动仿真。4.1 飞机模型运动实时数据的获得和显示本文的应用程序的编写是应用于WDSS系统控制的飞机模型试验中的,该试验系统样机安装有用于采集飞机模型试验位姿系统关键数据的传感器。在实验过程中通过传感器采集数据,进行处理后得到飞机模型运动的六个姿态数据(俯仰,滚转,偏航的角度以及X,Y,Z轴上的位移)。由于数据的采集和处理
36、在原有主程序中已有完整的函数,故而在本文研究的应用程序中只需要直接调用数据即可.由于数据采集和处理部分不是本文研究的重点,所以在此不加以展开.本文研究的课题是“基于OenGL的飞机模型运动3D实时仿真显示”,接下来对实时性进行分析.在仿真显示的实现过程中,有几个过程会产生时间上的滞后,分别是数据采集过程,数据处理过程和OenG窗口中飞机模型绘制过程。所以本文中所指的实时并不是完全意义上的和飞机模型实体的运动同步。但是分别分析几个过程,其中Oen绘图采用双缓冲技术,刷新频率和屏幕的刷新频率一致,故而滞后时间一般是在0。01s数量级的。书籍处理过程只有几个计算函数和数据传递,滞后的时间很短.而数据
37、的采集的滞后时间也是小于0.01s数量级的。又由于本实验创建基于OpnGL的飞机模型运动3D实时仿真显示窗口的目的只要是观察飞机模型运动的情况,对于实时性这一指标在时间的精确性上要求并不是非常高。故而上述三个过程产生的总的滞后时间用肉眼很难分辨,故而其对实时性的影响在本文研究过程中可以忽略,即能够本文编写的OeGL应用程序能达到本文研究课题对于实时性的要求.OpeL应用程序从主程序中获得到六个姿态数据以后,,使用WnA函数TxtO()将姿态数据显示在OpenGL窗口的左上角。使实验者可以在观察飞机模型运动动画的同时,观察到实时的姿态数据的具体值。具体实时姿态数据显示函数中显示俯仰角度数据的代码
38、如下:car str0100;srintf(str0, ”%-0.3f, w.pitch);cars_itch = 俯仰角度:;stct(sr_ptch, sr0);SeBkColor(g_hD,ULL);extOu(ghD,5,5,trch,strlen(strpich));SetTextColr(_hC,RGB(0,20,);.4。2 飞机模型的绘制在绘制飞机模型前,首先需要调用gCear()函数对OpenGL进行颜色清除以及深度缓冲。然后用glLodIenty()函数设置单位矩阵,具体作用就是将飞机模型自身坐标系和世界坐标系重合.最后使用looAt()函数设置观察视角。在设置好这些参数后
39、,就具备了绘制飞机模型的基本条件。具体飞机模型场景的绘制有两个部分.第一部分是使用OeGL图形库提供线绘制函数glBn(GL_IE_LOOP)绘制一个2.81。4的长方体框架(尺寸具体参考已有的WPS控制的风洞试验原理样机的设计尺寸1).具体的思路就是先计算出长方体的八个顶点的坐标,然后根据点绘制线,最后通过分别绘制长方体框架的六个面来完成框架的绘制.第二部分是绘制已经导入的3S模型文件中的飞机模型.绘制的具体方法是遍历飞机模型中所有的对象生成的显示列表(具体生成过程在第三章中有详细介绍),将3DS模型文件导入过程中生成的显示列表里的信息全部显示出来.在主控制界面调整飞机姿态数据后,数据传递到
40、OpenGL线程后。需要使用位移变化和旋转函数调整飞机模型的位置。由于位移变化和旋转是以世界坐标为基准的,所以在调用位移和旋转函数后需要配对调用glPushtrix()和glPopMtx()函数。这两个函数配对调用在本文应用程序中实现的作用是保证下一次调用位移和旋转函数时飞机模型自身坐标系和世界坐标系重合.具体的程序代码如下: glTranslatef(_x,g_y,_);glRotf(g_Rtax,1。0f,0, ); /绕指定轴旋转lRotate(gRtat, 0, 1。f, 0); /pith的角度lRotef(_otatez, 0, 0,。0); /yw的角度glPushMi(); /
41、将当前变换矩阵(单位阵)压入堆栈lPpMati();在本文程序编写时为了降低OnGL使用时的PU使用率,通过在交换缓冲区前调用Sleep(5)函数,使交换缓冲区过程停滞5毫秒。能够在不影响视觉效果的情况下降低刷新频率,从而减低CPU使用率。本文中应用程序为避免与主控制界面程序中的定时器发生冲突,在模型场景构建及运动仿真部分并未单独设置一个定时器,而是只是使用一个Wile()循环一直循环刷新该部分。具体来说,飞机模型运动数据的获取的频率可以理解为和主控制界面中相关部分的定时器设置的刷新频率相同。而数据的显示、场景的绘制和飞机模型的运动的刷新频率在默认设置的情况下根据OpenG双缓冲技术的原理和n
42、2A的原理和程序运行设备的屏幕的刷新频率相同。第五章 成果展示和功能分析本文应用程序编写完成后,生成Oenh和OpnGLcp两个文件,将两个文件和OpenGL库文件及头文件添加到主控制界面程序中.在主控制界面程序中利用多线程技术创建OpenGL子线程,编译运行通过后,就可以得到主控制界面,如图7所示,并在主控制界面中找到打开子界面的功能.本章将对生成的OpenGL子界面的打开方法和OpenG子界面的功能进行介绍。图7。 主控制界面OpenGL子界面的打开是需要通过主控制界面上的功能键来实现的。具体操作为鼠标左键单击界面左上角工具栏中“窗口键(如图8所示),将鼠标移动到“D显示键上,左键单击即可
43、得到OenL子界面(如图9所示).图8OpenGL子界面窗口打开结合图8分析OpenG功能。首先右上角的最小化,最大化和关闭键能实现OpeGL子界面窗口最基本的缩放和关闭的功能.右上角为OenGL子界面窗口的名称:飞机动态飞行模拟。下方绿色字体显示了飞机模型运动六个姿态数据的实时数值。角度数据的单位是度,位移数据的单位是米,两组数据都精确到小数点后三位.OeGL子界面窗口中间部分是飞机模型和外部框架.用于实时显示飞机模型实体在试验过程中的运动情况.在WDPSS系统原理样机电机不运动的情况下,单独在主控制界面中输入姿态数据,可以在子界面中也可以进行粗略的模拟。图9。 OpenGL子界面窗口第六章总结随着计算机仿真技术的飞速发展,如何有效的利用仿真技术更加直观的表现模拟仿真结果成为了当下最热门的研究课题之一.