劉國偉, 賈慶軒, 孫漢旭, 宋荊洲, 高 欣
(北京郵電大學自動化學院,北京 100876)
目前,國內外不少研究機構及大型企業都在虛擬裝配技術研究方面取得了很大的成就,如美國華盛頓大學與美國國家標準技術研究所合作開發了虛擬裝配設計環境(Virtual Assembly Developmen Environment, VADE)[1]; 德 國Bielefeld 大學致力于將虛擬現實交互技術與人工智能技術結合,開發了基于指示的虛擬裝配系統CODY;浙江大學開發了基于拆卸的虛擬設計與虛擬裝配系統(Virtual Design and Virtual Assembly System, VDVAS)[2];清華大學提出并實現了一種并行環境下裝配仿真系統(Assembly Simulation System, ASML S),該系統能在產品設計階段實施數字化預裝配以驗證和改進裝配工藝[3]。上述關于虛擬裝配的研究各具特色,但都不很成熟。在虛擬裝配系統中,為了減少計算量提高實時性,零件實體通常通過簡化的多邊形面片模型描述。采用三角形面片模型進行零件信息表達有以下優點[4]:能夠減少計算量,提高虛擬裝配系統的實時性;為虛擬裝配系統處理異構CAD 系統的零件對象提供了可能。但與此同時,采用三角形面片模型進行零件表達也帶來損失了精確幾何信息與拓撲信息以及大量工程設計信息等問題。現在通用的方法是采用傳統的三維CAD 商品化軟件進行產品的建模,然后對CAD 模型數據進行轉換,并通過對三維CAD 商品化軟件的二次開發來獲得含有零件裝配信息的中性文件,一起導入到虛擬裝配系統中完成虛擬裝配環境下的零部件建模[5]。
但此種方式有個致命的缺陷就是針對有約束關系而尚未在建模軟件中實現裝配的零件無法實現虛擬裝配功能,比如標準件等常用的零件。因為二次開發得到的中性文件,記錄的只是在建模軟件中已經實現了裝配的零件的裝配信息。而對已經實現了在建模軟件下裝配的零件,在VR 環境下完成虛擬裝配只是增加了視覺效果和交互感,并沒有對縮短新產品的開發周期,減少成本起到直接的作用,因此其必要性與應用領域均受到了質疑。并且針對大量模型中性文件的信息過于冗余不便于對信息的管理。
針對上述缺陷本文采用三維模型數據庫來存儲裝配模型及其裝配信息,實現對模型的虛擬裝配,拓寬虛擬裝配的應用領域。
SQL3.0 作為關系數據庫的標準語言,提供了一種新的字段類型 LOB(Large Objects Binary—二進制對象),它是用來存儲大量的二進制和文本數據的一種數據類型。其中的BLOB 類型適用于存儲海量的二進制數據,如圖像、視頻、音頻等格式的文件,Oracle 將不同類型的三維模型文件和紋理文件均以二進制格式存儲在BLOB字段中,實現三維模型的數據庫存儲。通過Oracle數據庫軟件的工具 Database Configuration Assistant 建立數據庫并通過工具 Enterprise Manager Console 創建表。
空間和數據表如表1 所顯示。

表1 數據表
該表設計了BLOB 類型數據用于存儲模型的二進制流。因為,三維模型對應的紋理圖像是獨立于模型之外的,因此,數據庫關系表中分別設計了模型與紋理的二進制的存儲字段(BLOB)來分別存儲模型數據與紋理數據。同時,為了提高管理和查詢、檢索的效率,還設計了模型類型和模型名稱字段。而針對虛擬裝配系統中需要的模型約束信息和模型的關鍵參數,在表格中定義了相應的字段來存儲。對存儲在數據庫中的三維模型,采用Oracle 數據庫進行存儲管理,可以方便的對模型進行更新、查詢檢索,解決了三維模型的管理問題。通過構建多個模型類模塊,從而實現了對目前虛擬現實中最為常用的VT(Vtree使用的文件格式)與FLT(OpenFlight 使用的文件格式)格式模型的支持。
OO4O 是Oracle 公司推出的一個基于COM的數據庫連通性工具, 它能夠無縫地聯合并優化對Oracle 數據庫的訪問。OO4O 由一個進程內自動化服務器、一個Oracle 數據控件和OO4O 庫類組成。在Visual C++環境下使用OO4O 來訪問Oracle 數據庫是通過OO4O C++類庫實現的, 它封裝了訪問Oracle 數據庫的一系列類。雖然這些類是通過OLE 技術實現的[6],但C++開發人員可以在程序中直接使用它們而不必需要OLE 的知識。OO4O C++類庫完全支持對LOB 大對象的操作。提供了ODatabase、ODynaset、OBlob、OClob、OBfile、OException 六個類,使用這六個類的方法就可以方便地實現對LOB 的訪問。
其實現BLOB 讀取的函數為:

m_odb.Open(m_session,lpdbname,lpUserID,lpPsw) //建立數據庫連接,lpdbname 為數據庫名,lpUserID 為用戶名,lpPsw 為用戶密碼
oblob.Read(&status, buffer, bufsize); 讀取數據
oblob.Write(buffer, amtread, piecetype); 寫入數據
VT 與FLT 數據格式都是一種邏輯化的有層次的景觀描述數據庫。每一個VT 或FLT 文件都有一個數據庫結構用以組織可視數據庫到邏輯組中,幫助形成有實時功能的函數,如視野精選(culling),LOD 切換和實例化。數據庫里的每個節點類型都有數據屬性[7]。主要的節點類型如下:
Database Header(數據庫頭) 由fltHeader記錄代碼標記。頭節點是文件的根節點,描述了數據庫層次和樹結構的根。每個數據庫文件只有一個頭節點。
Group(組) 由fltGroup 記錄代碼標記。組節點代表邏輯的數據庫子集合。
Object(* 對象) 由fltObject 記錄代碼標記。對象節點包含了多邊形的邏輯集合。
Polygon(多邊形) 由fltPolygon 記錄代碼標記。多邊形節點描述了幾何體。
Nested Polygon(嵌套多邊形) 嵌套多邊形是在它的父節點上繪制的共面的多邊形節點。
Mesh(網格) 由fltMesh 記錄代碼標記。網格定義了一系列相關的多邊形,每一個都共享通用的屬性和頂點。一個FLT 數據庫的層次結構被作為一個文件存儲在磁盤上。文件由線性的二進制流記錄組成。字節在文件中的存儲順序是按照Big Endian 方式存儲的。
由于直接用二進制讀取VT或FLT數據庫所需的工作量較大,因此Multigen-Paragim公司提供了一個函數庫Open Flight API,以便于用戶對三維模型進行開發。在本接口實現中主要用到讀取函數來遍歷獲取用于存儲FLT 模型數據庫中的信息。主要用到的函數如下:
打開/ 關閉數據庫:m_odb.Open();m_odb.Close();
遍歷數據庫: mgGetChile,mgGetNext
獲取數據庫中的紋理參數:mgGetTextureCount,
mgGetFirstTexture,mgGetNextTexture。
獲取多邊形紋理索引:mgGetAttIndex。
獲取多邊形材質參數:mgGetMaterialElem。
獲取多邊形頂點坐標參數:mgGetVtxCoord。
獲取多邊形頂點法向量參數:mgGetVtxNormal。
獲取多邊形頂點紋理坐標參數:mgGetAttList。
本軟件的定位在獲取三維實體的頂點坐標、頂點法向量、材質、紋理等幾何、渲染信息并正確顯示。接口程序實現的整體思路是獲取數據庫中所有多邊形的信息,這些信息包括多邊形紋理、材質、各頂點坐標、法向量和紋理坐標,然后將這些信息存在一個多邊形鏈表結構中,為了程序編寫的方便,這里為了實現的方便,利用了基于Open Gl開發的Vtree軟件包來實現VT及FLT模型文件的顯示,省去了自己設計函數的步驟。其核心代碼如下:

讀取模型文件

裝配由組成裝配體的單個零件及它們之間的裝配關系組成。對于裝配中零件之間的匹配關系的交互設置表達大多用邊界表示法(B-rep)。在裝配關系中,參與裝配的幾何圖元(點、線、面等)根據形狀一般可分為直線、曲線、平面、曲面等,在機械零件中常用的有直線、平面、柱面等。零部件中常用的裝配約束關系主要包括:零部件上參與裝配的兩個幾何圖元之間指定一定的距離、指定一定的角度和重合三種情況。本文討論的幾何圖元包括平面、圓柱面和直線。約束關系包括平面與平面之間的共面約束、角度約束和距離約束;圓柱面之間同軸約束關系和直線與其他線或面之間的距離、重合等約束關系。并將約束關系作為一個屬性存儲在數據庫的列中,如圖3 所示。
系統從模型數據庫中讀取所有FLT模型數據,填充到當前視圖中。本軟件利用MFC編制的單文檔視圖程序框架,并利用Vtree生成了裝配場景視圖。軟件從數據庫中通過OO4O函數讀出模型和紋理二進制文件,然后按照VT與FLT模型的類型,調用Vtree中的模型讀取函數,讀出模型的所有數據信息,調用對應輸出函數輸出到虛擬裝配場景視圖中,進行干涉檢查和約束識別,其系統流程和系統結構分別如圖1和圖2所示。

圖 1 虛擬裝配系統流程

圖 2 虛擬裝配系統結構
裝配體的CAD 模型通過Pro/ Engineer 2001 和UGV18.0 建立,并通過Multigen Creator 轉成FLT 格式文件或進一步用OpenFlightVTree 將其轉化為VT 格式文件存儲在數據庫中,CAD 模型的約束信息由人為定義并存儲在數據庫中,存儲界面如圖3 所示。

圖3 數據庫操作界面
模型通過數據庫接口輸出到裝配場景中,如圖4 所示。系統會自動提取數據庫中的裝配信息,并通過三維鼠標實現在場景中的虛擬裝配,裝配結果如圖5 所示。

圖4 虛擬裝配場景

圖5 虛擬裝配界面
本文針對虛擬裝配系統中的模型存儲技術與裝配信息獲取技術,提出了利用關系數據庫來存儲三維模型與約束信息的方案。將三維建模軟件創建的模型利用軟件進行格式轉化,通過數據庫接口實現了FLT和VT模型在數據庫中的存儲與讀取功能。并解析了FLT 模型的關鍵性結構,在 VC++6.0 環境中實現了對模型的顯示與瀏覽功能。同時利用關系數據庫的高效管理方法,避免了基于中性文件實現裝配的弊端,為模型的共享、更新、查詢檢索提供了有效的保證。這些都會提高虛擬裝配技術在社會生產實踐中的應用價值。
[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: 一個集成的虛擬設計與虛擬裝配系統[J]. 中國圖像圖形學報, 2002, 7(1): 27-35.
[3] 張林鍹, 童秉樞, 肖田元, 等. CE 環境下裝配仿真系統的實現及應用[J]. 計算機應用, 2000, 8(2): 194-197.
[4] 劉振宇, 譚建榮, 張樹有. 面向虛擬裝配的產品層次信息表達研究[J]. 計算機輔助設計與圖形學學報, 2001, 13(3): 223-228.
[5] 劉檢華, 姚 珺, 寧汝新. CAD 系統與虛擬裝配系統間的信息集成技術研究[J]. 計算機集成制造系統, 2005, 11(1): 44-47.
[6] 盧曉云. 基于VC的Oracle LOB數據庫訪問技術[J]. 計算機與網絡, 2003, 3(3): 129-132.
[7] 羅 丹, 蔣自成, 王躍峰. OpenFlight 模型的OpenGL, 接口研究[C]//2005 全國仿真技術學術會議論文集, 2005: 402-404.