三維顯示系統(tǒng)開發(fā)研討論文

時(shí)間:2022-05-21 03:34:00

導(dǎo)語:三維顯示系統(tǒng)開發(fā)研討論文一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

三維顯示系統(tǒng)開發(fā)研討論文

編者按:本文主要從引言;系統(tǒng)設(shè)計(jì);技術(shù)要點(diǎn);實(shí)例操作;結(jié)束語進(jìn)行論述。其中,主要包括:實(shí)現(xiàn)宏觀統(tǒng)籌、規(guī)劃、研究以及為工程項(xiàng)目提供更好的決策支持、OpenGL是個(gè)功能強(qiáng)大的底層3D圖形庫、具有易于使用、速度快、內(nèi)存支出少、兼容性廣泛和具有事務(wù)處理功能等優(yōu)點(diǎn)、數(shù)據(jù)庫連接設(shè)計(jì)、設(shè)計(jì)“數(shù)據(jù)鏈接屬性”對話框,然后測試連接、OpenGL開發(fā)環(huán)境設(shè)置、新建一個(gè)單文檔工程文件,并在項(xiàng)目文件中添加opengl32.lib、glu32.lib和glaux.lib三個(gè)靜態(tài)庫文件、連續(xù)地繪制三維曲面并顯示場景,用不同的點(diǎn)位數(shù)據(jù)刷新屏幕視窗、三維曲面動(dòng)態(tài)顯示原理、設(shè)置OpenGL窗口顯示屬性為雙緩存機(jī)制、其他技術(shù)細(xì)節(jié)、顯示列表技術(shù)解決了大數(shù)據(jù)量雙緩存動(dòng)態(tài)切換的速度問題等。具體請?jiān)斠姟?/p>

論文摘要:本文詳述了一個(gè)GIS三維顯示系統(tǒng)的開發(fā)過程及步驟,在visualc++平臺下運(yùn)用opengl緩存切換技術(shù)實(shí)現(xiàn)三維坐標(biāo)下圖形的動(dòng)態(tài)顯示,提高了數(shù)據(jù)處理和刷新速度,其數(shù)據(jù)通過ADO數(shù)據(jù)庫編程連接SQLServer2000軟件提供。

論文關(guān)鍵詞:OPENGLGIS三維動(dòng)態(tài)顯示ADO

1、引言

隨著計(jì)算機(jī)技術(shù)及圖形學(xué)技術(shù)的發(fā)展,我們可以在計(jì)算機(jī)中精確的模擬現(xiàn)實(shí)世界的任何三維物體,并且實(shí)現(xiàn)宏觀統(tǒng)籌、規(guī)劃、研究以及為工程項(xiàng)目提供更好的決策支持。本文實(shí)現(xiàn)了采礦區(qū)地面沉降的三維模擬,為礦區(qū)安全提供決策依據(jù)。

OpenGL是個(gè)功能強(qiáng)大的底層3D圖形庫。英文全稱是“OpenGraphicsLibrary”,顧名思義,OpenGL便是“開放的圖形程序接口”。OpenGL可以與VisualC++緊密接口,便于實(shí)現(xiàn)機(jī)械手的有關(guān)計(jì)算和圖形算法,可保證算法的正確性和可靠性;OpenGL使用簡便,效率高。作為一個(gè)工業(yè)標(biāo)準(zhǔn)的計(jì)算機(jī)三維圖形軟件開發(fā)接口,它已廣泛應(yīng)用于游戲開發(fā)、建筑、醫(yī)學(xué)、地球科學(xué)等領(lǐng)域。

本文的數(shù)據(jù)提供用的是ADO的數(shù)據(jù)訪問技術(shù),它主要具有易于使用、速度快、內(nèi)存支出少、兼容性廣泛和具有事務(wù)處理功能等優(yōu)點(diǎn)。

2、系統(tǒng)設(shè)計(jì)

這部分包括數(shù)據(jù)庫連接,和基于OpenGL開發(fā)環(huán)境的初期設(shè)置,詳述了一個(gè)基于視圖/文檔結(jié)構(gòu)的應(yīng)用程序框架設(shè)計(jì)。

2.1數(shù)據(jù)庫連接設(shè)計(jì)

引入ADO動(dòng)態(tài)鏈接庫。在使用VisualC++的MFC編程時(shí),MFC并沒有提供對ADO的封裝類,能夠支持ADO編程的是ADO的COM動(dòng)態(tài)鏈接庫msado*.dll。一般在系統(tǒng)盤的\ProgramFiles\CommonFiles\System\ado目錄下,該文件是msado15.dll。

引入該文件的方法是在stdafx.h頭文件中,添加如下代碼:

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

在本程序中的類C***APP的InitInstance()成員函數(shù)里添加代碼::CoInitialize(NULL);

使用UDL文件連接數(shù)據(jù)庫。設(shè)計(jì)“數(shù)據(jù)鏈接屬性”對話框,然后測試連接;

添加一個(gè)連接對象智能指針,利用Open函數(shù)初始化數(shù)據(jù)庫連接;

添加一個(gè)記錄集指針,利用此指針將SQLServer2000數(shù)據(jù)庫里表的記錄意義讀到CArray對象中。

為鏈接數(shù)據(jù)庫,新建一類CLoadData(),用來建立鏈接,并且將數(shù)據(jù)讀入CArray對象。本程序所用數(shù)據(jù)為煤礦開采沉陷區(qū)四期地表水準(zhǔn)和RTK測量綜合數(shù)據(jù),并經(jīng)過預(yù)計(jì)模型計(jì)算后得到格網(wǎng)數(shù)據(jù)。

2.2OpenGL開發(fā)環(huán)境設(shè)置

新建一個(gè)單文檔工程文件,并在項(xiàng)目文件中添加opengl32.lib、glu32.lib和glaux.lib三個(gè)靜態(tài)庫文件。

在C***View類頭文件中添加代碼#include”gl\gl.h”、#include”gl\glu.h”、#include”gl\glaux.h”;修改C***View類中的PreCreateWindows()函數(shù),如添加下句

cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;來設(shè)置窗口風(fēng)格;修改該類OnCreate()函數(shù)中添加如下語句,

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);//得到相應(yīng)的像素格式

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

m_hRC=wglCreateContext(clientDC.m_hDC);

return0;

一般采用如上設(shè)置,也可根據(jù)您的需要修改該窗口的像素格式;修改C***View類中的OnDestroy()函數(shù),使得窗口關(guān)閉前執(zhí)行掃尾工作,如添加語句wglDeleteContext(m_hRC);刪除一個(gè)圖形操作描述表;另外,程序的核心部分便是修改該類的OnPaint()函數(shù),調(diào)用自定義函數(shù)DrawWithOpengl(),完成OpenGL的繪制工作;修改C***View類的OnSize()函數(shù),使其窗口大小發(fā)生變化時(shí)相應(yīng)的改變視口大小和投影變換方式,將場景中的物體正確地顯示在窗口中;設(shè)計(jì)DrawWithOpengl()函數(shù),完成繪圖主體工作;設(shè)計(jì)自定義DrawCoor()函數(shù),用以坐標(biāo)系的建立。

3、技術(shù)要點(diǎn)

3.1三維曲面動(dòng)態(tài)顯示原理

三維動(dòng)態(tài)顯示需要連續(xù)地繪制三維曲面并顯示場景,用不同的點(diǎn)位數(shù)據(jù)刷新屏幕視窗。在OpenGL中利用雙緩存技術(shù),分配兩個(gè)幀緩存區(qū),在連續(xù)顯示三維圖像時(shí),一個(gè)幀緩沖區(qū)中的數(shù)據(jù)執(zhí)行繪制圖像命令的同時(shí),另一個(gè)幀緩存區(qū)中的數(shù)據(jù)進(jìn)行圖像顯示。當(dāng)前可見視頻緩存稱為前臺視頻緩存,不可見的正在繪圖的視頻緩存稱為后臺視頻緩存。當(dāng)后臺視頻緩存中的數(shù)據(jù)要求顯示時(shí),OpenGL就將它拷貝至前臺視頻緩存,顯示硬件不斷地讀可見視頻緩存中的內(nèi)容,并把結(jié)果顯示在屏幕上。

使用雙緩存實(shí)現(xiàn)三維曲面動(dòng)態(tài)顯示的步驟如下:

(1)設(shè)置OpenGL窗口顯示屬性為雙緩存機(jī)制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

(2)利用OpenGL基本繪圖命令繪制三維圖像,我們將用顯示列表提高程序的運(yùn)行效率。

OpenGL顯示列表(DisplayList)是由一組預(yù)先存儲起來的留待以后調(diào)用的OpenGL函數(shù)語句組成的,當(dāng)調(diào)用這張顯示列表時(shí)就依次執(zhí)行表中所列出的函數(shù)語句。它被設(shè)計(jì)成命令高速緩存,而不是動(dòng)態(tài)數(shù)據(jù)庫緩存。一般來說,顯示列表能將許多相鄰的矩陣變換結(jié)合成單個(gè)的矩陣乘法,從而加快速度。

創(chuàng)建列表:

voidglNewList(Gluintlist,Glenmmode);

voidglEndList();

調(diào)用列表:

voidglCallList(Gluintlist);

本程序建立了四個(gè)顯示列表,分別用來顯示同一采礦區(qū)的四期數(shù)據(jù)。

(3)初始化動(dòng)態(tài)顯示幀數(shù),一幀繪圖結(jié)束實(shí)現(xiàn)緩存拷貝和切換緩存:

auxSwapBuffers();

SwapBuffers(wglGetCurrentDC());

這樣多幀循環(huán)實(shí)現(xiàn)四個(gè)時(shí)段不同高程沉陷曲面的動(dòng)態(tài)切換顯示。

3.2其他技術(shù)細(xì)節(jié)

(1)區(qū)域曲面顏色?,F(xiàn)實(shí)世界中,低洼處的顏色總是比高處要暗,實(shí)現(xiàn)這一小功能,可在繪制函數(shù)的高程點(diǎn)繪制處添加如下語句,

glColor3f(z*0.008*(-1)+0.4,z*0.008*(-1)+0.4,z*0.008*(-1)+0.4);這是根據(jù)本程序設(shè)置計(jì)算式,即將高程z作為變量寫入glColor的參數(shù)之中,這樣顏色便根據(jù)此處高程大小而適時(shí)變化了。

(2)將高程值放大一定倍數(shù),這樣動(dòng)態(tài)顯示效果將更明顯。

(3)在開采區(qū)曲面上載入樹木、房屋、公路等基本設(shè)施可增強(qiáng)顯示的現(xiàn)實(shí)性,如本程序載入一棵綠色的小樹,如各圖綠色部分。

(4)如下圖,視圖左下方的藍(lán)色數(shù)字可根據(jù)畫面的切換而動(dòng)態(tài)變化,本程序顯示的是各期數(shù)據(jù)采集的時(shí)間。另外,曲面顯示在一個(gè)三維坐標(biāo)系下,且標(biāo)注了坐標(biāo)值,本程序三個(gè)方向的最大最小坐標(biāo)值是利用自定義函數(shù)GetMin()和GetMax()從讀入CArray對象的數(shù)據(jù)中得到。從而增強(qiáng)了視圖的可讀性。

(5)另外,本程序?qū)η孀隽艘粋€(gè)線渲染,以滿足不同觀測需要,增強(qiáng)了視圖的視覺表達(dá)現(xiàn)實(shí)效果,如圖5。

(6)鼠標(biāo)放大縮小和旋轉(zhuǎn)功能的實(shí)現(xiàn)以方便從各個(gè)方位觀察。

4、實(shí)例操作

圖1到圖4是各期的數(shù)據(jù),動(dòng)態(tài)顯示在這幾組數(shù)據(jù)間進(jìn)行切換,圖1和圖4間數(shù)據(jù)組越多則動(dòng)態(tài)顯示效果越逼真。圖5是一個(gè)按鈕功能的實(shí)現(xiàn),作為礦區(qū)線性渲染圖以滿足不同觀測的需要。

圖1第一期數(shù)據(jù)的三維顯示

圖2第二期數(shù)據(jù)的三維顯示

圖3第三期數(shù)據(jù)的三維顯示

圖4第四期數(shù)據(jù)的三維顯示

圖5第四期數(shù)據(jù)的三維線渲染

5結(jié)束語

本文從系統(tǒng)整體角度詳細(xì)敘述了一個(gè)GIS三維動(dòng)態(tài)成圖的過程與步驟。從數(shù)據(jù)庫連接獲得數(shù)據(jù)開始到坐標(biāo)系的建立,然后成圖并用了顯示列表技術(shù)解決了大數(shù)據(jù)量雙緩存動(dòng)態(tài)切換的速度問題,從而大大提高了程序執(zhí)行效率。

參考文獻(xiàn):

1、劉刀桂.VISUALC++實(shí)踐與提高(數(shù)據(jù)庫篇)[M],中國鐵道出版,2001.

2、費(fèi)廣正.VisualC++6.0高級編程技術(shù)(OpenGL篇)[M],中國鐵道出版社,2000.

3、侯俊杰.深入淺出MFC.華中科技大學(xué)出版社(第二版)[M],2001.

向世明.OpenGL編程與實(shí)例.電子工業(yè)出版社[M],1999.