vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书论文.docx
《vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书论文.docx》由会员分享,可在线阅读,更多相关《vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书论文.docx(56页珍藏版)》请在冰豆网上搜索。
vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书论文
毕业设计(论文)
课题
名称
三维图像的生成与显示技术研究
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年月日
导师签名:
日期:
年月日
摘要
最早人们见到的图像都是平面图像,也就是通常所说的二维图像,但自21世纪以来二维图像早已不能满足人们的视觉要求,之后3D化像风暴一样席卷而来。
3D图形系统能够较形象的模拟和表示客观物体,易于通过模拟光线照射物体表现物体的质感。
OpenGL是优秀的开放的2D/3D图形标准,由OpenGL体系结构委员会(ARB)所掌管。
OpenGL图形系统是图形硬件的一个软件接口,它强大的渲染管线能够绘制出逼真的虚拟场景,使图像看起来更加真实,就像每一个人平时所看到的一样或至少接近人眼所看到的内容。
本文研究了基于OpenGL的三维视景应用程序的初始化、世界坐标系和模型局部坐标系之间的关系和平移旋转并缩放的矩阵表示以及如何将景中的模型分解为OpenGL可以接受的图元信息,建立了一个卫星与深空场景的动态仿真系统,该系统根据各个天体运行规律,详细计算了卫星及各星体的运行轨迹,真实地模拟了深空场景的动态变化,能够实时地模拟不同视角、不同时间的卫星及深空动态场景。
关键词:
3D图形OpenGL模型视图变换类封装卫星
Abstract
Theearliestimagesweseeareplaneimages,2Dimageisusuallysaid,butsincetwenty-firstCenturythetwo-dimensionalimagealreadycannotsatisfypeople'svisualrequirements,after3Dsweptlikeastorm.
The3Dgraphicssystemsimulatesandreflectsobjectsintherealworldvividly.
OpenGLisa2D/3DgraphicsstandardinchargeofArchitectureReviewBoard(ARB)andisasoftwareinterfacetohardware.Itspowerfulpipelineiscompetentforrenderinggraphicsscene,makestheimagelookmorereal,justlikeeverypersonusuallyseethesameoratleastclosetothehumaneyecanseecontent.
Thispaperstudythe3DOpenGLapplicationinitialization,theworldcoordinatesystemandthemodeloflocalcoordinatesystemandtherelationshipbetweentranslationandrotationandscalingmatrixrepresentationandhowwillthekinginthemodelisdecomposedintoprimitiveinformationbasedonOpenGLcanaccept,establishedadynamicsimulationsystemofasatelliteanddeepspacescene,thesystemaccordingtoeachobjectoperationrules,detailedtrajectoryofsatelliteandthestarswerecalculated,realisticsimulationofthedynamicchangesofdeepspacescene,real-timesimulationofdifferentperspectives,differenttimeofthesatelliteanddeepspacedynamicscene.
Keywords:
3DgraphicsOpenGLmodel-viewtransformationwrappingwithclassSatellite
第一章绪论
最早人们见到的图像都是平面图像,也就是通常所说的二维图像,但自21世纪以来二维图像早已不能满足人们的视觉要求,之后3D化像风暴一样席卷而来,人们对三维图像的研究也越来越深入。
1.1研究背景和意义
近几年,利用计算机虚拟现实技术生成动态场景的仿真图像已被广泛地应用于遥感、虚拟战场仿真、目标识别与跟踪、通信等领域。
而卫星与深空动态场景的仿真是实现卫星与地球通信的三维通信的关键技术之一。
同时,航天事业作为一种高投入、高风险的科技密集型行业,可视化仿真系统的研制是降低其成本和风险、提高成功率的有效途径之一。
1.2OpenGL简介
OpenGL是图形硬件的一种软件接口。
OpenGL全称OpenGraphicsLibrary,是一个优秀的专业化的3D的API(ApplicationProgrammingInterface)。
作为与DirectX类似的语言,OpenGL最早是以SGI为图形工作站开发的图形开发接口IRIXGL,它可以独立于操作系统于硬件环境。
程序员只需进行布景、建模、光照与渲染然后调用相应的OpenGLAPI指令,无须与图形硬件直接打交道。
OpenGL负责与操作系统和底层硬件交互。
OpenGL与C语言紧密结合。
OpenGL的语法遵从C语法,由于C语言应用的广泛,使得程序员很容易掌握OpenGL指令集。
OpenGL具有很高的可移植性。
OpenGL的设计目标就是作为一种流线型的、独立于硬件的接口,在当今大部分主流操作系统Unix/Linux、Windows98/NT/2000/XP/Vista和MacOS等都有其相应的实现。
然而为了达到这个目标,OpenGL并未包含用于执行窗口任务或者获取用户输入之类的函数。
反之,必须通过窗口系统控制所使用的特定硬件。
类似地,OpenGL并没有提供用于描述三维物体模型的高层函数(这类函数可能允许你指定相对较为复杂的形状、例如汽车、身体的某个部位、分机或分子等)。
在OpenGL中,必须根据少数几个基本图元(GeometricPrimitive)(例如点、直线、多边形)来创建你所需要的模型。
OpenGL可进行高性能的图形渲染。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
1.2.1OpenGL工作方式
OpenGL指令模式是C/S(C1ient/Server,客户/服务器)模型,通常用户程序(客户)发出命令提交给内核程序(服务器),内核程序再对各种指令进行解释,并初步处理,之后交给操作系统服务而转交给硬件。
上述过程可以在同一台计算机上完成,也可以在网络环境中,由不同的计算机合作完成,OpenGL通过上述合作实现网络透明。
图1.1OpenGL工作流程
OpenGL指令集封装在库或共享程序集中,应用程序发出OpenGL命令后,OpenGL调用被这些库处理。
然后传递服务内核处理后进一步交由操作系统,操作系统根据具体的硬件,例如不同的显示卡进行具体处理。
如调用厂家的服务驱动程序或调用公共驱动程序,最后传递给视频显示驱动,而驱动程序驱动显示卡向显示屏幕提供显示。
整个处理过程都在计算机后台完成,基本不需要程序员参与。
程序员只需要开发应用程序部分,管理硬件的工作交由计算机完成。
1.2.2OpenGL渲染管线
OpenGL具有超强的图形绘制能力,包括绘制物体、启动光照、管理位图、纹理映射、动画、图像增强以及交互技术等功能。
作为图形硬件的软件接口,OpenGL主要是将三维的物体投影到一个二维平面上,之后处理得到像素,进行显示。
OpenGL首先将物体转化为可以描述物体集合性质的顶点(Vertex)与描述图像的像素(Pixel),在执行一系列操作后,最终将这些数据转化成像素数据。
也就是说,OpenGL是基于点的。
在OpenGL中,无论何种情况,指令总是被顺序处理。
由一组顶点定义的图元(Primitive)执行完绘制操作后,后继图元才能起作用。
绝大部分OpenGL实现都有相似的操作顺序,即称为OpenGL渲染管线的一系列相关的处理阶段。
1.2.3OpenGL数据类型
OpenGL定义了自身的数据类型,主要有GLbyte,GLshort,GLint,GLfloat,GLdouble,GLubyte,GLushort和GLuint。
不同的OpenGL实现在选择哪些C语言数据类型来表示OpenGL数据类型方面存在一些差异。
使用OpenGL定义的数据类型,就可以在OpenGL代码跨平台移植时避免类型不匹配的问题。
1.3本文框架结构
本文通过对三维图像的生成及显示理论进行系统认真的学习和研究,查阅了大量的国内外相关的文献和资料,主要完成了三维图像的图像建模、色彩渲染、动画应用等。
本文的主要结构如下所示:
第一章,绪论。
本章首先介绍了三维图形学研究的背景和意义,然后简述了OpenGL的理论框架,最后陈述了本文的内容安排。
第二章,国内外研究现状。
本章介绍了三维图形学的历史、发展及将来的研究方向。
然后介绍了其在太空通信方面的应用。
第三章,OpenGL实现三维图像显示的基本理论。
本章详细阐述了OpenGL的基本原理,首先讲述了OpenGL场景坐标的建立,然后介绍了OpenGL投影的变换,窗口视口的计算以及基本图元的绘制。
第四章,三维图像的实现及结果分析。
本章介绍了OpenGL的初始化和三维图像的建模、色彩渲染、动画应用,以及卫星在深空场景仿真的实现。
第五章,总结和展望。
本章总结了本设计所完成的工作,并对其中的缺陷做出了说明,指出了所实现的三维图像在通信方面的不足,对下一步的工作做了展望。
第二章三维图形学的国内外研究现状及发展
2.1国内外研究现状
当前,研究卫星及深空场景仿真的工作还不太多。
MRC和波音宇航公司等最早开发出天体背景描述器(CBSD)。
可得到指定时刻的任意方向和任意大小视场的星空场景;Hallet建立了在轨飞行器可视化计算机图形系统;Hagedorn利用虚拟现实技术,采用交互图形工作站对飞行器试验任务提供支持;Standridge采用2维和3维空间建模的方法。
通过可视化仿真技术演示和观察地心轨道上卫星运行状态。
Stytz开发了一组十分简洁的卫星姿态显示模型及仿真软件,其能较逼真地动态显示在轨卫星姿态变换动画。
Kenneth对通讯卫星在太空运行的场景及不同姿态对通讯的影响进行了仿真;Andrew提出了一个太空飞船飞行模拟的框架。
国内这方面的研究起步较晚,2001年提出了可将虚拟现实技术与卫星仿真技术相结合,辅助卫星的设计、制造和发射实现了一个面向卫星系统仿真的可视化环境,可显示卫星系统运行过程的动态三维场景,并对小卫星轨道姿态控制系统仿真进行了研究;从可视交互仿真模型设计的角度提出了人造地球卫星的一组几何定轨方法,对惯性卫星组合导航开发平台的可视化仿真和实现进行了研究;利用三维可视化技术实现了挠性卫星飞行姿态的计算机三维动画仿真;在上述工作的基础上,本文提出了一个卫星与深空场景实时生成的方法,基于真实的卫星轨道及天文学星表数据,综合了计算机图形学及天文学知识,模拟出卫星的运动过程及其与星空的合成场景;同时采用一系列加速绘制技术,实时生成了卫星与深空动态场景并能进行多视点交互虚拟漫游。
2.2三维图形学发展
三维图形学的发展主要包括硬件、软件和算法三方面的发展。
2.2.1三维图形学硬件的发展
(1)被动式三维图形学
1950年,美国麻省理工学院MIT的旋风1号计算机,是世界上第一台图形显示器。
用一个类似于示波器的CRT来显示一些简单的图形。
1958年,美国Calcomp公司由联机数字记录仪发展成滚筒式绘图仪。
1958年,GerBer公司把数控机床发展成为平板式绘图仪。
50年代末,MIT的林肯实验室在旋风计算机上开发的SAGE空中防御系统,第一次使用了具有交互功能的CRT显示器。
(2)交互式三维图形学
60年代中期使用随机扫描显示器,60年代后期使用存储管式显示器,70年代中期出现了基于电视技术的光栅图形显示器。
80年代出现了光栅图形显示器的PC和图形工作站。
图形输入设备如光笔、鼠标、操纵杆、键盘t跟踪球拇指轮等也同时在不断更新和发展。
(3)沉浸式三维图形学
虚拟现实系统VirtualRealitySystem;
增强现实系统AugmentedRealitySystem将真实世界信息和虚拟世界信息无缝集成;
相应图形硬件如数据衣、数据手套、数据鞋以及头盔、立体眼镜、运动捕获设备等得以迅速的发展。
2.2.2三维图形学软件的发展
1974年,美国国家标准化局ANSI提出了制定图形软件功能标准化的基本规则。
此后,美国计算机协会ACM成立了图形标准化委员会。
1977年提出了“核心图形系统"CGS(CoreGraphicsSystem)的规范;
ISO发布了计算机图形接口CGI,计算机图形元文件标准CGM,计算机图形核心系统GKS,程序员层次交互式系统PHIGS,基本图形转换规范IGES,产品数据转换规范STEP等计算机三维图形标准;
在各种三维图形标准之上,开发了各种应用图形软件3DMAX,MAYA,CorelDraw,LightScape等,广泛应用于制造、军事、地质、农业、科研、商务、教育、影视媒体等各个领域。
2.2.3三维图形学算法的研究范畴
基于三维图形设备的基本图形元素的生成算法;
基本三维图形元素的几何变换、投影变换和窗口剪裁等;
自由曲线曲面的插值、拟合、拼接、分解、过渡、光顺、整体修改、局部修改等;
三维图形元素(点、线、面、体)的求交、分类及集合运算;
隐藏线、隐藏面的消除以及具有光照效果的真实感图形显示;
不同字体的点阵表示,矢量中、西文字符的生成与变换;
三维形体的实时显示和图形的并行处理;
三维图形用户界面及交互技术;
虚拟现实环境的生成及其控制算法等。
2.3计算机三维图形学的应用
科学数据可视化(ScientificVisualization),人机交互技术,影视制作(Films),游戏(Games),医学手术导航、医学图像处理(MedicalImaging),CAD/CAM,军事,图形用户界面(UserInterface)。
第三章OpenGL实现三维图像显示的基本理论
人们能够观察到图像,实际上是图像在人眼的视网膜上成像的结果,而要完成图像的显示就必须要建立图像坐标,下面我们就从图像的坐标建立开始说起。
3.1场景坐标系
计算机产生的图形存在于几何学所研究的仿射空间中口1。
从基本数学概念上来说,一个坐标系对应了一个仿射空间(AffineSpace),当矢量从一个坐标系变换到另一个坐标系时要进行线性变换(LinearTransformation)。
对点来说,要进行仿射变换(AffineTransformation)。
因此用同源坐标,它能在对矢量进行线性变换的同时对点进行仿射变换。
坐标变换的基本操作就是将变换矩阵乘以矢量或点。
仿射空间中不存在原点,也不包括任何定义长度和角度的机制。
但是在计算机图形学中,模型(比如卡车或虚拟世界)一般只是考虑相对坐标,因此没有任何点被真正的区分区。
3.1.1坐标系及观察流程
物体模型要显示在屏幕上必须最终确定其显示的位置,即物体在设备坐标系中的位置。
但逻辑上物体的位置总是在待渲染的场景中确定的,即建模坐标系中的位置。
场景设计者设置物体在建模坐标系中的位置,然后OpenGL将其最终转换成显示设备坐标系中的位置。
其中设计人员需要指定建模坐标系并将其传递给OpenGL,以供OpenGL转换。
事实上,在从场景物体位置转化成设备坐标系位置,最后物体显示在屏幕上的过程中存在四种坐标系:
建模坐标系(ModelingCoordinate),世界坐标系(WorldCoordinate),规范化设备坐标系(NormalizedDeviceCoordinate)和设备坐标系(DeviceCoordinate),它们之间的坐标变换如图3.1所示。
MCWCNVCDC
图3.1坐标系变换
3.1.2OpenGL坐标系方向
OpenGL采用右手系坐标系统,即伸出右手沿正向方向弯曲手指,则定义的方向对应于拇指所指向的方向。
如图3.2所示。
图3.2右手法则
3.1.3模型视图变换
场景设计人员需要指定建模坐标系。
OpenGL中默认的当前建模坐标系就是世界坐标系,且观察点位于世界坐标系原点,Z轴指向观察点,从观察点看去右边是X轴正向,上边是Y轴正向。
若要修改之使其符合场景的需要,必须指定坐标系变换。
在OpenGL以及绝大多数图形系统中坐标系变换是以矩阵的形式表示的,若要指定变换需将变换矩阵作为参数传递给OpenGL,即调用OpenGL模型视图变换。
指定OpenGL模型视图变换有两种方法:
(1)直接传递变换矩阵。
(2)指定变换类型和变换参数。
指定矩阵参数的API是glMultMatrix(将参数乘以当前模型视图变换矩阵)和glLoadMatrix(将参数指定为当前模型视图变换矩阵)。
该方法的优点是可以一次性指定多个变换的最后的变换结果。
OpenGL模型视图变换对应于几何中三种仿射变换有平移,旋转和缩放三种变换:
API分别是glTranslate(平移),glRotate(旋转)和glScale(缩放)。
该方法比传递表示一种变换的矩阵参数效率高而且直观。
假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的坐标矩阵v。
所以,经过变换得到的顶点坐标就是((RT)v)。
由于矩阵乘法的结合率,((RT)v)=(R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。
即:
实际变换的顺序与代码中写的顺序是相反的。
所以,“先移动后旋转”和“先旋转后移动”得到的结果很可能不同。
3.1.4提高绘图效率和场景的层次性
在绘制具有多层建模层次的复杂场景时,会涉及很多模型视图矩阵操作,可利用OpenGL提供的矩阵堆栈来提升效率。
矩阵堆栈适用于构建层次式的模型,也就是通过简单的模型构建复杂的模型。
例如,假如绘制的是一辆有4个轮子的汽车,每个轮子用5颗螺钉固定到汽车上。
由于所有的轮子都是相同的,所有的螺钉看上去也没什么区别,因此可以用一个函数绘制轮子,用另一个函数绘制螺钉,这两个函数在一个方便的位置和方向绘制一个轮子或一颗螺钉,例如它们的中心在原点,并且它们的轴与Z轴对齐。
当绘制这辆包括了轮子和螺钉的汽车时,需要4次调用画轮子的函数,每次都使用不同的变换,使每个轮子处于正确的位置。
当绘制每个轮子时,需要5次调用画螺钉的函数,每次都要根据轮子进行适当的变换。
假定只需要绘制车身和轮子,可以改用以下方法。
绘制车身。
记住自己的位置,并移动到右前轮的位置。
绘制轮子,并丢弃上一次所进行的变换,使自己回到车身的原点位置。
记住自己的位置,然后移动到左前轮。
类似地,对于每个轮子,需要绘制轮子,记住自己的位置,然后连续地移动移动到绘制螺钉的每个位置,在画完每个螺钉之后丢弃上一次所进行的变换。
由于变换是以矩阵的形式存储的,因此矩阵堆栈提供了一种理想的机制,用来完成这种类型的连续的记忆,移动和丢弃操作。
在OpenGL中模型视图矩阵的操作是矩阵堆栈最顶部的那个元素。
glPushMatrix是压栈,glPopMatrix是弹出。
3.2投影
一个场景要显示在屏幕上必须确定场景中的哪些物体是可见的,投影变换的一个目的就是定义一个可视空间。
定义可视空间有两种用途。
它决定了一个3D空间中的物体如何映射到屏幕上(即通过使用透视投影或正投影),并且定义了哪些物体或物体的部分被裁剪于最终的图像之外。
投影有透视投影和正投影两种类型。
3.2.1透视投影
透视投影最显著的特点是透视缩放(foreshortening):
物体距观察点越远,它最终在屏幕上看上去就越小,比如在火车头内向前照一个铁轨的照片,两条铁轨似乎在远处相交了。
这是因为透视投影的可视空间是一个金字塔的平截头体。
位于可视空间之内的物体被投影到金字塔的顶点,也就是观察点位置。
靠近观察点的物体看上去大一些,因为和远处的物体相比,在平截头体的较大部分里,它们占据了相对较大的可视空间。
这种投影方法常用于动画,视觉模拟以及其他要求某种程度的现实感的应用领域,因为它和日常生活中用眼睛观察事物的方式相同。
g1Frustum()函数用于定义一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般为单位矩阵)相乘。
记住,可视空间用于裁剪那些位于它之外的物体。
平截头体的4个侧面,项面和底面对应于可视空间的6个裁剪平面,位于这些平面之外的物体或物体的部分将被裁剪掉,不会出现在最终的图像中。
且g1Frustum()函数并不需要定义一个对称的可视空间。
图3.3glFrustum()创建透视投影
平截头体在三维空间中有一个默认的方向,可以在投影矩阵上执行旋转或移动,来改变方向。
但是,这种方法难度较大。
glFrustum()的使用不是很