三维显示系统开发研讨论文

时间:2022-05-21 03:34:00

三维显示系统开发研讨论文

编者按:本文主要从引言;系统设计;技术要点;实例操作;结束语进行论述。其中,主要包括:实现宏观统筹、规划、研究以及为工程项目提供更好的决策支持、OpenGL是个功能强大的底层3D图形库、具有易于使用、速度快、内存支出少、兼容性广泛和具有事务处理功能等优点、数据库连接设计、设计“数据链接属性”对话框,然后测试连接、OpenGL开发环境设置、新建一个单文档工程文件,并在项目文件中添加opengl32.lib、glu32.lib和glaux.lib三个静态库文件、连续地绘制三维曲面并显示场景,用不同的点位数据刷新屏幕视窗、三维曲面动态显示原理、设置OpenGL窗口显示属性为双缓存机制、其他技术细节、显示列表技术解决了大数据量双缓存动态切换的速度问题等。具体请详见。

论文摘要:本文详述了一个GIS三维显示系统的开发过程及步骤,在visualc++平台下运用opengl缓存切换技术实现三维坐标下图形的动态显示,提高了数据处理和刷新速度,其数据通过ADO数据库编程连接SQLServer2000软件提供。

论文关键词:OPENGLGIS三维动态显示ADO

1、引言

随着计算机技术及图形学技术的发展,我们可以在计算机中精确的模拟现实世界的任何三维物体,并且实现宏观统筹、规划、研究以及为工程项目提供更好的决策支持。本文实现了采矿区地面沉降的三维模拟,为矿区安全提供决策依据。

OpenGL是个功能强大的底层3D图形库。英文全称是“OpenGraphicsLibrary”,顾名思义,OpenGL便是“开放的图形程序接口”。OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。作为一个工业标准的计算机三维图形软件开发接口,它已广泛应用于游戏开发、建筑、医学、地球科学等领域。

本文的数据提供用的是ADO的数据访问技术,它主要具有易于使用、速度快、内存支出少、兼容性广泛和具有事务处理功能等优点。

2、系统设计

这部分包括数据库连接,和基于OpenGL开发环境的初期设置,详述了一个基于视图/文档结构的应用程序框架设计。

2.1数据库连接设计

引入ADO动态链接库。在使用VisualC++的MFC编程时,MFC并没有提供对ADO的封装类,能够支持ADO编程的是ADO的COM动态链接库msado*.dll。一般在系统盘的\ProgramFiles\CommonFiles\System\ado目录下,该文件是msado15.dll。

引入该文件的方法是在stdafx.h头文件中,添加如下代码:

#import”c:\programfiles\commonfiles\system\ado\msado15.dll”\no_namespacerename(“EOF”,”adoEOF”)

在本程序中的类C***APP的InitInstance()成员函数里添加代码::CoInitialize(NULL);

使用UDL文件连接数据库。设计“数据链接属性”对话框,然后测试连接;

添加一个连接对象智能指针,利用Open函数初始化数据库连接;

添加一个记录集指针,利用此指针将SQLServer2000数据库里表的记录意义读到CArray对象中。

为链接数据库,新建一类CLoadData(),用来建立链接,并且将数据读入CArray对象。本程序所用数据为煤矿开采沉陷区四期地表水准和RTK测量综合数据,并经过预计模型计算后得到格网数据。

2.2OpenGL开发环境设置

新建一个单文档工程文件,并在项目文件中添加opengl32.lib、glu32.lib和glaux.lib三个静态库文件。

在C***View类头文件中添加代码#include”gl\gl.h”、#include”gl\glu.h”、#include”gl\glaux.h”;修改C***View类中的PreCreateWindows()函数,如添加下句

cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;来设置窗口风格;修改该类OnCreate()函数中添加如下语句,

PIXELFORMATDESCRIPTORpfd={

sizeof(PIXELFORMATDESCRIPTOR),

1,

PFD_DRAW_TO_WINDOW|

PFD_SUPPORT_OPENGL|

PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,

24,

0,0,0,0,0,0,

0,0,0,0,0,0,0,

16,

0,0,

PFD_MAIN_PLANE,

0,

0,0,0};

CClientDCclientDC(this);

intpixelFormat=ChoosePixelFormat(clientDC.m_hDC,&pfd);//得到相应的像素格式

BOOLsuccess=SetPixelFormat(clientDC.m_hDC,pixelFormat,&pfd);//指定相应dc的像素格式

m_hRC=wglCreateContext(clientDC.m_hDC);

return0;

一般采用如上设置,也可根据您的需要修改该窗口的像素格式;修改C***View类中的OnDestroy()函数,使得窗口关闭前执行扫尾工作,如添加语句wglDeleteContext(m_hRC);删除一个图形操作描述表;另外,程序的核心部分便是修改该类的OnPaint()函数,调用自定义函数DrawWithOpengl(),完成OpenGL的绘制工作;修改C***View类的OnSize()函数,使其窗口大小发生变化时相应的改变视口大小和投影变换方式,将场景中的物体正确地显示在窗口中;设计DrawWithOpengl()函数,完成绘图主体工作;设计自定义DrawCoor()函数,用以坐标系的建立。

3、技术要点

3.1三维曲面动态显示原理

三维动态显示需要连续地绘制三维曲面并显示场景,用不同的点位数据刷新屏幕视窗。在OpenGL中利用双缓存技术,分配两个帧缓存区,在连续显示三维图像时,一个帧缓冲区中的数据执行绘制图像命令的同时,另一个帧缓存区中的数据进行图像显示。当前可见视频缓存称为前台视频缓存,不可见的正在绘图的视频缓存称为后台视频缓存。当后台视频缓存中的数据要求显示时,OpenGL就将它拷贝至前台视频缓存,显示硬件不断地读可见视频缓存中的内容,并把结果显示在屏幕上。

使用双缓存实现三维曲面动态显示的步骤如下:

(1)设置OpenGL窗口显示属性为双缓存机制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

(2)利用OpenGL基本绘图命令绘制三维图像,我们将用显示列表提高程序的运行效率。

OpenGL显示列表(DisplayList)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就依次执行表中所列出的函数语句。它被设计成命令高速缓存,而不是动态数据库缓存。一般来说,显示列表能将许多相邻的矩阵变换结合成单个的矩阵乘法,从而加快速度。

创建列表:

voidglNewList(Gluintlist,Glenmmode);

voidglEndList();

调用列表:

voidglCallList(Gluintlist);

本程序建立了四个显示列表,分别用来显示同一采矿区的四期数据。

(3)初始化动态显示帧数,一帧绘图结束实现缓存拷贝和切换缓存:

auxSwapBuffers();

SwapBuffers(wglGetCurrentDC());

这样多帧循环实现四个时段不同高程沉陷曲面的动态切换显示。

3.2其他技术细节

(1)区域曲面颜色。现实世界中,低洼处的颜色总是比高处要暗,实现这一小功能,可在绘制函数的高程点绘制处添加如下语句,

glColor3f(z*0.008*(-1)+0.4,z*0.008*(-1)+0.4,z*0.008*(-1)+0.4);这是根据本程序设置计算式,即将高程z作为变量写入glColor的参数之中,这样颜色便根据此处高程大小而适时变化了。

(2)将高程值放大一定倍数,这样动态显示效果将更明显。

(3)在开采区曲面上载入树木、房屋、公路等基本设施可增强显示的现实性,如本程序载入一棵绿色的小树,如各图绿色部分。

(4)如下图,视图左下方的蓝色数字可根据画面的切换而动态变化,本程序显示的是各期数据采集的时间。另外,曲面显示在一个三维坐标系下,且标注了坐标值,本程序三个方向的最大最小坐标值是利用自定义函数GetMin()和GetMax()从读入CArray对象的数据中得到。从而增强了视图的可读性。

(5)另外,本程序对曲面做了一个线渲染,以满足不同观测需要,增强了视图的视觉表达现实效果,如图5。

(6)鼠标放大缩小和旋转功能的实现以方便从各个方位观察。

4、实例操作

图1到图4是各期的数据,动态显示在这几组数据间进行切换,图1和图4间数据组越多则动态显示效果越逼真。图5是一个按钮功能的实现,作为矿区线性渲染图以满足不同观测的需要。

图1第一期数据的三维显示

图2第二期数据的三维显示

图3第三期数据的三维显示

图4第四期数据的三维显示

图5第四期数据的三维线渲染

5结束语

本文从系统整体角度详细叙述了一个GIS三维动态成图的过程与步骤。从数据库连接获得数据开始到坐标系的建立,然后成图并用了显示列表技术解决了大数据量双缓存动态切换的速度问题,从而大大提高了程序执行效率。

参考文献:

1、刘刀桂.VISUALC++实践与提高(数据库篇)[M],中国铁道出版,2001.

2、费广正.VisualC++6.0高级编程技术(OpenGL篇)[M],中国铁道出版社,2000.

3、侯俊杰.深入浅出MFC.华中科技大学出版社(第二版)[M],2001.

向世明.OpenGL编程与实例.电子工业出版社[M],1999.