(最新版)vc++OpenGL三维图像的生成与显示技术研究说明书毕业设(4)

2020-04-03 09:57

● ●

GL_POLYGON GL_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所示。

4.1 程序流程图

应用实例的实现包括以下几个步骤:程序初始化,形体建模,色彩渲染,应用动画。

图4.2 工程实现流程图

4.2 Windows操作系统下OpenGL应用程序初始化

4.2.1应用程序依赖库

在windows操作系统下,OpenGL应用程序所调用的指令集被封装在

OpenGL32.dll和Glu32.dll这两个动态链接库中。同时,这两个函数库也是OpenGL标准的组成部分。其中,OpenGL32.dll提供OpenGL核心功能;Glu32.dll是实用函数库,提供了一些较高级的建模特性,例如二次曲面以及NURBS曲线和平面。另外,Glut库是OpenGL实用工具包,它是独立于子窗口系统的工具包,目的是隐藏不同窗口系统API的复杂性。但该库只封装了最基础的窗口API,功能比较有限,一般只是用于OpenGL教学演示。

表4.l OpenGL程序集

Library Dll

Opengl32.lib Opengl32.dll glu32.lib glu32. dll glut32.lib glut32. dll

在利用OpenGL 开发工具编制应用程序之前,首先应进行OpenGL 的头文件与函数库文件的包含,即在Workspace Windows 中单击File 文件标签,打开Source Files,双击StepinGLView. Function)等模型,分析得到物体的表面法向,从而得到物体表面三维点面信息,这种方法建模精度较高,而且对于缺少纹理、颜色信息(如瓷器、玉器)等其他方法无法处理的情况非常有效,然而其采集过程比较麻烦。 4.3.3卫星建模示例

通过使用上述信息采集的方法,建立的卫星

模型如下图4.3所示。图4.3 卫星模型

4.4色彩的渲染

OpenGL维持一种当前颜色(在RGBA模式下)和一个当前颜色索引(在颜色索引模式下)。每个物体一般是由当前颜色(或当前颜色索引)绘制的,除非使用了一些更为复杂的着色模型,如光照和纹理贴图。g1Color *()函数可以指定颜色。 4.4.1颜色

(1) 设置颜色模式

OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色;而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查索引表。

RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和 A值(alpha分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色。

(2) 清屏

在计算机屏幕上绘图和在纸上绘图是不一样的,因为纸本来就是白色的,只要在上面画图就可以了。在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填满,因此在绘制新场景之前需要把它清除为某种背景颜色。至于应该使用哪种背景颜色,则取决于应用程序本身。如果是子处理程序,在绘制新文本之前把背景清楚为白色(就像纸的颜色)。如果所绘制的是在航天飞机上所看到的太空景象,那么在开始绘制恒星,行星之前需要把背景清除为黑色。有时候,可能并不需要清除

屏幕。例如,如果图像的内容是一个房间的内部,当绘制它的各面墙时,整个图形窗口都会被覆盖。

若要采用绘制一个适当颜色的矩形,让它足够大,能够覆盖整个窗口的这种方法虽然也可行,但上述的清除窗口的方式有几点优势。首先,特殊的清除窗口函数的效率可能远远高于普通的绘图函数。其次,判断窗口清除矩形的大小和位置可能非常困难。最后,在许多机器上,图形硬件除了包含被显示的像素颜色的缓冲区之外,还包含许多别的缓冲区。这些缓冲区随时可能被清除,如果有一条命令能够按照任意组合形式清除这些缓冲区,无疑是非常方便的。

颜色存储在称为位平面(bitplane)的图形硬件中。存储的方式有两种:可以把像素颜色的红,绿,蓝和 alpha值(RGBA)直接存储在位平面中;或者,也可以存储一个颜色索引值,用它来引用颜色查找表中的一项。RGBA颜色显示模式更常用一些。

glClearColor(0.0,0.0,1.0,0.0): glClear(GL_COLOR_BUFFER_BIT):

第一行代码把清除颜色设置为蓝色,第二行代码把整个窗口清除为当前的清除颜色。glClear ()的唯一参数表示需要被清除的缓冲区。在这个例子中,程序只清除颜色缓冲区,显示在屏幕上的图像仍然保持原样。一般情况下,只要在程序的早期设置一次清除颜色即可。以后随时可以根据需要清除缓冲区。OpenGL把当前的清除颜色作为一个状态变量,这样就不必再每次清除缓冲区时指定清除

(3) 物体表面法线

根据光的反射定律,由光的入射方向和入射点的法线就可以得到光的出射方向。因此,对于指定的物体,在指定了光源后,即可计算出光的反射方向,进而计算出光照效果的画面。在OpenGL中,法线的方向是用一个向量来表示。

然而,OpenGL并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成的物体的表面的每个点的法线(这话听着有些迷糊),通常,为了实现光照效果,需要在代码中为每一个顶点指定其法线向量。指定法线向量的方式与指定颜色的方式有雷同之处。在指定颜色时,只需要指定每一个顶点的颜色,OpenGL就可以自行计算顶点之间的其它点的颜色。并且,颜色一旦被指定,除非再指定新的颜色,否则以后指定的所有顶点都将以这一向量作为自己的颜色。在指定法线向量时,只需要指定每一个顶点的法线向量,OpenGL会自行计算顶点之间的其它点的法线向量。并


(最新版)vc++OpenGL三维图像的生成与显示技术研究说明书毕业设(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:剑杆织布机操作手册

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: