基於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雙緩存及顯示列表技術,基於某數據場數據,開發了三維曲面圖形動態顯示仿真系統,該實例中視窗中三維曲面圖形隨數據場的數據的改變而動態顯示,圖2為程序運行中某一時刻的顯示結果。

  結束語

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

 

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

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

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



 

  圖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);

 

CSDN 2015-05

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM