天天看點

基于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_BIT|GL_DEPTH_BUFFER_BIT);//清除顔色緩存和深度緩存

glColor3f(1.0f,1.0f,1.0f);//設定繪圖顔色為紅色

2、建立繪制三維曲面的顯示清單

在顯示清單中定義使用者繪制三維曲面圖形所需資料以及資料之間顯示連接配接方式。文中執行個體中顯示清單包括三維曲面圖形的資料點的顯示清單;坐标軸的顯示清單;顯示坐标資料的顯示清單。顯示清單采用線段連接配接的方式。

3、三維曲面圖形動态顯示程式主架構

在視類中産生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的三維曲面動态顯示實作

  根據以上思想,利用OpenGL雙緩存及顯示清單技術,基于某資料場資料,開發了三維曲面圖形動态顯示仿真系統,該執行個體中視窗中三維曲面圖形随資料場的資料的改變而動态顯示,圖2為程式運作中某一時刻的顯示結果。

  結束語

  在微機平台上,利用VC6.0的OpenGL根據資料場的分布進行三維曲面的動态顯示是切實可行的,尤其采用雙緩存及顯示清單技術可以得到很好的三維曲面生成速度,這種動态顯示技術可以推廣應用在需要進行實時動态顯示的資料處理方面。

基于OpenGL的三維曲面動态顯示原理

1、基于OpenGL三維曲面圖形顯示原理

OpenGL是獨立于作業系統的開放式三維圖形軟體接口。其主要功能是将三維曲面通過頂點序列或像素點進行描述,并進行相應的透視、光照、紋理操作,最終轉換成幀緩存中的圖像資料,利用該圖像資料進行三維曲面圖形的着色。三維曲面圖形顯示歸納為以下幾個步驟:

(1)在三維場景中建立曲面繪制的模型。選用插值方法、參數曲面函數,計算曲面控制點,進行曲面重構;

(2)設定視點和透視方式;

(3)進行消隐、光照、紋理、明暗處理;

(4)繪制場景,輸出到螢幕視窗。

基于OpenGL的三維曲面動态顯示實作

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

2、利用雙緩存實作動态顯示原理

三維曲面動态顯示需要連續地繪制三維曲面并顯示場景,用不同的曲面資料重新整理螢幕視窗。

在OpenGL中利用雙緩存技術,配置設定兩個幀緩存區,在連續顯示三維曲面時,一個幀緩沖區中的資料執行繪制曲面指令的同時,另一個幀緩存區中的資料進行圖形顯示。目前可見視訊緩存稱為前台視訊緩存,不可見的正在繪圖的視訊緩存稱為背景視訊緩存。當背景視訊緩存中的資料要求顯示時,OpenGL就将它拷貝至前台視訊緩存,顯示硬體不斷地讀可見視訊緩存中的内容,并把結果顯示在螢幕上。

應用雙緩存,每一幀三維曲面隻在繪制完成之後才顯示出來,是以觀察者可以看到每一幀完整三維曲面,而不是曲面的繪制過程。

使用雙緩存實作三維曲面動态顯示的步驟如下:

  (1)設定OpenGL視窗顯示屬性為雙緩存機制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);

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

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

SwapBuffers(wglGetCurrentDC());

3、利用顯示清單提高程式運作效率

顯示清單是一組預先存儲起來留待以後調用的函數語句。調用顯示清單時就按次序執行其中的函數。顯示清單将反複執行的繪圖操作以編譯好的指令方式進行存儲,設計成指令的高速緩存,而不是動态的資料庫緩存,是以可以優化程式運作性能。

實作和調用顯示清單的方法:

(1)建立清單:

voidglNewList(Gluint list,Glenm mode);

voidglBegin(Glenum mode);

voidglEnd(void);

voidglEndList();

(2)調用清單:

voidglCallList(Gluint list);