用OpenGL开发三维交互式虚拟场景

更新时间:2023-06-03 09:00:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

用OpenGL开发三维交互式虚拟场景

第20卷第8期2000年8月

文章编号:1001-9081(2000)08-0038-03

计算机应用ComputerApplications

Vol.20,No.8Aug.,2000

用OpenGL开发三维交互式虚拟场景

谢志鹏,陈锻生

(国立华侨大学计算机科学系,福建泉州362011)

摘 要:介绍了MsWindows环境下OpenGL的体系结构和工作原理,深入剖析了用VisualC++开发真实感3D实时虚拟场景时采用的技术特点,并构造了两个可重用和继承的类 纹理贴图和画面输出保存的设备无关位图类以及初始化OpenGL工作环境并正确设置调色板的视图类,在此基础上设计了一个模拟3D射击游戏。

关键词:OpenGL图形库;MFC;纹理贴图;显示列表;矩阵堆栈中图分类号:TP391.41 文献标识码:A

DEVELOPING3DINTERACTIVEVIRTUALSCENEBYOPENGL

XIEZhi peng,CHENDuan sheng

(DepartmentofComputerScience,NationalHuaqiaoUniversity,QuanzhouFujian,362011,China)Abstract:ThispaperintroducethearchitectureandprincipleofOpenGLunderWindowsEnvironment,

andanalyzethetechnicalfeaturesadoptedwhendevelopingthe3Drealtimevirtualscene,furthermoreconstructtwoclasses theDIBclassfortexturemappingandscreensave,theViewclassforinitializingtheOpenGLworkingspaceandthepalette,finallyasimulated3dshootinggamewaspresented.

Keywords:OpenGLGraphicsLibrary;MFC;texturemapping;displaylist;matrixstack

1 OpenGL工作原理

OpenGL作为专业三维图形加速卡的软件接口,由几百条函数组成,允许程序员对二维或三维几何

形体进行描述,并将它们绘制(Render)到3D图形加速卡的帧缓存(Framebuffer)。图1描绘了OpenGL

的工作流程。

图1

由上可见,OpenGL能处理几何体及图像,它用顶点集合定义几何形体、以象素集合表示图像。

对于几何形体,如NURBS曲面,OpenGL向评价器(Evaluator)输入控制点和节点序列以产生曲面顶点坐标,对顶点坐标执行操作。如计算光线和法向量、颜色等,随后把该顶点系列描述的近似几何形体剪切到观察体(Frustum)中并进行光栅化(Rasterization)以产生一系列帧缓存地址和图元的二维描述值,称为基片,对基片进行操作,如根据深度值更新帧缓存以及颜色融合,淡化等。由此产生一

系列象素值,送入帧缓冲区中。

此外,OpenGL也可处理图像象素,并可通过纹理映射把图片贴到几何形体表面。

2 Windows环境下OpenGL处理流程

OpenGL指令解释模型是Client/Server模式,即一个应用程序(客户)发出指令,由OpenGL内核(服务器)解释执行。在Win9x/NT环境下,OpenGL库函数封装在动态链接库OpenGL32.DLL中,客户程序对OpenGL库函数的调用首先被OpenGL32.DLL处理,

收稿日期:2000 02 29

作者简介:谢志鹏(1972-),男,福建晋江人,硕士研究生,主要研究方向:图形图像处理; 陈锻生(1959-),男,福建泉州人,副教授,主要研究方向:图像处理与多媒体系统.

用OpenGL开发三维交互式虚拟场景

第8期谢志鹏等:用OpenGL开发三维交互式虚拟场景 39

接着被OpenGL安装型客户驱动程序解释,随后送入

服务器的动态链接库WINSRV.DLL进一步处理,紧接着传递给设备驱动接口Win32DDI(DeviceDriverInterface),最后由视频显示驱动程序处理,该驱动程序把复杂的OpenGL指令运算(如纹理映射、透视校正、三线性过滤)指派给显示卡的OpenGL图形加速处理器,从而制造出逼真的三维场景,图2显示了这

一过程。

图2

3 MFC环境下三维场景的开发

作者在用VisualC++设计一个模拟3D射击游戏的分段开发过程中,构造了OpenGL专用视图类,用它来初始化OpenGL工作环境并正确设置调色板。此外为了进行纹理贴图和画面输出保存。构造了一个设备无关位图类,下面分别介绍如何构造这两个类。

1)构造OpenGL初始化视图类

在MFC中使用OpenGL必须进行一系列初始化设置及程序结束处理工作、因此可构造一个可继承的视图类,以方便后继开发调试任务。该视图类完成以下任务。

响应WM CREATE消息,获取设备描述表(DC)、设置象素格式,检测用户当前的显示环境,若其颜色深度为16色或256色模式则创建逻辑调色板并激活它,以使显示正常。紧接着创建着色描述表(RC),并使之当前化。

响应WM SIZE、WM ERASEBKGND消息,在OnSize函数中建立视点、启动透视变换并建立视景体、重载OnEraseBkgnd函数,使它返回真值,以消除重绘画面引起的黑色闪烁。

响应WM DESTROY消息,释放RC和DC。 检查并设置象素格式和调色板。

OpenGL应用程序中无论输入何种数据,最终进行的是象素操作,即把象素写入帧缓存,帧缓存包括颜色缓存(Colorbuffer)、深度缓存(Zbuffer)、模板缓存(Stencilbuffer)和累积缓存(Accumulationbuffer),颜色缓存包含象素点的颜色信息。深度缓存包含象素点的深度数据,模板缓存包含象素的模板值,可用来屏蔽屏幕特定区域和制作物体的相交部份。累积缓存则把多次绘制的景物(每次绘制前均作轻微抖动)进行融合以后输出到颜色缓存中,以此实现景深模拟和运动模糊。

在MSWindows环境下,数据结构PIXELFORMATDESCRIPTOR用来设置象素属性,其成员值表示了上述的一系列属性。在三维实时交互式动画中,成员dwFlags应设置PFD DOUBLEBUFFER双缓存模式,另外若要输出某帧画面,则须添加上PFDDRAWTOBITMAP以支持位图文件的输出生真模式,引模式则会降低画面质量。至于深度缓存的设置必须依赖于OpenGL图形加速卡的硬件能力 ZbufferBits。设置象素格式可在OnCreate函数中运行,用一个循环来对设备描述表支持的各种象素格式进行测试,发现适合期望目标的就设置它。

紧接着自动判断用户系统显示环境的颜色深度设置,若小于或低于8bit则应创建一个逻辑调色板并激活它,否则该程序在颜色深度小于或低于8bit的环境下无法正常显示。随后创建RC获取窗口客户区大小,清除深度缓存、启动深度测试及OpenGL模型变换。

2)构造用于纹理贴图和输出画面的设备无关位图类

纹理贴图作为材质制作的高级技术,在虚拟场景中得到广泛应用。OpenGL提供了相应的纹理映射函数,以把一组连续的象素点颜色值映射到几何形体表面。所以为进行真实感纹理贴图,应制作设备无关位图类,以便将位图文件读入内存并放入一维连续字节数组才可让OpenGL纹理映射函数调用。

位图文件由文件头(BITMAPFILEHEADER),位图信息结构(BITMAPINFO)和象素值序列组成,对于颜色深度在8bit以上的位图文件,其位图信息结构只包括位图信息头,其象素值就是RGB颜色序列。对于8bit以下位图文件,其位图结构包括位图信息头(BITMAPINFOHEADER)和调色板,象素值则为颜色索引值。调色板是RGBQUAD类型的结构数组。颜色索引值则代表调色板中相应序号的RGBQUAD结构,也就是一组RGB颜色值。

该位图类的读文件函数能自动判断位图文件的颜色深度信息,若是24bit则象素数据指针直接定位在BITMAPINFOHEADER之后,若为1,4或8bit,则根据BITMAPINFOHEADER中的成员biClrUsed来判断其调色板究竟有多少个RGBAQUAD结构组成,若biClrUsed=0则表示使用最大调色板条目分别为2,16和256。若biClrUsed!0,则其值即等于RGBAQUAD结构的数目,由此可知,象素数据指针应定位在BITMAPINFOHEADER+SizeOf(RGBQUAD)*NumberOf(RGBQUAD)之后。任何颜色深度的位图在象素数据阵列中其单个象素点均占据与其颜色深度相同的位数(这里只考虑目前大量使用的非压缩列读数

用OpenGL开发三维交互式虚拟场景

40 计算机应用2000年

存中,然而对于有调色板的位图文件,读取的是颜色索引值而非RGB颜色值,所以应对照其调色板转换成RGB值,然后填入一字节数组中,该字节数组地址才可为纹理映射函数所采用以实现纹理贴图。若要输出画面至位图文件,首先使用OpenGL函数glReadPixels获取客户区象素数据,设置了输出文件的文件头和位图头,把该数据填至上述象素数据阵列的正确位置,即完成位图文件的写工作。

3)实时交互式三维场景的制作分层次规划,建立几何模型

OpenGL以顶点为参数来绘制三角形、多边形,进一步组合可构成基本三维模型。对于复杂的几何模型,可用三角形和多边形进行逼近或者用二次曲面来构造,如用B样条曲面来模拟弯曲的墙体等。OpenGL提供了二维评价器,可方便地通过修改控制点与结点值来改变NURBS样条曲面的形状。

布置舞台,实现第一人称视觉效果

建立几何实体后,通过旋转平移等几何变换移至三维空间的适当位置。在OpenGL中,定义几何体采用世界坐标系,所有的旋转、平移均对之产生影响。

在真实感三维场景布置中,只采用透视投影而不采用平行投影。透视投影又可选择透视视景体或

对称视景体。透视视景体在世界坐标系中的位置如图3所示。

这里以透视视景体为例说明三维场景漫游中第一人称视觉效果的实现,假设坦克正逼近近剪切

面,视景体内的景图3 世界坐标系中的透视视景体物应越来越大,若

坦克转过一个角度后,应看到不同角度的景物,上述操作均通过相对运动来实现,即固定坦克车体的世界坐标,而让景物向相反方向运动或旋转,因而可产生正确的第一人称视觉效果。

三维物体的真实效果处理a)对多边形顶点指定不同颜色值,利用平滑着色模式可将多边形内部填上顺滑的渐变色,达到Gouraud明暗着色处理效果。

b)建立各种不同灯光和材质,每种材质均由环境色、扩散色、镜面高亮色组成,分别说明了该种材质对环境光、漫反射光和镜面反射光的反射率,赋与物体适当的材质,在不同位置和方向架设定点或定向光源可产生真实的场景效果。

c)利用纹理贴图来产生真实感较强的物体材质。

动画性能最优化

a)首先最重要的是显示列表。显示列表是经过编译的一系列OpenGL命令的高速缓存,显示列表的调用极大地提高了OpenGL的绘图效率,此外显示列表的嵌套定义可以方便地把先前定义的各个部件有机地组合起来构成最后几何形体。

b)矩阵堆栈,利用矩阵堆栈来管理场景和运动物体,物体和其组件,运动物体间的相对位置。

c)在OnCreate函数中一次生成位图纹理,防止临时读位图文件,另外所有物体的构造,即定义显示列表的工作均要放在OnCreate函数中一次性生成以提高系统的运行效率。

d)调用双缓存机制以实现平滑的动画效果OpenGL把帧存分为当前可见的前台视频缓存(Frontbuffers)和不可见的正在画的后台视频缓存(Backbuffers)利用双缓存模式把后台视频缓存的内容输出到前台视频缓存,同时对后台视频缓存的内容进行计算,这样就可以实现画面的平滑输出,动画中物体之间的相互响应控制可综合采用定时器、多线程技术,并通过响应键盘、鼠标消息来控制。

4 实验及总结

基于上述设计的两个类及视景制作思路,作者制作了一个三维模拟射击游戏,图4是场景 角的

效果图。

目前基于OpenGL的三维图形开发正快速涌现。其中也包括MsWindows平台的射击游戏、虚拟场景浏览、运动仿真、科学计算可视化、CAD/CAM等。而采用本

图4 3D模拟射击游戏场景 角

文介绍的MFC环境

下OpenGL开发技术和方法,可缩短程序开发周期,增强物体真实感,提高程序运行速度和效率。

参考文献

[1] 王敏.Windows图形动画游戏程序设计[M].北京:学苑出版社,1994.

[2] K.R.Castleman.DigitalImageProcessing[M].Prentice

Hall,1996.

[3] JeffreyRichter.AdvancedWindowsthirdedition[M].MicrosoftPress,1997.

[4] DavidBenett.VisualC++5Developer sGuide[M].

SamsPublishing,1997.

[5] OpenGLARB.OpenGLProgrammingGuide:Version1.2

[M].PrenticeHall,1999.

本文来源:https://www.bwwdw.com/article/kps1.html

Top