openGL+數(shù)值模擬實(shí)時三維可視化的C#_第1頁
openGL+數(shù)值模擬實(shí)時三維可視化的C#_第2頁
openGL+數(shù)值模擬實(shí)時三維可視化的C#_第3頁
openGL+數(shù)值模擬實(shí)時三維可視化的C#_第4頁
openGL+數(shù)值模擬實(shí)時三維可視化的C#_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、訪問100次作者:朱泰山,王一一,馮國泰1. 引言當(dāng)代CFD/NHT等大型數(shù)值模擬軟件的開發(fā)工作在全球范圍內(nèi)進(jìn)行得如火如荼,但主要的成果集中在國外大型相關(guān)專業(yè)軟件開發(fā)商,如ANSYS公司的FLUENT和CFX等。國內(nèi),尤其是高校內(nèi)同類軟件的開發(fā)應(yīng)該在計(jì)算性能和個性化上尋求創(chuàng)新和突破,如果一味地依賴商用軟件,我國與國外先進(jìn)水平的差距將會越拉越大。哈爾濱工業(yè)大學(xué)推進(jìn)理論與技術(shù)研究所開發(fā)的HITurbine主要是針對航空以及地面燃?xì)鉁u輪內(nèi)部流場的數(shù)值模擬而設(shè)計(jì)開發(fā)的,圖1為HITurbine的主界面。圖1HITurbine主界面由于現(xiàn)有大多已有成熟的數(shù)值程序是由Fortran編寫的,所以HITurb

2、ine考慮并采用了如圖2所示系統(tǒng)結(jié)構(gòu):C#MainProgram&InterfaceFortranOpenGLReal-time3DResultVisualizationComputationProgram(DLL)OtherAPIHPCetc圖2HITurbine系統(tǒng)的結(jié)構(gòu)2. 實(shí)時三維可視化實(shí)現(xiàn)目前,微軟公司已推出的DirectX9.0c中已經(jīng)包含了一個ManagedDirectX程序集,這個程序集為.NET框架下的托管代碼提供了訪問Direct3D的接口,這使得C#能夠方便地編寫Direct3D代碼。OpenGL目前的進(jìn)展有些落后,雖然運(yùn)用C/C+、VB以及Fortran等開發(fā)OpenG

3、L程序的技術(shù)已經(jīng)相對成熟(參見文獻(xiàn)23),然而.NET仍沒有提供OpenGLAPI的接口,所以也不存在C#開發(fā)OpenGL的標(biāo)準(zhǔn)和規(guī)范,這對于擅長界面編寫的C#來說,亦可稱為一種挑戰(zhàn)。Direct3D的參考書籍和網(wǎng)絡(luò)資源相當(dāng)豐富,其中在.NET環(huán)境下的開發(fā)框架在文獻(xiàn)14中有詳細(xì)的敘述,而OpenGL的資源則相對少得很多。實(shí)質(zhì)上OpenGL具有平臺無關(guān)性,利用C#與其實(shí)現(xiàn)實(shí)時的三維可視化與其它語言沒有實(shí)質(zhì)性的差異,關(guān)鍵是要在開發(fā)環(huán)境下做好相應(yīng)的配置,下文將對.NET下三種OpenGL具體配置方式加以討論。2.1 C#直接調(diào)用OpenGL用C#和OpenGL實(shí)現(xiàn)計(jì)算實(shí)時可視化,最直接的方式就是利用

4、C#調(diào)用OpenGL所提供的開發(fā)庫。但是如前所述,OpenGL所提供的函數(shù)均為C接口的API形式,用C#實(shí)現(xiàn)要進(jìn)行類似混合語言編程過程的DLL調(diào)用,即調(diào)用OPENGL32.DLL、GLU32.DLL以及GLUT32.DLL等。另外,為了體現(xiàn)OOP思想,可新建一個OpenGL調(diào)用類,如下clsGL類和clsGLU類分別調(diào)用OpenGL和GLU:usingSystem.Runtime.InteropServices;publicclassclsGL/OpenGL常量聲明publicconstuintGL_COLOR_BUFFER_BIT=0x00004000;publicconstuintGL_M

5、ODELVIEW=0x1700;publicconstuintGL_PROJECTION=0x1701;JJJJ/函數(shù)入口聲明DllImport(opengl32.dll)publicstaticexternvoidglClear(uintmask);DllImport(opengl32.dll)publicstaticexternvoidglBegin(uintmode);JJJJpublicclassclsGLU/OpenGL常量與函數(shù)入口聲明JJJJ然而OpenGL提供約有250個左右不同的函數(shù),還不包括GLUT等常用的工具庫和大量如上所述的OpenGL常量,所以若要在C#中進(jìn)行DLL調(diào)

6、用,可想而知其工作量將是非常大的。所以這種方式雖然直接,但相對以下所述的兩種方式較為繁瑣,所以在實(shí)際運(yùn)用中少見。2.2 利用CSOpenGL實(shí)現(xiàn)若利用CSOpenGL實(shí)現(xiàn),則需先將CSOpenGL.dll、CSOpenGLC.dll、mfc70.dll和msvcr70.dll四個文件拷貝到可執(zhí)行文件目錄,當(dāng)然也可以放到系統(tǒng)文件夾system32下公用。然后進(jìn)行引用“usingCSOpenGL;”即可在.NET環(huán)境下進(jìn)行OpenGL代碼編寫了。將繪圖的功能模塊單獨(dú)寫為一個單獨(dú)的繼承自GLViewPainter類的繪圖類,如zPainter,該類中的工作僅僅是對Paint()方法的重構(gòu)和具體繪圖方

7、法的建模。代碼框架如下:publicclasszPainter:GLViewPainterpubliczPainter()publicoverridevoidPaint(GLViewview),/*OpenGL初始化,如glViewport(0,0,view.Width,view.Height);glMatrixMode(GL_PROJECTION);等*/drawYourImg();/DrawImagesglFlush();publicvoiddrawYourImg(),/*OpenGL初始化,如glEnable(GL_BLEND);等*/,/DrawYourImagesHere通過參數(shù)傳遞

8、和drawYourImg()建模,即可實(shí)現(xiàn)繪圖類的繪圖功能。在圖1的主界面中,右側(cè)黑色部分為一個pictureBox控件,此即為圖形繪制表面,可以通過如下代碼進(jìn)行指定:zPainternZp=newzPainter();GLViewView=newGLView();View.Parent=this.pictureBox1;View.CreateControl();View.Dock=DockStyle.Fill;View._OnPaint=newzPainter();以上代碼實(shí)現(xiàn)了利用CSOpenGL接口進(jìn)行C#的三維可視化編程,OpenGL初始化及如紋理及場景繪制等具體繪圖方法可以參考56等

9、。2.3 利用CsGL實(shí)現(xiàn)CsGL的應(yīng)用方法在文獻(xiàn)5中有過敘述。本文將在利用CsGL方面做一些補(bǔ)充,以使得更好地運(yùn)用其開發(fā)程序界面。利用CsGL時csgl.dll與csgl.native.dll是必須的。將其拷貝到可執(zhí)行文件運(yùn)行目錄或系統(tǒng)目system32下后,新建一個繼承于OpenGLControl的新類,并加以引用“usingCsGL.OpenGL;”,然后至少作如下三個重構(gòu):classcsglP:OpenGLControlpublicoverridevoidglDraw()base.glDraw();,/*OpenGL初始化,如glEnable(GL_BLEND);等*/GL.glBeg

10、in(GLenummode);,/DrawYourImagesHereGL.glEnd();protectedoverridevoidInitGLContext()base.InitGLContext();,/*繪制環(huán)境初始化,如GL.glShadeModel(GL.GL_SMOOTH);等*/protectedoverridevoidOnSizeChanged(EventArgse)base.OnSizeChanged(e);,/*窗口大小變化時調(diào)用,如GL.glViewport(0,0,this.Width,this.Height);等*/為了實(shí)現(xiàn)在指定繪制平面內(nèi)繪圖,可以類似CSOpen

11、GL加入以下代碼:csglPzView=newcsglP();Controls.Add(zView);zView.Parent=this.pictureBox1;zView.Dock=DockStyle.Fill;這樣就實(shí)現(xiàn)了在.NET環(huán)境下的CsGL配置,進(jìn)而可以在.NET下編寫OpenGL的C#代碼。與CSOpenGL相比,CsGL的運(yùn)用方法更接近OpenGL的C接口方式,但大體上十分相似,只是由于封裝得不同,所以對用戶來說只是需重構(gòu)的方法不一樣而已,關(guān)鍵的核心繪圖代碼則是一致的,并且與其它語言也很相似,畢竟OpenGL是平臺無關(guān)的。用戶可以自己通過ObjectBrowser查看和比較這兩

12、個接口。3. 具體實(shí)例為了更加清晰地說明,下面以一個實(shí)例的實(shí)現(xiàn)過程進(jìn)行較為具體地解釋。3.1繪制橢球體在OpenGL中繪制三維圖形,橢球體的繪制相對來說較為簡單。本例將以CSOpenGL實(shí)現(xiàn)過程為例詳細(xì)說明其具體繪制過程。做好2.2中所述的配置后,然后再將drawYourImg()方法改寫如下:publicvoiddrawYourImg()floatambient=1.0f,1.0f,0.0f,1.0f;floatdiffuse=1.0f,1.0f,1.0f,1.0f;floatspecular=1.0f,1.0f,1.0f,1.0f;3所示的橢球體:floatposition=1.0f,1.

13、0f,1.0f,0.0f;glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,specular);glLightfv(GL_LIGHT0,GL_POSITION,position);glEnable(GL_LIGHT0);glEnable(GL_LIGHTING);gluLookAt(6.0,6.0,6.0,0.0,0.0,0.0,0.0,0.0,1.0);IntPtrhdc=gluNewQuadric();gluSpher

14、e(hdc,2.0,38,38);gluDeleteQuadric(hdc);接下來如2.2中進(jìn)行繪制表面制定后,即可在主程序中調(diào)用該方法,繪制出如圖圖3利用CSOpenGL實(shí)現(xiàn)橢球體繪制3.2其它實(shí)際上,利用上述各種方式實(shí)現(xiàn)都是大同小異的,不同點(diǎn)僅僅在環(huán)境的配置上。3.1是一個最簡單的例子,如果建立更加復(fù)雜的幾何模型(即drawYourlmg方法),再通過更多的OpenGL參數(shù)控制,可以繪制更加復(fù)雜的三維圖形,如圖4和圖5為某型航空渦輪葉片,圖中表面曲線為插值結(jié)果。本文目的在于C#實(shí)現(xiàn)框架的建立,OpenGL具體繪制不是本文的重點(diǎn),在此不加贅述。其中,圖3為線框模型渲染的效果,圖4添加了光照

15、效果并以平滑著色。實(shí)際應(yīng)用中可以根據(jù)需要還可以應(yīng)用OpenGL提供的陰影和紋理等效果,渲染出更加令人滿意的場景。圖4某型航空渦輪葉片線框模型渲染效果圖圖5使用光照并以平滑著色的渲染效果通過上文的分析可以發(fā)現(xiàn),利用C#編寫OpenGL代碼更具吸引力,原因在于其更加簡單直觀,而且省去了C/C+下的很多如前后臺緩存交換問題等等的一系列工作。本文說明了常用的三種實(shí)現(xiàn)模式,具體OpenGL的編程技術(shù)在文中沒有展開,具體可參見6等講述OpenGL的書籍。利用C#和OpenGL實(shí)現(xiàn)計(jì)算結(jié)果實(shí)時三維可視化的關(guān)鍵在于OpenGL繪圖方法的建模,本文進(jìn)行的工作是框架的搭建。具體在應(yīng)用CSOpenGL或CsGL兩個接口進(jìn)行三維建模時,只要做好上述的環(huán)境配置,就可以在.NET環(huán)境下應(yīng)用C#編寫OpenGL代碼來實(shí)現(xiàn)實(shí)時三維可視化了,接下來的工作就是通過參數(shù)傳遞,運(yùn)用計(jì)算所得數(shù)據(jù)實(shí)現(xiàn)實(shí)時三維可視化。同時可見,一般的數(shù)值模擬軟件均可以利用此框架進(jìn)行快速開發(fā),已使其具有計(jì)算結(jié)果實(shí)時可視化功能。用戶還可以根據(jù)需要擴(kuò)展和發(fā)展這個框架,例如建立多個監(jiān)視窗口等,這在.NET下利用C#是很容易實(shí)現(xiàn)的。參考文獻(xiàn):1 劉維華,張尤賽,王敏.NET框架下Direct3D程序的快速開發(fā)J.電腦

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論