劉國偉, 賈慶軒, 孫漢旭, 宋荊洲, 高 欣
(北京郵電大學(xué)自動(dòng)化學(xué)院,北京 100876)
目前,國內(nèi)外不少研究機(jī)構(gòu)及大型企業(yè)都在虛擬裝配技術(shù)研究方面取得了很大的成就,如美國華盛頓大學(xué)與美國國家標(biāo)準(zhǔn)技術(shù)研究所合作開發(fā)了虛擬裝配設(shè)計(jì)環(huán)境(Virtual Assembly Developmen Environment, VADE)[1]; 德 國Bielefeld 大學(xué)致力于將虛擬現(xiàn)實(shí)交互技術(shù)與人工智能技術(shù)結(jié)合,開發(fā)了基于指示的虛擬裝配系統(tǒng)CODY;浙江大學(xué)開發(fā)了基于拆卸的虛擬設(shè)計(jì)與虛擬裝配系統(tǒng)(Virtual Design and Virtual Assembly System, VDVAS)[2];清華大學(xué)提出并實(shí)現(xiàn)了一種并行環(huán)境下裝配仿真系統(tǒng)(Assembly Simulation System, ASML S),該系統(tǒng)能在產(chǎn)品設(shè)計(jì)階段實(shí)施數(shù)字化預(yù)裝配以驗(yàn)證和改進(jìn)裝配工藝[3]。上述關(guān)于虛擬裝配的研究各具特色,但都不很成熟。在虛擬裝配系統(tǒng)中,為了減少計(jì)算量提高實(shí)時(shí)性,零件實(shí)體通常通過簡化的多邊形面片模型描述。采用三角形面片模型進(jìn)行零件信息表達(dá)有以下優(yōu)點(diǎn)[4]:能夠減少計(jì)算量,提高虛擬裝配系統(tǒng)的實(shí)時(shí)性;為虛擬裝配系統(tǒng)處理異構(gòu)CAD 系統(tǒng)的零件對象提供了可能。但與此同時(shí),采用三角形面片模型進(jìn)行零件表達(dá)也帶來損失了精確幾何信息與拓?fù)湫畔⒁约按罅抗こ淘O(shè)計(jì)信息等問題?,F(xiàn)在通用的方法是采用傳統(tǒng)的三維CAD 商品化軟件進(jìn)行產(chǎn)品的建模,然后對CAD 模型數(shù)據(jù)進(jìn)行轉(zhuǎn)換,并通過對三維CAD 商品化軟件的二次開發(fā)來獲得含有零件裝配信息的中性文件,一起導(dǎo)入到虛擬裝配系統(tǒng)中完成虛擬裝配環(huán)境下的零部件建模[5]。
但此種方式有個(gè)致命的缺陷就是針對有約束關(guān)系而尚未在建模軟件中實(shí)現(xiàn)裝配的零件無法實(shí)現(xiàn)虛擬裝配功能,比如標(biāo)準(zhǔn)件等常用的零件。因?yàn)槎伍_發(fā)得到的中性文件,記錄的只是在建模軟件中已經(jīng)實(shí)現(xiàn)了裝配的零件的裝配信息。而對已經(jīng)實(shí)現(xiàn)了在建模軟件下裝配的零件,在VR 環(huán)境下完成虛擬裝配只是增加了視覺效果和交互感,并沒有對縮短新產(chǎn)品的開發(fā)周期,減少成本起到直接的作用,因此其必要性與應(yīng)用領(lǐng)域均受到了質(zhì)疑。并且針對大量模型中性文件的信息過于冗余不便于對信息的管理。
針對上述缺陷本文采用三維模型數(shù)據(jù)庫來存儲(chǔ)裝配模型及其裝配信息,實(shí)現(xiàn)對模型的虛擬裝配,拓寬虛擬裝配的應(yīng)用領(lǐng)域。
SQL3.0 作為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,提供了一種新的字段類型 LOB(Large Objects Binary—二進(jìn)制對象),它是用來存儲(chǔ)大量的二進(jìn)制和文本數(shù)據(jù)的一種數(shù)據(jù)類型。其中的BLOB 類型適用于存儲(chǔ)海量的二進(jìn)制數(shù)據(jù),如圖像、視頻、音頻等格式的文件,Oracle 將不同類型的三維模型文件和紋理文件均以二進(jìn)制格式存儲(chǔ)在BLOB字段中,實(shí)現(xiàn)三維模型的數(shù)據(jù)庫存儲(chǔ)。通過Oracle數(shù)據(jù)庫軟件的工具 Database Configuration Assistant 建立數(shù)據(jù)庫并通過工具 Enterprise Manager Console 創(chuàng)建表。
空間和數(shù)據(jù)表如表1 所顯示。
表1 數(shù)據(jù)表
該表設(shè)計(jì)了BLOB 類型數(shù)據(jù)用于存儲(chǔ)模型的二進(jìn)制流。因?yàn)?,三維模型對應(yīng)的紋理圖像是獨(dú)立于模型之外的,因此,數(shù)據(jù)庫關(guān)系表中分別設(shè)計(jì)了模型與紋理的二進(jìn)制的存儲(chǔ)字段(BLOB)來分別存儲(chǔ)模型數(shù)據(jù)與紋理數(shù)據(jù)。同時(shí),為了提高管理和查詢、檢索的效率,還設(shè)計(jì)了模型類型和模型名稱字段。而針對虛擬裝配系統(tǒng)中需要的模型約束信息和模型的關(guān)鍵參數(shù),在表格中定義了相應(yīng)的字段來存儲(chǔ)。對存儲(chǔ)在數(shù)據(jù)庫中的三維模型,采用Oracle 數(shù)據(jù)庫進(jìn)行存儲(chǔ)管理,可以方便的對模型進(jìn)行更新、查詢檢索,解決了三維模型的管理問題。通過構(gòu)建多個(gè)模型類模塊,從而實(shí)現(xiàn)了對目前虛擬現(xiàn)實(shí)中最為常用的VT(Vtree使用的文件格式)與FLT(OpenFlight 使用的文件格式)格式模型的支持。
OO4O 是Oracle 公司推出的一個(gè)基于COM的數(shù)據(jù)庫連通性工具, 它能夠無縫地聯(lián)合并優(yōu)化對Oracle 數(shù)據(jù)庫的訪問。OO4O 由一個(gè)進(jìn)程內(nèi)自動(dòng)化服務(wù)器、一個(gè)Oracle 數(shù)據(jù)控件和OO4O 庫類組成。在Visual C++環(huán)境下使用OO4O 來訪問Oracle 數(shù)據(jù)庫是通過OO4O C++類庫實(shí)現(xiàn)的, 它封裝了訪問Oracle 數(shù)據(jù)庫的一系列類。雖然這些類是通過OLE 技術(shù)實(shí)現(xiàn)的[6],但C++開發(fā)人員可以在程序中直接使用它們而不必需要OLE 的知識(shí)。OO4O C++類庫完全支持對LOB 大對象的操作。提供了ODatabase、ODynaset、OBlob、OClob、OBfile、OException 六個(gè)類,使用這六個(gè)類的方法就可以方便地實(shí)現(xiàn)對LOB 的訪問。
其實(shí)現(xiàn)BLOB 讀取的函數(shù)為:
m_odb.Open(m_session,lpdbname,lpUserID,lpPsw) //建立數(shù)據(jù)庫連接,lpdbname 為數(shù)據(jù)庫名,lpUserID 為用戶名,lpPsw 為用戶密碼
oblob.Read(&status, buffer, bufsize); 讀取數(shù)據(jù)
oblob.Write(buffer, amtread, piecetype); 寫入數(shù)據(jù)
VT 與FLT 數(shù)據(jù)格式都是一種邏輯化的有層次的景觀描述數(shù)據(jù)庫。每一個(gè)VT 或FLT 文件都有一個(gè)數(shù)據(jù)庫結(jié)構(gòu)用以組織可視數(shù)據(jù)庫到邏輯組中,幫助形成有實(shí)時(shí)功能的函數(shù),如視野精選(culling),LOD 切換和實(shí)例化。數(shù)據(jù)庫里的每個(gè)節(jié)點(diǎn)類型都有數(shù)據(jù)屬性[7]。主要的節(jié)點(diǎn)類型如下:
Database Header(數(shù)據(jù)庫頭) 由fltHeader記錄代碼標(biāo)記。頭節(jié)點(diǎn)是文件的根節(jié)點(diǎn),描述了數(shù)據(jù)庫層次和樹結(jié)構(gòu)的根。每個(gè)數(shù)據(jù)庫文件只有一個(gè)頭節(jié)點(diǎn)。
Group(組) 由fltGroup 記錄代碼標(biāo)記。組節(jié)點(diǎn)代表邏輯的數(shù)據(jù)庫子集合。
Object(* 對象) 由fltObject 記錄代碼標(biāo)記。對象節(jié)點(diǎn)包含了多邊形的邏輯集合。
Polygon(多邊形) 由fltPolygon 記錄代碼標(biāo)記。多邊形節(jié)點(diǎn)描述了幾何體。
Nested Polygon(嵌套多邊形) 嵌套多邊形是在它的父節(jié)點(diǎn)上繪制的共面的多邊形節(jié)點(diǎn)。
Mesh(網(wǎng)格) 由fltMesh 記錄代碼標(biāo)記。網(wǎng)格定義了一系列相關(guān)的多邊形,每一個(gè)都共享通用的屬性和頂點(diǎn)。一個(gè)FLT 數(shù)據(jù)庫的層次結(jié)構(gòu)被作為一個(gè)文件存儲(chǔ)在磁盤上。文件由線性的二進(jìn)制流記錄組成。字節(jié)在文件中的存儲(chǔ)順序是按照Big Endian 方式存儲(chǔ)的。
由于直接用二進(jìn)制讀取VT或FLT數(shù)據(jù)庫所需的工作量較大,因此Multigen-Paragim公司提供了一個(gè)函數(shù)庫Open Flight API,以便于用戶對三維模型進(jìn)行開發(fā)。在本接口實(shí)現(xiàn)中主要用到讀取函數(shù)來遍歷獲取用于存儲(chǔ)FLT 模型數(shù)據(jù)庫中的信息。主要用到的函數(shù)如下:
打開/ 關(guān)閉數(shù)據(jù)庫:m_odb.Open();m_odb.Close();
遍歷數(shù)據(jù)庫: mgGetChile,mgGetNext
獲取數(shù)據(jù)庫中的紋理參數(shù):mgGetTextureCount,
mgGetFirstTexture,mgGetNextTexture。
獲取多邊形紋理索引:mgGetAttIndex。
獲取多邊形材質(zhì)參數(shù):mgGetMaterialElem。
獲取多邊形頂點(diǎn)坐標(biāo)參數(shù):mgGetVtxCoord。
獲取多邊形頂點(diǎn)法向量參數(shù):mgGetVtxNormal。
獲取多邊形頂點(diǎn)紋理坐標(biāo)參數(shù):mgGetAttList。
本軟件的定位在獲取三維實(shí)體的頂點(diǎn)坐標(biāo)、頂點(diǎn)法向量、材質(zhì)、紋理等幾何、渲染信息并正確顯示。接口程序?qū)崿F(xiàn)的整體思路是獲取數(shù)據(jù)庫中所有多邊形的信息,這些信息包括多邊形紋理、材質(zhì)、各頂點(diǎn)坐標(biāo)、法向量和紋理坐標(biāo),然后將這些信息存在一個(gè)多邊形鏈表結(jié)構(gòu)中,為了程序編寫的方便,這里為了實(shí)現(xiàn)的方便,利用了基于Open Gl開發(fā)的Vtree軟件包來實(shí)現(xiàn)VT及FLT模型文件的顯示,省去了自己設(shè)計(jì)函數(shù)的步驟。其核心代碼如下:
讀取模型文件
裝配由組成裝配體的單個(gè)零件及它們之間的裝配關(guān)系組成。對于裝配中零件之間的匹配關(guān)系的交互設(shè)置表達(dá)大多用邊界表示法(B-rep)。在裝配關(guān)系中,參與裝配的幾何圖元(點(diǎn)、線、面等)根據(jù)形狀一般可分為直線、曲線、平面、曲面等,在機(jī)械零件中常用的有直線、平面、柱面等。零部件中常用的裝配約束關(guān)系主要包括:零部件上參與裝配的兩個(gè)幾何圖元之間指定一定的距離、指定一定的角度和重合三種情況。本文討論的幾何圖元包括平面、圓柱面和直線。約束關(guān)系包括平面與平面之間的共面約束、角度約束和距離約束;圓柱面之間同軸約束關(guān)系和直線與其他線或面之間的距離、重合等約束關(guān)系。并將約束關(guān)系作為一個(gè)屬性存儲(chǔ)在數(shù)據(jù)庫的列中,如圖3 所示。
系統(tǒng)從模型數(shù)據(jù)庫中讀取所有FLT模型數(shù)據(jù),填充到當(dāng)前視圖中。本軟件利用MFC編制的單文檔視圖程序框架,并利用Vtree生成了裝配場景視圖。軟件從數(shù)據(jù)庫中通過OO4O函數(shù)讀出模型和紋理二進(jìn)制文件,然后按照VT與FLT模型的類型,調(diào)用Vtree中的模型讀取函數(shù),讀出模型的所有數(shù)據(jù)信息,調(diào)用對應(yīng)輸出函數(shù)輸出到虛擬裝配場景視圖中,進(jìn)行干涉檢查和約束識(shí)別,其系統(tǒng)流程和系統(tǒng)結(jié)構(gòu)分別如圖1和圖2所示。
圖 1 虛擬裝配系統(tǒng)流程
圖 2 虛擬裝配系統(tǒng)結(jié)構(gòu)
裝配體的CAD 模型通過Pro/ Engineer 2001 和UGV18.0 建立,并通過Multigen Creator 轉(zhuǎn)成FLT 格式文件或進(jìn)一步用OpenFlightVTree 將其轉(zhuǎn)化為VT 格式文件存儲(chǔ)在數(shù)據(jù)庫中,CAD 模型的約束信息由人為定義并存儲(chǔ)在數(shù)據(jù)庫中,存儲(chǔ)界面如圖3 所示。
圖3 數(shù)據(jù)庫操作界面
模型通過數(shù)據(jù)庫接口輸出到裝配場景中,如圖4 所示。系統(tǒng)會(huì)自動(dòng)提取數(shù)據(jù)庫中的裝配信息,并通過三維鼠標(biāo)實(shí)現(xiàn)在場景中的虛擬裝配,裝配結(jié)果如圖5 所示。
圖4 虛擬裝配場景
圖5 虛擬裝配界面
本文針對虛擬裝配系統(tǒng)中的模型存儲(chǔ)技術(shù)與裝配信息獲取技術(shù),提出了利用關(guān)系數(shù)據(jù)庫來存儲(chǔ)三維模型與約束信息的方案。將三維建模軟件創(chuàng)建的模型利用軟件進(jìn)行格式轉(zhuǎn)化,通過數(shù)據(jù)庫接口實(shí)現(xiàn)了FLT和VT模型在數(shù)據(jù)庫中的存儲(chǔ)與讀取功能。并解析了FLT 模型的關(guān)鍵性結(jié)構(gòu),在 VC++6.0 環(huán)境中實(shí)現(xiàn)了對模型的顯示與瀏覽功能。同時(shí)利用關(guān)系數(shù)據(jù)庫的高效管理方法,避免了基于中性文件實(shí)現(xiàn)裝配的弊端,為模型的共享、更新、查詢檢索提供了有效的保證。這些都會(huì)提高虛擬裝配技術(shù)在社會(huì)生產(chǎn)實(shí)踐中的應(yīng)用價(jià)值。
[1] JA Yaram S, JA Yaram U, Wang Y, et al . VADE: avirtual assembly design environment [J]. IEEE Computer Graphics and Applications, 1999, 19 (6): 44-51.
[2] 萬華根, 高曙明, 彭群生. VDVAS: 一個(gè)集成的虛擬設(shè)計(jì)與虛擬裝配系統(tǒng)[J]. 中國圖像圖形學(xué)報(bào), 2002, 7(1): 27-35.
[3] 張林鍹, 童秉樞, 肖田元, 等. CE 環(huán)境下裝配仿真系統(tǒng)的實(shí)現(xiàn)及應(yīng)用[J]. 計(jì)算機(jī)應(yīng)用, 2000, 8(2): 194-197.
[4] 劉振宇, 譚建榮, 張樹有. 面向虛擬裝配的產(chǎn)品層次信息表達(dá)研究[J]. 計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 2001, 13(3): 223-228.
[5] 劉檢華, 姚 珺, 寧汝新. CAD 系統(tǒng)與虛擬裝配系統(tǒng)間的信息集成技術(shù)研究[J]. 計(jì)算機(jī)集成制造系統(tǒng), 2005, 11(1): 44-47.
[6] 盧曉云. 基于VC的Oracle LOB數(shù)據(jù)庫訪問技術(shù)[J]. 計(jì)算機(jī)與網(wǎng)絡(luò), 2003, 3(3): 129-132.
[7] 羅 丹, 蔣自成, 王躍峰. OpenFlight 模型的OpenGL, 接口研究[C]//2005 全國仿真技術(shù)學(xué)術(shù)會(huì)議論文集, 2005: 402-404.