基於OpenGL的三維曲面動態顯示實現

在使用Visual C++的MFC AppWizard創建應用程序框架後,生成了多個類,與OpenGL編程相關的類是視圖類,主要的顯示任務都在其中完成。數據庫

 

一、基於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 建立着色描述表ui

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);//設置繪圖顏色爲紅色

 

二、建立繪製三維曲面的顯示列表

在顯示列表中定義用戶繪製三維曲面圖形所需數據以及數據之間顯示鏈接方式。文中實例中顯示列表包括三維曲面圖形的數據點的顯示列表;座標軸的顯示列表;顯示座標數據的顯示列表。顯示列表採用線段鏈接的方式。

三、三維曲面圖形動態顯示程序主框架

在視類中產生Onhuitu()做爲繪圖的主程序。三維曲面圖形動態顯示子程序drawsurbs()包括初始化,讀數據文件,數據插值,投影變換,消隱,繪圖顯示列表設置(座標軸繪製顯示列表、三維曲面繪製顯示列表),強制繪圖操做,緩存拷貝,切換先後緩衝區等幾個主要部分。初始化程序myinit()中設置雙緩存模式,是實現動態顯示的前提。drawsurbs()中緩存拷貝auxSwapBuffers()、切換緩存SwapBuffers (wglGetCurrentDC())、緩衝區的清除glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)是實現動態顯示的必不可少的操做。

voidCNurbsView::Onhuitu()
{
 HWND hWnd=GetSafeHwnd();
 HDChDC=::GetDC(hWnd);
 wglMakeCurrent(hDC,hglrc);//設置當前着色表
 drawsurbs();//動態顯示三維曲面子程序
 wglMakeCurrent(NULL,NULL);//着色表非當前化
 SwapBuffers(hDC);//交換緩存
}
{
 ……
 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_BIT|GL_DEPTH_BUFFER_BIT);//爲繪下幀曲面清除緩衝區
jixu--
deley();//延時子程序
 }
}
 
 
void CNurbsView::myinit()
{
 glClearColor(0.03,0.4,0.4,0.4);
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);//設置成雙緩存模式
}

某數據場三維曲面動態顯示仿真系統實例


  根據以上思想,利用OpenGL雙緩存及顯示列表技術,基於某數據場數據,開發了三維曲面圖形動態顯示仿真系統,該實例中視窗中三維曲面圖形隨數據場的數據的改變而動態顯示,圖2爲程序運行中某一時刻的顯示結果。

  結束語

  在微機平臺上,利用VC6.0的OpenGL根據數據場的分佈進行三維曲面的動態顯示是切實可行的,尤爲採用雙緩存及顯示列表技術能夠獲得很好的三維曲面生成速度,這種動態顯示技術能夠推廣應用在須要進行實時動態顯示的數據處理方面。

 

基於OpenGL的三維曲面動態顯示原理

一、基於OpenGL三維曲面圖形顯示原理
OpenGL是獨立於操做系統的開放式三維圖形軟件接口。其主要功能是將三維曲面經過頂點序列或像素點進行描述,並進行相應的透視、光照、紋理操做,最終轉換成幀緩存中的圖像數據,利用該圖像數據進行三維曲面圖形的着色。三維曲面圖形顯示概括爲如下幾個步驟:

(1)在三維場景中創建曲面繪製的模型。選用插值方法、參數曲面函數,計算曲面控制點,進行曲面重構;
(2)設置視點和透視方式;
(3)進行消隱、光照、紋理、明暗處理;
(4)繪製場景,輸出到屏幕窗口。



 

  圖2 三維曲面圖形顯示基本流程

二、利用雙緩存實現動態顯示原理

三維曲面動態顯示須要連續地繪製三維曲面並顯示場景,用不一樣的曲面數據刷新屏幕視窗。

在OpenGL中利用雙緩存技術,分配兩個幀緩存區,在連續顯示三維曲面時,一個幀緩衝區中的數據執行繪製曲面命令的同時,另外一個幀緩存區中的數據進行圖形顯示。當前可見視頻緩存稱爲前臺視頻緩存,不可見的正在繪圖的視頻緩存稱爲後臺視頻緩存。當後臺視頻緩存中的數據要求顯示時,OpenGL就將它拷貝至前臺視頻緩存,顯示硬件不斷地讀可見視頻緩存中的內容,並把結果顯示在屏幕上。

應用雙緩存,每一幀三維曲面只在繪製完成以後才顯示出來,因此觀察者能夠看到每一幀完整三維曲面,而不是曲面的繪製過程。

使用雙緩存實現三維曲面動態顯示的步驟以下:

  (1)設置OpenGL窗口顯示屬性爲雙緩存機制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

(2)利用OpenGL基本繪圖命令繪製三維曲面;

(3)一幀曲面繪圖結束後緩存拷貝,切換緩存:auxSwapBuffers();

SwapBuffers(wglGetCurrentDC());

 

三、利用顯示列表提升程序運行效率

顯示列表是一組預先存儲起來留待之後調用的函數語句。調用顯示列表時就按次序執行其中的函數。顯示列表將反覆執行的繪圖操做以編譯好的命令方式進行存儲,設計成命令的高速緩存,而不是動態的數據庫緩存,因此能夠優化程序運行性能。

實現和調用顯示列表的方法:

(1)建立列表:

voidglNewList(Gluint list,Glenm mode);

voidglBegin(Glenum mode);

voidglEnd(void);

voidglEndList();

 

(2)調用列表:

voidglCallList(Gluint list);

 

CSDN 2015-05

相關文章
相關標籤/搜索