vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书教学提纲.doc
-
资源ID:86304150
资源大小:1.43MB
全文页数:41页
- 资源格式: DOC
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
vc++OpenGL三维图像的生成与显示技术研究毕业设计说明书教学提纲.doc
Good is good, but better carries it.精益求精,善益求善。vc+OpenGL三维图像的生成与显示技术研究毕业设计说明书-毕业设计(论文)课题名称三维图像的生成与显示技术研究摘要最早人们见到的图像都是平面图像,也就是通常所说的二维图像,但自21世纪以来二维图像早已不能满足人们的视觉要求,之后3D化像风暴一样席卷而来。3D图形系统能够较形象的模拟和表示客观物体,易于通过模拟光线照射物体表现物体的质感。OpenGL是优秀的开放的2D3D图形标准,由OpenGL体系结构委员会(ARB)所掌管。OpenGL图形系统是图形硬件的一个软件接口,它强大的渲染管线能够绘制出逼真的虚拟场景,使图像看起来更加真实,就像每一个人平时所看到的一样或至少接近人眼所看到的内容。本文研究了基于OpenGL的三维视景应用程序的初始化、世界坐标系和模型局部坐标系之间的关系和平移旋转并缩放的矩阵表示以及如何将景中的模型分解为OpenGL可以接受的图元信息,建立了一个卫星与深空场景的动态仿真系统,该系统根据各个天体运行规律,详细计算了卫星及各星体的运行轨迹,真实地模拟了深空场景的动态变化,能够实时地模拟不同视角、不同时间的卫星及深空动态场景。关键词:3D图形OpenGL模型视图变换类封装卫星AbstractTheearliestimagesweseeareplaneimages,2Dimageisusuallysaid,butsincetwenty-firstCenturythetwo-dimensionalimagealreadycannotsatisfypeople'svisualrequirements,after3Dsweptlikeastorm.The3DgraphicssystemsimulatesandreflectsobjectsintherealworldvividlyOpenGLisa2D3DgraphicsstandardinchargeofArchitectureReviewBoard(ARB)andisasoftwareinterfacetohardwareItspowerfulpipelineiscompetentforrenderinggraphicsscene,makestheimagelookmorereal,justlikeeverypersonusuallyseethesameoratleastclosetothehumaneyecanseecontent.THISPAPERSTUDYTHE3DOPENGLAPPLICATIONINITIALIZATION,THEWORLDCOORDINATESYSTEMANDTHEMODELOFLOCALCOORDINATESYSTEMANDTHERELATIONSHIPBETWEENTRANSLATIONANDROTATIONANDSCALINGMATRIXREPRESENTATIONANDHOWWILLTHEKINGINTHEMODELISDECOMPOSEDINTOPRIMITIVEINFORMATIONBASEDONOPENGLCANACCEPT,ESTABLISHEDADYNAMICSIMULATIONSYSTEMOFASATELLITEANDDEEPSPACESCENE,THESYSTEMACCORDINGTOEACHOBJECTOPERATIONRULES,DETAILEDTRAJECTORYOFSATELLITEANDTHESTARSWERECALCULATED,REALISTICSIMULATIONOFTHEDYNAMICCHANGESOFDEEPSPACESCENE,REAL-TIMESIMULATIONOFDIFFERENTPERSPECTIVES,DIFFERENTTIMEOFTHESATELLITEANDDEEPSPACEDYNAMICSCENE.KEYWORDS:3DGRAPHICSOPENGLMODEL-VIEWTRANSFORMATIONWRAPPINGWITHCLASSSATELLITE目录第一章绪论11.1研究背景和意义11.2OpenGL简介11.2.1OpenGL工作方式11.2.2OpenGL渲染管线21.2.3OpenGL数据类型31.3本文框架结构3第二章三维图形学的国内外研究现状及发展42.1国内外研究现状42.2三维图形学发展42.2.1三维图形学硬件的发展42.2.2三维图形学软件的发展52.2.3三维图形学算法的研究范畴52.3计算机三维图形学的应用5第三章OPENGL实现三维图像显示的基本理论63.1场景坐标系63.1.1坐标系及观察流程63.1.2OpenGL坐标系方向73.1.3模型视图变换73.1.4提高绘图效率和场景的层次性83.2投影83.2.1透视投影83.2.2正投影103.2.3投影变换示例103.3窗口与视口113.3.1视口变换113.3.2变换深度坐标123.4几何图元的绘制123.4.1点133.4.2直线133.4.3多边形133.4.4矩形143.4.5曲线和表面14第四章三维图像显示的实现及分析154.1概要设计154.2Windows操作系统下OpenGL应用程序初始化164.2.1应用程序依赖库164.2.2像素格式174.2.3渲染描述表174.3建模技术概述184.3.1基于几何造型的建模技术184.3.2基于图像的建模技术184.3.3卫星建模示例194.4色彩的渲染204.4.1颜色204.4.2纹理贴图224.4.3位图读取244.5用户交互与动画254.5.1用户交互254.5.2动画254.6相关算法及原理描述274.7卫星与深空动态场景合成274.7.1场景合成方法274.7.2加速绘制方法284.8结果分析29第五章总结与展望315.1总结315.2展望31致谢36参考文献37附录39-第一章绪论最早人们见到的图像都是平面图像,也就是通常所说的二维图像,但自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通过上述合作实现网络透明。应用程序OpenGL内核服务显示器显示卡显卡驱动操作系统服务包含OpenGL指令OpenGL指令集(Windows上以DLL形式存在)图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所示。xyz图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()函数并不需要定义一个对称的可视空间。frustumbottomleftrighttopnearfar图3.3glFrustum()创建透视投影平截头体在三维空间中有一个默认的方向,可以在投影矩阵上执行旋转或移动,来改变方向。但是,这种方法难度较大。glFrustum()的使用不是很直观。因此,也可以用OpenGL工具库函数g1uPerspective()。这个函数创建一个可视空间,它与调用glFrustum()所产生的可视空间相同,但可以用一种不同的方式来指定它。这个函数并不是指定近裁剪平面的角,而是指定y方向上的视野的角度()和纵横比(x/y)。(对于正方形的屏幕,纵横比为1.0)。这两个参数足以确定沿实现方向的未平截头体金字塔,还需要指定观察点和近侧及远侧裁剪平面的距离,也就是对这个金字塔进行截除。此外,g1uPerspective()仅限于创建沿视线方向同时在x轴和y轴上对称的平截头体,这通常是所需要的。和glFrustum()函数一样,可以执行旋转或移动,改变由gluPerspective()所创建的可视空间的默认方向。如果没有这样的变换,观察点就位于原点,视线的方向沿z轴的负方向。使用gluPerspective(),需要挑选适当的视野值,否则图像看上去就会变形。为了获得完美的视野,可以推测自己的眼睛在正常情况下距离屏幕有多远以及窗口有多大,并根据距离和大小计算视野的角度。计算结果可能比想象的要小。也可以换一种方法考虑这个问题。一个35毫米的照相机如果要达到94度的视野,它的镜头就要求达到20毫米,这已经是非常宽的镜头了。frumstumnearfarhwAspect=w/h图3.4gluPerspective()创建透视投影3.2.2正投影正投影相当于在无限远处观察得到的结果,它只是一种理想状态。但对于计算机来说,使用正投影有可能获得更好的运行速度。在正投影下,可视空间是个平行的长方体。物体和照相机的距离并不影响它看上去的大小。这种类型的投影用于建筑蓝图和计算机辅助设计的应用程序。在这类应用程序中,当物体经过投影之后,会保持它们的实际大小以及它们之间的角度。gl0rtho()函数创建一个正交平行的可视空间。和glFrustum()一样,需要指定近侧裁剪平面的角和到远侧裁剪平面的距离。如果没有其他变换,投影的方向就与z轴平行,观察点的方向直接朝向z轴的负方向。观察点图3.5g10rtho()创建正交投影3.2.3投影变换示例以下两图是图4-3在透视投影和正投影下的不同观察效果。图3.6正投影图3.7透视投影3.3窗口与视口窗口(window):世界坐标系中要显示的区域(不是指屏幕窗口)。视口(viewport):窗口映射到显示器上的区域。窗口定义了显示内容,而视口定义了显示位置和大小。在规范化坐标系NVC下定义视口范围,变换到规范化的设备坐标系中。ywmaxywminWCxwmaxDC窗口视口xwminxvminxvmaxyvmaxywmin(xw,yw).(xv,yv)图3.8窗口视口变换关缩放S+位移T的复合变换计算公式如下:若缩放系数sx和sy不相等,图形对象会产生变形。3.3.1视口变换视口变换类似于照相机冲洗相片大小这个阶段。在计算机图形中,视口是个矩形的窗口区域,图像就是在这个区域中绘制。视口是用窗口坐标来测量的,后者反映了屏幕上的像素相对于窗口左下角的位置。所有的顶点都已经通过模型视图矩阵和投影矩阵进行了变换,那些位于可视空间之外的顶点均已被裁剪掉。在屏幕上打开窗口的任务是由窗口系统而不是OpenGL负责的。但是,在默认情况下,视口被设置为打开窗口的整个像素矩阵。可以使用glViewPort()函数选择一个更小的绘图区域。例如,可以对窗口进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。使用glViewport()来定义视口。3.3.2变换深度坐标深度Z坐标是在视口变换期进行编码的(并在以后存储于深度缓冲区中)。可以使用glDepthRange()函数,对z值进行缩放,使他们位于一个需要的范围之间。在透视投影中,变换后的深度坐标(和x坐标及y坐标一样)也进行了透视除法(除以w坐标)。当变换后的深度坐标远离近侧平面时,它的位置就逐渐变得不太精确。3.4几何图元的绘制无论多么复杂的模型都要分解成点,线,面这些图元,再将所有这些模型的图元信息传递给OpenGL,OpenGL根据这些信息来绘制图形的几何形状。几何学中的点、直线和多边形的概念与在计算机中的点、直线和多边形会有所不同。数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点。另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点。一般情况下,OpenGL中的点将被画成单个的像素,虽然它可能足够小,但并不会是无穷小。同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点,但该像素的具体颜色将取决于OpenGL的实现。同样的,数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。多边形是由多条线段首尾相连而形成的闭合区域。OpenGL规定,一个多边形必须是一个“凸多边形”。通过点、直线和多边形,就可以组合成各种几何图形。要OpenGL按照用户的设计绘制物体,除了必须向OpenGL传递顶点信息外,还必须将这些顶点的组合方式传递给OpenGL。即需要把一组顶点放在一对glBegin()和glEnd()之间,传递给glBegin()的参数决定了由这些顶点所构建的几何图元的类型。例如,同样指定了五个点,所传递的图元类型参数不同,将绘制不同的图元。GL_POLYGONGL_Point图3.9多边形或者一组点3.4.1点OpenGL是基于点的,也就是说在OpenGL中,所有的几何物体最终都被描述成一组有序的顶点。可以使用glVertex*()函数来指定顶点。点可以用一组称为顶点的浮点数来表示。所有的内部计算都是建立在把顶点看成是三维的基础之上的。用户可以把顶点指定为二维的形式(也就是说,只有x和y坐标),并由OpenGL为它赋一个值为0的z坐标。3.4.2直线在OpenGL中,直线这个术语表示一段线段,而不是数学意义上在两边无限延伸的直线。指定一些列彼此相连接的线段,甚至是闭合的线段都是非常容易的。但是不管在哪种情况下,组成连线系列的直线都是根据它们的终点位置的顶点指定的。3.4.3多边形多边形是由单闭合的线段循环包围的区域,其中线段是由它们的终点位置的顶点所指定的。一般情况下,多边形是通过填充它内部的像素绘制而成的。但是,也可以仅仅绘制多边形的外框,甚至把它画成一系列的点的形式。在一般情况下,多边形有可能非常复杂。因此OpenGL在基本多边形的构成方面施加了很强的限制。首先,在OpenGL中,多边形的边不能相交(按照数学上的术语,满足这种条件的多边形称为简单多边形)。其次,OpenGL的多边形必须是凸多边形,也就是不存在内陷的部分。准确的描述是:在一个多边形的内部任意取两个点,如果连接这两个点的线段都在这个多边形的内部,那么这个多边形就是凸多边形。但是,OpenGL并不限制构成凸多边形的边界线段的数量。另外,OpenGL无法描述中间有洞的多边形,因为它们是非凸的,并且无法由一个闭合的线段循环所构成的边界来绘制。如果用OpenGL描述一个非凸的填充多边形,其结果是不确定的。例如,在大多数系统中,不大于多边形凸包的地方将被填充。但在有些系统中,小于凸包的地方将被填充。有效的无效的图3.10有效和无效的多边形OpenGL在合法多边形的构成方面施加这些限制的原因是:这些限制有利于提供快速的多边形渲染硬件来渲染符合条件的多边形。简单多边形的渲染速度非常快,而那些困难的情况就难以快速检测。因此,为了最大限度地提高性能,OpenGL只得做出取舍,假定所有的多边形都是简单多边形。现实世界的许多表面是由简单多边形,非凸多边形或有洞的多边形组成的。由于所有这类多边形都可以由简单多边形组合而成,因此复杂的几何图形描述对多边形进行分格化,把它们分解成许多可以进行渲染的简单多边形。由于OpenGL的顶点总是三维的,因此形成特定多边形边界的点不必位于空间中的同一个平面上(当然,在许多情况下,它们确实位于同一个平面上。例如,当多边形的所有顶点的z坐标都是0的时候,或者当多边形是个三角形的时候)。如果一个多边形的所有顶点并不位于同一个平面上,那么它在空间中经过各种不同的旋转,并改变视点和现实屏幕上的投影之后,这些点可能不再构成一个简单的凸多边形。例如,想象一个由4个点组成的四边形,它的4个点都稍稍偏离原平面。如果从侧面看过去,将看到一个像蝴蝶结一样的非简单多边形,这种多边形无法保证能够进行正确的渲染。当利用真实表面上的点所组成的四边形来模拟弯曲表面时,这种情况常常出现。为了避免这个问题,可以使用三角形来模拟表面,因为任何三角形都保证位于一个平面上。3.4.4矩形由于矩形在图形应用程序中极为常见OpenGL提供了填充矩形图元函数glRect*()。绘制矩形的方法类似于绘制多边形。但是使用的特定OpenGL实现可能会对用于绘制矩形的glRect*()函数进行优化。另外,尽管矩形在三维空间中有一个初始的特定方向(在xy平面,并且与坐标轴平行),但是可以通过旋转或其他变换对矩形的方向进行更改。3.4.5曲线和表面所有的光滑曲线或表面都可以进行模拟,并且可以到任意高的精度,其方法就是组合大量的短直线或小多边形。因此,只要对曲线或表面进行足够的细分,并用直线段和平面多边形来近似地模拟它们,它们看上去就像是真的弯曲一样。尽管曲线并不是几何图元,但OpenGL还是提供了一些直接的支持,对它们进行细分和绘制。图3.11近似曲线第四章三维图像显示的实现及分析上一章对OpenGL的基本理论做了详细的介绍,接下来以卫星与深空三维场景的实时仿真技术,具体的介绍一下OpenGL在实现三维图像的生成及显示的原理和实现过程。4.1概要设计因为OpenGL与VC+是通过接口程序相连的,所以在实现三维图形的生成及显示时,需要一个应用程序入口;然后要注册窗口类,注册完成后需要创建OpenGL显示窗口;之后便可以进行三维图形的绘制;绘制完成后销毁窗口、注册窗口,整个过程便结束。程序的具体实现框架如图4.1所示。是否开始创建opengl显示CreateWindowGL()注册窗口类RegisterWindowcals()初始化opengl绘制程序initialize()循环更新显示并等待消息消息是否退出退出前的扫尾工作Deinitialize()销毁窗口DestroyWindowGL()注销窗口Unregister()WinMain()应用程序入口返回0结束4.1程序流程图应用实例的实现包括以下几个步骤:程序初始化,形体建模,色彩渲染,应用动画。程序初始化形体建模渲染色彩动画的应用图4.2工程实现流程图4.2Windows操作系统下OpenGL应用程序初始化4.2.1应用程序依赖库在windows操作系统下,OpenGL应用程序所调用的指令集被封装在OpenGL32.dll和Glu32.dll这两个动态链接库中。同时,这两个函数库也是OpenGL标准的组成部分。其中,OpenGL32.dll提供OpenGL