基于OpenGL的三维曲面数据场动态显示
日期:2007年8月21日 作者: 查看:[大字体 中字体 小字体]-
摘 要 在大数据量条件下,实时动态显示三维曲面较困难,其关键在于提高三维图形数据处理和图形绘制速度。通过对基于图形工业标准OpenGL实现三维曲面动态显示的原理和方法的讨论,提出采用OpenGL的双缓存、显示列表技术,大幅度提高了图形数据处理和刷新速度,保证了每帧数据图形绘制的连续性和完整性,成功实现了三维曲面数据场实时动态显示。
关键词 OpenGL 三维曲面 动态显示
引言
在某三维数据场中,数据随时间的变化而发生变化,为直观观察数据随时间变化的态势,需对数据场的变化实时动态显示。利用网格曲面显示三维数据场是一种直观的方法,但需经过数据插值、投影、曲面拼接、消隐等处理后方可绘制图形,计算量较大。在数据量较大的情况下,实时动态显示三维曲面图形较困难,其关键在于提高每帧图形处理和绘制刷新速度,以保证每帧三维曲面显示时的连贯性和完整性。
OpenGL是性能卓越的图形处理工具,采用OpenGL双缓存和绘图操作予编译技术,较好解决了三维图形数据处理和绘图刷新速度问题。利用Visual C++调用OpenGL的三维图形编程接口成功实现了大数据量的三维曲面图形的实时动态显示。
基于OpenGL的三维曲面动态显示原理
1、基于OpenGL三维曲面图形显示原理
OpenGL是独立于操作系统的开放式三维图形软件接口。其主要功能是将三维曲面通过顶点序列或像素点进行描述,并进行相应的透视、光照、纹理操作,最终转换成帧缓存中的图像数据,利用该图像数据进行三维曲面图形的着色。三维曲面图形显示归纳为以下几个步骤:
(1)在三维场景中建立曲面绘制的模型。选用插值方法、参数曲面函数,计算曲面控制点,进行曲面重构;
(2)设置视点和透视方式;
(3)进行消隐、光照、纹理、明暗处理;
(4)绘制场景,输出到屏幕窗口。

图1 三维曲面图形显示基本流程
2、利用双缓存实现动态显示原理
三维曲面动态显示需要连续地绘制三维曲面并显示场景,用不同的曲面数据刷新屏幕视窗。
在OpenGL中利用双缓存技术,分配两个帧缓存区,在连续显示三维曲面时,一个帧缓冲区中的数据执行绘制曲面命令的同时,另一个帧缓存区中的数据进行图形显示。当前可见视频缓存称为前台视频缓存,不可见的正在绘图的视频缓存称为后台视频缓存。当后台视频缓存中的数据要求显示时,OpenGL就将它拷贝至前台视频缓存,显示硬件不断地读可见视频缓存中的内容,并把结果显示在屏幕上。
应用双缓存,每一帧三维曲面只在绘制完成之后才显示出来,所以观察者可以看到每一帧完整三维曲面,而不是曲面的绘制过程。
使用双缓存实现三维曲面动态显示的步骤如下:
(1)设置OpenGL窗口显示属性为双缓存机制:auxInitDisplayMode(AUX_DOUBLEAUX_RGBA);
(2)利用OpenGL基本绘图命令绘制三维曲面;
(3)一帧曲面绘图结束后缓存拷贝,切换缓存:auxSwapBuffers();
SwapBuffers(wglGetCurrentDC());
3、利用显示列表提高程序运行效率
显示列表是一组预先存储起来留待以后调用的函数语句。调用显示列表时就按次序执行其中的函数。显示列表将反复执行的绘图操作以编译好的命令方式进行存储,设计成命令的高速缓存,而不是动态的数据库缓存,所以可以优化程序运行性能。
实现和调用显示列表的方法:
(1)创建列表:
void glNewList(Gluint list,Glenm mode);
void glBegin(Glenum mode);
void glEnd(void);
void glEndList();
(2)调用列表:
void glCallList(Gluint list);
基于OpenGL的三维曲面动态显示实现
在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成。
1、基于OpenGL绘图的基本设置
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_BITGL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存
glColor3f(1.0f,1.0f,1.0f);//设置绘图颜色为红色
2、创建绘制三维曲面的显示列表
在显示列表中定义用户绘制三维曲面图形所需数据以及数据之间显示连接方式。文中实例中显示列表包括三维曲面图形的数据点的显示列表;坐标轴的显示列表;显示坐标数据的显示列表。显示列表采用线段连接的方式。
3、三维曲面图形动态显示程序主框架
在视类中产生Onhuitu()作为绘图的主程序。三维曲面图形动态显示子程序drawsurbs()包括初始化,读数据文件,数据插值,投影变换,消隐,绘图显示列表设置(坐标轴绘制显示列表、三维曲面绘制显示列表),强制绘图操作,缓存拷贝,切换前后缓冲区等几个主要部分。初始化程序myinit()中设置双缓存模式,是实现动态显示的前提。drawsurbs()中缓存拷贝auxSwapBuffers()、切换缓存SwapBuffers (wglGetCurrentDC())、缓冲区的清除glClear(GL_COLOR_ BUFFER_BITGL_DEPTH_BUFFER_BIT)是实现动态显示的必不可少的操作。
void CNurbsView::Onhuitu()
{
HWND hWnd=GetSafeHwnd();
HDC hDC=::GetDC(hWnd);
wglMakeCurrent(hDC,hglrc); //设置当前着色表
drawsurbs(); //动态显示三维曲面子程序
wglMakeCurrent(NULL,NULL);//着色表非当前化
SwapBuffers(hDC); //交换缓存
}
void CNurbsView::drawsurbs()
{
……
myinit(); //初始化子程序
jixu=20; //动态显示帧数
While(jixu)
{
readdata(); //读数据文件子程序
interplator(); //数据插值子程序
orthoprojection(); //投影变换子程序
xiaoying(); //消隐子程序
glPushMatrix();
glColor3f(0.0f,1.0f,1.0f); //颜色设置
glLineWidth(2.0); //线宽设置
glNewList(axis_list,GL_COMPILE);//坐标轴显示列表
……
glEndList();
glNewList(sufer_list,GL_COMPILE); //三维曲面绘制显示列表
……
glEndList();
glCallList(axis_list);
glCallList(sufer_list)
glFlush(); //强制绘图
glPopMatrix();
auxSwapBuffers(); //缓存拷贝
SwapBuffers(wglGetCurrentDC()); //切换缓存
glClear(GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT); //为绘下帧曲面清除缓冲区
jixu--
deley(); //延时子程序
}
}
void CNurbsView::myinit()
{
glClearColor(0.03,0.4,0.4,0.4);
glClear(GL_COLOR_BUFFER_BITGL_DEPTH_BUFFER_BIT);
auxInitDisplayMode(AUX_DOUBLEAUX_RGBA);//设置成双缓存模式
}
某数据场三维曲面动态显示仿真系统实例
根据以上思想,利用OpenGL双缓存及显示列表技术,基于某数据场数据,开发了三维曲面图形动态显示仿真系统,该实例中视窗中三维曲面图形随数据场的数据的改变而动态显示,图2为程序运行中某一时刻的显示结果。
结束语
在微机平台上,利用VC6.0的OpenGL根据数据场的分布进行三维曲面的动态显示是切实可行的,尤其采用双缓存及显示列表技术可以得到很好的三维曲面生成速度,这种动态显示技术可以推广应用在需要进行实时动态显示的数据处理方面。

图2 三维曲面数据场动态显示仿真系统展示图(出处:急速软件下载学院)
-
- 基于OpenGL的三维曲面数据场动态显示 相关文章:
- ·XML Schema定义元素的基本知识
- ·卡巴斯基12月10日——16日一周病毒报告
- ·Vista12个最实用操作技巧的基础课
- ·卡巴斯基报告称恶意软件近三成来自中国
- ·HTML基础:HTML的基本结构
- ·基本的页面设计元素布局比例
- ·卡巴斯基发布8.0版最新特性(附下载)
- ·网站的文章内容SEO优化基本原则
- ·卡巴斯基® 手机版正式线上发行
- ·Java基础:你是否了解KVM的常量池
- 基于OpenGL的三维曲面数据场动态显示 相关软件
- ·《时空之泪》基因主城音乐
- ·《反恐导弹基地》V1.8动作射击试玩
- ·《基因传奇》
- ·文物典藏系列-英国大维德基金会藏中国珍品瓷器
- ·FC《飞鼠洛基冒险记》模拟器
- ·手机游戏:维基范斯代号-普罗米修斯(汉化版)
- ·何绍基书咏落花七律十五章
- ·《罗科索夫斯基元帅战争回忆录》
- ·《3D Max 动画基础教程》
- ·超频基础知识
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
精品推荐
热点TOP10
- ·VEGAS DVD之路(2) DVD菜单制作
- ·多媒体知识全接触 教程
- ·基于OpenGL的三维曲面数据场动态显示
- ·Premiere不传之秘:片头制作
- ·Premiere不传之秘:字幕制作
- ·ColdFusion MX 轻松制作 FLASH
- ·Lightwave制作陨石群教程
- ·LightWave 3D制作再生侠全过程(一)
- ·三维贺岁动画《秦时明月》动画流程简介
- ·AfterEffects处理水墨画特效
- ·会声会影10 三步打造家庭影片
- ·ColdFusion与FLASH通信轻松入门
- ·ColdfusionMX与FlashMX如何通讯
- ·DV后期制作时丢帧四大原因
- ·功能专业操作大众的会声会影10 Plus
- ·用Cluster巧妙实现眼球影响眼皮的联动
- ·制作经典电影镜头的“字幕”效果
- ·用软件提高MP3音质的方法
- ·软件多媒体教程录制方法详解
- ·关于流媒体文件格式简单介绍
