三維顯示系統開發研討論文
時間: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.