以文本方式查看主题 - 爱心论坛 (http://zqax.net/bbs/index.asp) -- 电脑应用 (http://zqax.net/bbs/list.asp?boardid=15) ---- 基于OpenGL的三维曲面数据场动态显示 (http://zqax.net/bbs/dispbbs.asp?boardid=15&id=26834) |
|
-- 作者:小猴乖乖 -- 发布时间:2007/8/22 7:29:44 -- 基于OpenGL的三维曲面数据场动态显示 摘 要 在大数据量条件下,实时动态显示三维曲面较困难,其关键在于提高三维图形数据处理和图形绘制速度。通过对基于图形工业标准OpenGL实现三维曲面动态显示的原理和方法的讨论,提出采用OpenGL的双缓存、显示列表技术,大幅度提高了图形数据处理和刷新速度,保证了每帧数据图形绘制的连续性和完整性,成功实现了三维曲面数据场实时动态显示。 关键词 OpenGL 三维曲面 动态显示 引言 在某三维数据场中,数据随时间的变化而发生变化,为直观观察数据随时间变化的态势,需对数据场的变化实时动态显示。利用网格曲面显示三维数据场是一种直观的方法,但需经过数据插值、投影、曲面拼接、消隐等处理后方可绘制图形,计算量较大。在数据量较大的情况下,实时动态显示三维曲面图形较困难,其关键在于提高每帧图形处理和绘制刷新速度,以保证每帧三维曲面显示时的连贯性和完整性。 OpenGL是性能卓越的图形处理工具,采用OpenGL双缓存和绘图操作予编译技术,较好解决了三维图形数据处理和绘图刷新速度问题。利用Visual C++调用OpenGL的三维图形编程接口成功实现了大数据量的三维曲面图形的实时动态显示。 基于OpenGL的三维曲面动态显示原理 1、基于OpenGL三维曲面图形显示原理 OpenGL是独立于操作系统的开放式三维图形软件接口。其主要功能是将三维曲面通过顶点序列或像素点进行描述,并进行相应的透视、光照、纹理操作,最终转换成帧缓存中的图像数据,利用该图像数据进行三维曲面图形的着色。三维曲面图形显示归纳为以下几个步骤: (1)在三维场景中建立曲面绘制的模型。选用插值方法、参数曲面函数,计算曲面控制点,进行曲面重构; (2)设置视点和透视方式; (3)进行消隐、光照、纹理、明暗处理; (4)绘制场景,输出到屏幕窗口。 图1 三维曲面图形显示基本流程 2、利用双缓存实现动态显示原理 基于OpenGL的三维曲面动态显示实现 |
|
-- 作者:小猴乖乖 -- 发布时间:2007/8/22 7:30:14 -- 1.1 设置必要的编译链接环境 OpenGL的图形编程接诎ǖ闹饕涂夂环庾霸诙唇涌庵校虼嗽谙钅恐幸砑?OpenGL32.dll、glu32.dll和glaux.dll三个库。同时在应用程序的视类头文件中加入OpenGL头文件说明: #include "gl\\gl.h" #include "gl\\glu.h" #include "gl\\glaux.h" 1.2 设置像素格式 该部分设置绘图所需的像素格式,Windows下采用PIXELFORMATDESCRIPTOR结构设置像素格式,该结构包含26个属性信息,包含了颜色位数、颜色模式、缓存的位数和操作方式,以及是否采用双缓存机制等。 1.3 创建着色描述表 OpenGL应用程序的设备描述表(DC)称为着色描述表,由它通知Windows在窗口中绘制图形。应用程序必须在绘图之前调用专用函数wglCreateContext()创建自己的着色描述表,调用wglMakeCurrent()使其当前化,退出OpenGL时使着色表非当前化。 1.4 创建三维曲面的观察场景 OpenGL一般用函数glFrustrum()和glViewport()实现投影变换和视口变换。glFrustrum()定义了一个容纳绘制对象的最大空间区域,即视景体,位于视景体以外的部分都会被剪切掉;glViewport()则定义了一个绘制场景的矩形区域,即视口,用来把场景中的点映射到绘图区。 glFrustrum(-1.0,1.0,-2.0,2.0,0.0,7.0); //视景体上、下、左、右、前、后的坐标分别为-1.0,1.0,-2.0,2.0,0.0,7.0; glViewport(0,0,200,300); //视口区上、下、左、右坐标分别为0,0,200,300; 1.5 视类中OnDraw()成员函数的设置 在Windows的VC++编程中,所有窗口中的图形绘制代码都在视类的OnDraw成员函数中实现,采用OpenGL绘制三维曲面之前需要进行必要的环境设置。 glClearColor(1.0f,1.0f,1.0f,1.0f);//设置背景颜色为白色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存 glColor3f(1.0f,1.0f,1.0f);//设置绘图颜色为红色 2、创建绘制三维曲面的显示列表 在显示列表中定义用户绘制三维曲面图形所需数据以及数据之间显示连接方式。文中实例中显示列表包括三维曲面图形的数据点的显示列表;坐标轴的显示列表;显示坐标数据的显示列表。显示列表采用线段连接的方式。 3、三维曲面图形动态显示程序主框架 在视类中产生Onhuitu()作为绘图的主程序。三维曲面图形动态显示子程序drawsurbs()包括初始化,读数据文件,数据插值,投影变换,消隐,绘图显示列表设置(坐标轴绘制显示列表、三维曲面绘制显示列表),强制绘图操作,缓存拷贝,切换前后缓冲区等几个主要部分。初始化程序myinit()中设置双缓存模式,是实现动态显示的前提。drawsurbs()中缓存拷贝auxSwapBuffers()、切换缓存SwapBuffers (wglGetCurrentDC())、缓冲区的清除glClear(GL_COLOR_ BUFFER_BIT|GL_DEPTH_BUFFER_BIT)是实现动态显示的必不可少的操作。
|
|
-- 作者:小猴乖乖 -- 发布时间:2007/8/22 7:30:46 -- 某数据场三维曲面动态显示仿真系统实例 根据以上思想,利用OpenGL双缓存及显示列表技术,基于某数据场数据,开发了三维曲面图形动态显示仿真系统,该实例中视窗中三维曲面图形随数据场的数据的改变而动态显示,图2为程序运行中某一时刻的显示结果。 结束语 在微机平台上,利用VC6.0的OpenGL根据数据场的分布进行三维曲面的动态显示是切实可行的,尤其采用双缓存及显示列表技术可以得到很好的三维曲面生成速度,这种动态显示技术可以推广应用在需要进行实时动态显示的数据处理方面。 图2 三维曲面数据场动态显示仿真系统展示图 |