摘要:本文介紹了一種利用OpenGL和3D max相結合開發(fā)的地下儲備庫三維仿真系統(tǒng),首先利用3D MAX建立地下工程的三維模型,通過第三方軟件轉換成OpenGL可以識別的代碼,再利用OpenGL實現(xiàn)對模型的實時控制,包括進度顯示、模型平移、縮放和旋轉,分層模型的消隱等。用戶通過這套系統(tǒng)可以直觀的了解工程建設的進展情況,并且通過自主控制多角度、全方位了解地下工程的情況。
關鍵詞:OpenGL;3D;MAX;地下儲備庫;仿真
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1007—9599 (2012) 14—0000—02
二、引言
地下水封巖洞儲備庫是國家進行原油、成品油、天然氣戰(zhàn)略儲備的重要方式之一,對保障國家能源安全有重要的作用和意義。具有安全、環(huán)保、經(jīng)濟、使用年限長、免維護、抗震等優(yōu)勢,是歐美、日本等發(fā)達國家主要的戰(zhàn)略儲備方式,我國也陸續(xù)在沿海地質條件適宜地區(qū)開工建設大型地下水封巖洞儲備庫。地下工程建設周期較長,地下結構復雜,施工情況受地下不確定因素影響較大,通常施工作業(yè)面較多,作業(yè)工序交叉多,傳統(tǒng)的進度計算和表述方法只能抽象描述整個工程進展情況,描述方法過于單調(diào)。而且由于絕大多數(shù)單項工程都在地下進行,人們無法直觀的看到工程進展到何種程度,因此,結合地下儲備庫工程特點開發(fā)一套圖形仿真系統(tǒng)是十分必要的,可及時地反映最新工程進展情況,并可個性化模擬地下儲備庫的整體情況,用戶能夠通過自主控制從任意角度觀察儲備庫的模擬。
要實現(xiàn)這套系統(tǒng)的開發(fā),用到的主要工具是SGI公司開發(fā)的的三維圖形標準庫OpenGL,OpenGL是一個功能強大的圖形庫,它具有很強的交互式三維圖形處理能力且獨立于窗口系統(tǒng)和操作系統(tǒng),用戶可以利用它繪制出二維或三維圖形,以它為基礎開發(fā)的應用程序可以方便地在各個平臺間移植。但由于OpenGL只能通過基本的幾何圖元即點、線、多邊形來建立模型,并沒有提供三維模型的高級命令,因此建立復雜物體的三維模型是非常繁瑣和枯燥的,所以就需要應用另外一種工具,Autodesk公司開發(fā)的三維建模、動畫制作軟件3Dstudio MAX。利用3Dmax建立復雜物體的模型要簡單得多,但它不能進行信息交互,不能實現(xiàn)實時控制,但這又恰好是OpenGL所長,因此,利用OpenGL和3D MAX結合起來實現(xiàn)地下儲備庫的三維模擬可以得到事半功倍的效果。
二、建模與仿真
(一)利用3D MAX建立地下儲備庫模型
利用3D MAX建立物體模型,這里只是建立模型,并不對模型賦予材質和燈光,這些工作可以利用OpenGL完成。建模過程中,將各個單項工程分別建模,施工巷道、水幕系統(tǒng)、主洞室、豎井、連接巷道和密封塞六部分。建模完成后將其輸出為.3ds格式的文件。3ds文件是3D Max的一種二進制存儲格式,它基于“塊”存儲的,這些塊描述了諸如場景數(shù)據(jù),編輯窗口的狀態(tài),材質,網(wǎng)格數(shù)據(jù)等。
(二)將3ds文件導入OpenGL中
將3ds文件導入OpenGL可以采用文件轉換法或者直接通過編程平臺讀入3DS文件。文件轉換法是利用第三方工具如View3d等直接將3ds文件轉換成OpenGL所需的c文件,將生成的.h和.gl文件導入到OpenGL程序框架中,添加相應代碼編譯執(zhí)行即可得到所需模型。這種方法較簡單,但導入過程中存儲在3ds文件中的材質紋理等信息會丟失。開發(fā)人員也可以自定義一個讀取3ds文件的類,用于3DS文件的讀入與重繪。但這需要基于開發(fā)人員對3ds文件充分理解的基礎上,分別讀取3ds文件中的編輯塊、顏色塊、材質塊、紋理塊等信息。由于本系統(tǒng)建模階段并沒有進行材質賦予等工作,所以采用第一種方法將3ds文件導入OpenGL。
(三)利用OpenGL建立地下儲備庫仿真系統(tǒng)
1.在VC++6.0中建立一個基于MFC的單文檔應用程序,并將opengl32.lib、glu32.lib、glaux.lib庫文件加入到應用程序項目中,在View類的頭文件中加入gl.h、glu.h、glaux.h三個頭文件。
2.建立窗口著色描述表、OpenGL渲染描述表、設置像素格式、添加view類的消息函數(shù),還需要添加繪圖初始化函數(shù)和顯示函數(shù)等。
3.將之前3ds文件轉換形成的modle.h和modle.gl文件拷貝到工程文件中,在modle.h文件中會自動生成一個函數(shù)GL3DS_initialize_modle(),在int DrawGLScene(GLvoid)中調(diào)用該函數(shù),從而完成模型的導入。
4.材質的賦予
OpenGL 用材料對光的紅、綠、藍三原色的反射率來近似定義材料的顏色。由于整個模型是地下洞庫的三維示意模型,為了美觀和便于觀察,并不要求模型的材質和真實環(huán)境一樣,因此這里我們采取用戶自定義顏色的方式,默認設置施工巷道為棕色(0.5f,0.0f,0.0f),水幕系統(tǒng)為綠色(0.0f,1.0f,0.0f),主洞室為紫色(1.0f,0.0f,1.0f),豎井為藍色(0.0f,0.0f,1.0f)。用戶也可按照自己的審美習慣來設置各子系統(tǒng)的顏色,用MFC的CColorDialog類來獲取用戶定義的顏色。
5.光照
為了增加模型的立體感,還需要在合適的位置增加一些光源,使模型呈現(xiàn)出明暗效果。我們采用glLight*()函數(shù)來設置光源的所有屬性。它有三個參數(shù),分別用來代表光源標識、需設置的屬性及期望的屬性值。使用光源必須對光源進行啟動,啟動光源使用函數(shù)GlEnable()實現(xiàn)。
完成上述步驟并編譯運行,即可得到地下儲備庫的三維仿真模型,側視圖如圖1所示。
三、仿真系統(tǒng)人機交互的實現(xiàn)
(一)進度實時顯示
進度實時顯示的思路是采用不用顏色來區(qū)分工程完成部分和未完成部分,模型未完成部分用灰白色顯示,已完成部分用其他色彩顯示,同樣這些色彩都是可以由用戶來定義的。但地下工程有其復雜性,單項工程并不是從起點坐標開始,而是根據(jù)施工方法,施工工序等各種因素確定,有可能從起點開始,也有可能從中間的某一個點開始,為了精確顯示進度的完成情況,我們對從用戶那里采集的數(shù)據(jù)做了統(tǒng)一要求,都以起點+里程的格式,如施工巷道SAT2+00~SAT3+50,表示施工巷道起點開始200—350米。把采集到的用戶數(shù)據(jù)通過數(shù)學變換轉換為和系統(tǒng)一致的坐標信息,對這部分模型賦予新的材質,就實現(xiàn)了施工進度的立體顯示。
(二)平移、旋轉和縮放
實時平移、旋轉和縮放是查看地下儲備庫三維模型時所必須的操作,通過這些操作就能夠實現(xiàn)從任意角度觀察模型,從而解決了遮擋及視覺死角等問題。用戶可以通過鼠標鍵盤來控制模型的顯示情況。
1.平移變換
在OpenGL繪圖時,只需對視點位置和參考點位置進行簡單的變換操作就可以實現(xiàn)平移變換,下面是實現(xiàn)水平移動的部分代碼。
//以下代碼表示物體的水平移動
2.旋轉
//以下代碼實現(xiàn)沿z軸旋轉,其中angle為旋轉角度
3.縮放
//以下代碼實現(xiàn)縮放功能
(三)局部顯示
很多時候用戶僅僅需要看到某一單項工程的情況,每一次用戶選擇不同的單項工程,都需要對該工程進行重繪,這種方法會消耗較多的資源,降低程序運行效率。為了提高系統(tǒng)效率,采用OpenGL提供的顯示列表來解決這一問題。OpenGL顯示列表是一組預先存儲起來的OpenGL命令。顯示列表可以在任何地方被調(diào)用,并按順序立即執(zhí)行。下面是創(chuàng)建顯示列表的偽代碼:
//同樣建立其他5個單項工程的顯示列表
程序中根據(jù)用戶的選擇情況,在繪圖函數(shù)中,來調(diào)用相應的單項工程的顯示列表,就可以實現(xiàn)單項工程的局部顯示。
(四)仿真系統(tǒng)結果
下圖是某地下儲備庫工程水幕系統(tǒng)進度顯示效果圖。
四、結論
采用3D MAX和OpenGL相結合實現(xiàn)了對地下儲備庫的三維仿真模擬,利用3D MAX建立模型方便和OpenGL容易實現(xiàn)人機交互的特點,避免了各自的缺陷,從而使三維仿真的實現(xiàn)變得更加輕松。通過地下儲備庫三維模擬系統(tǒng),用戶可以直觀的了解工程進展情況,同時通過實時人機交互,較為方便的顯示自己想要了解的具體情況,施工單位也可以運用此系統(tǒng)合理布置施工工序,減少工序的不合力交叉。此外,系統(tǒng)還留有接口,可以同地下儲備庫的傳感系統(tǒng)相連接,在將來工程竣工投入使用后,能夠通過采集傳感器數(shù)據(jù)來實時顯示整個儲備庫的情況以及重點部位的應力分布等,當然,要實現(xiàn)這些功能,還必須要對整個系統(tǒng)進行大量的優(yōu)化。