基於OpenGL的邦寶模型積木分析系統設計與實現

學識都 人氣:3.22W

摘 要:由於傳統單憑經驗使用插座式積木搭建大型場景模型時會出現費時費力,無法提前統計成本等難題,所以急需開發出一個積木智能搭建系統。邦寶模型積木分析系統正是應企業需求開發,涉及到智能選擇不同形狀的積木來完成每一層的鋪設、上下層交叉鋪設、模型不同位置不同染色、減少零碎顆粒等要求,針對這種情況,提出了基於OpenGL技術,設計出相應的算法。本文從工程應用的角度出發,簡要介紹了3DS文件格式,系統用到的開發平臺及OpenGL技術,整個系統的結構總框架及功能,基於掃描法的柵格化算法、單層積木鋪設算法及上下層粘連性檢驗算法。在此基礎上實現了從3D模型文件導入、模型調整、切片分層、顆粒化到輸出積木搭建方案的全自動化。

基於OpenGL的邦寶模型積木分析系統設計與實現

關鍵詞:積木;OpenGL;3D模型

引言

隨着當今時代計算機技術的突飛猛進,三維圖形技術在建築虛擬、場景漫遊、虛擬教育、3D遊戲等各方面的應用越來越廣泛。同時各種3D模擬積木軟件也得到迅猛的發展,目前國內外應用較多的軟件有Lego Digital Designer、MLCad、LDView、LPub等,雖然這些都是非常優秀的3D模擬積木軟件,但它們並沒有一個軟件能徹底解決從三維模型導入、模型調整、切片分層、顆粒化到輸出積木搭建方案的全自動化。

OpenGL是一個功能強大的三維圖形開發接口,由於它方便而強大的三維圖形的繪製功能,並具有可靠性高、可擴展性、可伸縮性、容易使用、靈活性和可移植性等優點,因此應用OpenGL開發技術能夠極大地提高開發效率。儘管很多文獻[1-4]介紹了利用OpenGL技術對3DS模型數據進行讀取、顯示和控制的方法,但大多數只涉及到基本的靜態3DS模型數據的使用,並沒有對動態數據進行處理。本文基於OpenGL技術對邦寶模型積木分析系統進行了研究,通過這個系統,我們可以讀取出3DS模型文件並對其進行顯示控制,然後通過切片、顆粒化等一系列操作計算出在使用邦寶基本部件搭建一個模型時所需要的部件種類、個數及每層的積木搭建排列,進一步計算出整個模型所用積木的總重量及總價格。

一、3DS文件格式簡介

3DS是Autodesk公司存儲3D模型數據的一種文件格式。

3DS文件結構由許多塊組成,每個塊由信息類別和下一個塊的相對位置兩部分組成,其中塊的信息類別用ID來標識。由於每個塊指出了下一個塊的相對於該塊起始位置的偏移字節數,這樣即使你不明白這個塊的含義,也可以很容易地忽略它。與許多文件格式一樣,3DS二進制文件中的數據也是按低位在前、高位在後的方式組織的。例如,兩個十六進制字節0x4A5C組成的整型數,表明5C是高位字節,4A是低位字節[5]。

3DS文件中塊的前兩項信息分別是塊的ID和塊的長度,其中塊的ID是一個整型數,而塊的長度是一個塊相對於該塊的字節偏移量,是一個長整型數。3DS文件中每個塊是一個層次結構,不同類型的塊具有不同的層次結構。每一個3DS文件的開頭都是由一個根塊構成,它包含了整個文件,其ID是0x4D4D。根塊內的塊稱爲主塊,主塊有3D編輯程序塊和關鍵幀塊兩種類型。主塊後面是該主塊所包括的子塊,而3D編輯程序塊是物體的形體數據定義的開始。3D編輯程序塊的子塊包括材質列表塊、物體塊等,而物體塊又包含了網格塊、亮度信息塊、相機參數塊等。其中網格塊包括位置信息塊、頂點列表塊、面信息塊等;關鍵幀塊定義關鍵幀的信息。3DS文件這種複雜的塊層次結構的優勢在於即使我們並不知道每一個塊的具體含義,在程序中讀取3DS文件類型的模型時,完全可以忽略掉那些不感興趣或不需要的塊信息,僅讀取所需要的塊。

二、開發平臺和技術

2.1 使用C#編程語言

C#是一種完全建立在Microsoft.NET框架平臺上的高級編程語言,它幾乎集中了所有關於軟件開發和軟件工程研究的最新成果,如面向對象、類型安全等。C#充分利用了.NET框架的優點,是開發.NET框架應用程序最好的語言之一。與VC++相比,C#的程序調試更加容易,語法更加簡潔,且可以更加快速地開發應用程序。把C#和OpenGL結合起來開發3D圖形程序和軟件,將顯著提高開發效率[6]。

2.2 使用OpenGL技術

OpenGL的英文全稱是“Open Graphics Library”,即“開放性圖形庫”,它是計算機工業標準3D應用程序接口,是一個功能強大,調用方便的底層3D圖形庫。作爲圖形硬件的軟件接口,OpenGL由幾百個指令或函數組成,這些指令允許用戶說明二維幾何對象或三維幾何對象,允許用戶對對象實施操作以便把這些對象着色到幀存上。OpenGL作爲一個性能優越的圖形應用程序設計界面(API),適用於廣泛的計算機環境。OpenGL是一套底層三維圖形API,之所以稱之爲底層API,是因爲它沒有提供幾何實體圖元,不能直接用以描述場景。但通過一些轉換程序,可以很方便的將AutoCAD、3DS等圖形設計軟件製作的3DS模型文件轉換成OpenGL的頂點數據。由於OpenGL提供了清晰明瞭的圖形函數,所以不要求開發者把三維物體模型的數據寫成固定的數據格式,開發者不但可以直接使用自己的數據,而且可以利用其它不同格式的數據源,這種靈活性極大地節省了開發時間,提高了開發效率。因此我們選擇使用OpenGL技術進行開發。

2.3 在C#中使用Tao框架實現OpenGL建模技術

由於OpenGL的廣泛應用,它已經成爲了一個工業標準。

目前雖然有很多軟件開發商提供的程序設計語言都提供了對開發基於OpenGL應用軟件的支持,如Visual C++,C++builder等。但是並沒有提供在C#中開發OpenGL的標準和規範的方法,而且,在.NET框架中也沒有提供0penGL API的接口。目前在C#中可以通過CsGL等第三方軟件進行OpenGL建模的技術,也可以基於Tao技術,因爲Tao Framework提供了許多基於.NET和Mono的庫,它是由美國華盛頓大學分佈式對象計算組織開發的開放源碼的CORBA(通用對象請求代理體系結構)產品,它實現了C0RBA2.6規範中的說明。因此,我們利用Tao框架實現在C#中進行OpenGL建模的方法[7]。

2.4 使用SharpGL擴展庫

SharpGL是C#對OpenGL庫的封裝,是一個方便我們在Windows窗體中和WPF中使用OpenGL的擴展庫,它能夠設置一個強大的場景圖和Visual Studio模板。SharpGL擴展庫包裝了所有當前的OpenGL函數,所有主要的擴展和一套豐富的先進功能的對象,並且能夠將代碼移植到其它的平臺中,所以我們使用它很容易開發出3D圖形程序。它的命名空間包括: