陳軍任,王艷紅
(1.沈陽工業大學信息科學與工程學院,沈陽 110870;2.沈陽工業大學管理學院,沈陽 110870)
隨著科技發展,人們對加工速度以及加工質量有了更高的要求,STL 的可視化技術在應用中占據了很大的比重。STL 的可視化技術就是將3D 掃描的STL 文件快速轉化為可視化的三維模型,便利于人們對其進行人機交互等操作,提高加工速率及精確度。研究者對于STL 的可視化進行了大量的研究,占志敏[1]等結合OpenGL 圖形編程技術,成功實現STL 三維模型的可視化,其算法簡單,只是經過簡單的冗余處理及拓撲關系。鄭毅[2]使用C++標準模板庫和迭代器技術進行編程,借助紅黑樹結構,加快了拓撲重建任務,但沒有實現三維顯示及人機交互。鄒學涌[3]等采用基于哈希表的拓撲重建算法,并借助了OpenGL 顯示技術,實現顯示效果及信息獲取,該算法中哈希函數的設定對算法效率影響較大,設置不當會使效率大幅降低。尚旭明[4]利用WPF 及XAML技術實現了對3ds Max 模型的顯示及簡單人機交互。Tata[5]等人提出了一種自適應分層算法,可以根據局部幾何形狀改變層厚,算法基于三個基本概念:選擇適應曲面復雜性的準則、識別對象的關鍵特征和物體特征,以及開發用于表示對象的facet 的分組方法。Choi[6]等人提出了一種用于分層制造的切片輪廓處理的容錯切片算法,該算法旨在克服計算機內存的限制和傳統切片方法所固有的計算不穩定性。Brown[7]等人運用切片算法實現了能夠處理和切割一個或多個STL 文件。
在此,針對上述研究成果的不足及可行之處,并結合某機械加工企業的實際需求,提出一種基于WPF 的STL 系統可視化設計方案,通過建立WPF模型數據,對直接導入的STL 文件模型進行轉化,對模型頂點、邊、以及三角片面進行拓撲關系建立,生成三維模型,從而確定模型特征,在此基礎上,利用WPF 的3D 顯示模塊將三維模型顯示出來,進而實現STL 文件對應模型的旋轉、縮放、平移等人機交互功能。
系統主要由STL 文件分析處理、算法研究實現、人機交互三個主要功能組成。
研究STL 文件格式,分析不同格式間的共同性,對STL 文件進行結構分析,探究其更合適的拓撲關系。
針對對STL 文件的分析,設計STL 文件的讀取儲存方式,給出STL 文件可視化實現算法流程圖。
首先利用WPF 的3D 模塊搭建可顯示3D 效果的場景,然后利用給出的算法處理STL 文件,在3D場景中顯示,最后針對可視化的模型進行可操作化設計。
系統整體結構圖如圖1所示。

圖1 系統整體結構圖
STL 格式文件以三角形面為單位記錄了每個三角形的簡單幾何信息,每個三角形面都包含該三角形所在平面的法向矢量以及三角形的三個頂點坐標。目前為止,STL 文件有文本(ASCII)和二進制(BINARY)兩種格式[8]。
ASCII 格式的STL 文件逐行給出三角形面片的幾何信息,每一行由1 個或2 個關鍵字開頭。在STL文件中一個帶矢量方向的三角形面片是由三角形面片的信息單元facet 來表述的,每一個facet 由7 行數據組成。
關鍵字facet normal 后面給出三個數是三角面指向實體外部的法向矢量坐標;
outer loop 隨后的3 行數據分別是三角面的3個頂點坐標;
end loop 表示完成三角形面片的3 個頂點坐標定義;
end facet 表示完成一個三角形面片定義;
end solid 表示整個STL 文件定義結束,由若干個三角形面片的信息單元facet 構成整個STL 文件格式模型,3 個頂點沿指向實體外部的法矢方向逆時針排列。
二進制STL 文件用固定的字節數來給出三角面片的幾何信息。
文件起始的80 個字節是文件頭,用于存貯文件名,緊接著用4 個字節的整數來描述模型的三角面片總數,后面逐個給出每個三角面片的幾何信息。每個三角形面片占用固定的50 個字節,依次是:
3 個4 字節浮點數,表示三角面法矢量;
3 個4 字節浮點數,表示三角面片第一個頂點坐標;
3 個4 字節浮點數,表示三角面片第二個頂點坐標;
3 個4 字節浮點數,表示三角面片第三個頂點坐標;
最后2 個字節為預留字,一般表示屬性特征。
一個完整的二進制STL 文件的大小為三角面的個數乘以50 再加上84 個字節。
其實不管何種的格式的STL 文件,一個基本的三角片中,都包括了三角片的法向量normal 以及三個頂點的三維坐標vertex 等信息。憑借這些信息都可以唯一確定一個三角片,進而確定完整的三維曲面模型。為更好分析STL 文件結構,以下給出部分STL 文件結構圖,如圖2所示。

圖2 STL 文件局部結構示意圖
根據圖2所示,假設頂點所對應的邊以及邊的兩個相鄰的邊為鄰接邊,那么在三角形ABC 中,點A 的鄰接邊是a,邊a 在該三角形中的鄰接邊分別為邊b 和邊c。但是這只是一個三角形的頂點以及鄰接邊信息,STL 文件所表示的是n 個三角片的信息,其中會有很多相同的頂點以及鄰接邊。經過觀察可以得到一個頂點最多可以達到6 個鄰接邊,最少有4 個。而邊的鄰接邊最多可以有4 個鄰接邊,最少2 個。由此可見,若只是簡單地減少冗余量提升打開文件的速度,直接處理點的冗余就可以實現,但是如果要進行后續的操作,邊的信息也是非常重要的一部分,例如后續在線建模和NC 代碼自動生成等。故此不能只處理點的冗余,也須處理邊的冗余,然后建立點與鄰接邊、邊與鄰接邊的拓撲關系。
儲存STL 文件信息時,并不能簡單地儲存點、邊以及三角片的信息,還需要儲存它們各自的鄰接邊信息。通過研究還可發現,雖然每三個頂點可以確定唯一的三角片,但是不同的三角片有可能用到相同的頂點以及相同的鄰接邊,這樣就極大地浪費了儲存空間以及處理速度。所以為了存取方便,避免點和邊的重復存取,設計給每個點和邊一個專用的ID號,依據讀取的順序,設計點和邊的ID 號從0 開始依次遞增。這樣就便于在存取的過程中同時也可以剔除重復的頂點和邊信息,進而能夠大幅度提高存取效率,節省儲存空間及讀取時間。
為此,需要建立三個容器分別來儲存頂點、邊和三角片的數據集合。三維頂點的屬性包含頂點的三維坐標,以及頂點的鄰接邊和頂點的專用ID;邊的屬性包含邊的位置信息(兩個頂點)、邊的鄰接邊的序號的集合以及邊的ID 號;三角片容器屬性包含三角形的頂點、邊和法矢量信息。容器結構示意圖如圖3所示。

圖3 容器結構示意圖
憑借頂點和邊的鄰接關系,完全可以確定網格模型各三角面片之間的連接關系。由一個頂點出發,可根據其鄰接邊獲取包含該頂點的所有三角形;由產生的鄰接邊,可分別獲取它們自身的鄰接邊組合。如此循環擴展,直到擴展到整個網格模型為止。然后把STL 文件中的三角片的法矢量信息儲存到建立的三角片容器中,這樣由以上三個容器的建立就可以獲取STL 文件中的所有信息并建立起基本圖元之間的鄰接關系。簡易的演示過程如圖4所示。

圖4 三角片拓展關系演示圖
參考圖2的設定,具體算法流程可如圖5所示。

圖5 STL 可視化算法流程圖
如圖,假設先讀取三角片ABC,首先讀取三角片三個頂點的信息,然后按照上述建立的鄰接邊關系,分別將三角片ABC 的頂點信息儲存到頂點容器中,設置點信息ID 號以及點對應的鄰接邊ID 號;然后把邊的信息儲存到邊容器中,設置邊信息ID 號以及邊所對應的鄰接邊ID 號;最后在三角片容器中儲存三角片三個頂點ID 以及法矢量信息。接下來讀取三角片BDC,首先判斷三角片BDC 的三個頂點以及邊是否被處理(判斷依據是用頂點的三維坐標值與已儲存在容器中的三維坐標值相比較),若被處理,將不再處理此信息不同的保留作為下一個處理頂點,然后將欲處理的點邊信息分別儲存到對應的容器中,且添加鄰接邊關系。往后的三角片按照上述方法處理,直到達到文件的末尾位置為止。
對可視化模型進行操作化設計,可直觀地看出所打開的STL 文件是否有缺陷,并為實現后續在線建模提供操作基礎。目前大多數研究者利用C++語言跟OpenGL 或者3ds Max 結合實現3D 模型顯示功能,但此方法實際操作性復雜。在此利用XAML技術WPF 框架來實現系統3D 模型顯示功能。XAML 技術提供了一種便于擴展和定位的語法來定義與程序邏輯相分離的用戶界面,XAML 中界面表現和邏輯功能的分離使得界面開發和功能開發代碼分離,有利于開發團隊的合理分工,提高了開發效率。WPF 技術主要是用來實現3D 效果,使用WPF實現3D 顯示只需要設置好3D 場景,然后將需要打開的STL 文件經過算法處理就可以直接顯示。利用C#語言除了因為其與WPF 可以組合實現外,還可以避免C++語言中存在的bug。
3D 環境搭建首先需要在XAML 板塊中編寫一個Viewport3D 模塊,用來顯示打開處理的STL 文件,然后在后臺程序當中初始化顯示3D 模型的必要元素:攝像機(Camera)、光源(Light)、模型(Model)。
設置好這些3D 環境所需要的固定屬性,就可以去處理STL 文件來顯示STL 文件里面所儲存的3D 模型。主要步驟如下:
1)在編寫的系統3D 模塊中加入3DTools 工具;
2)建立世界坐標;
3)利用上文算法處理STL 文件:
①構建頂點容器,儲存頂點的三維坐標x、y、z,以及頂點的鄰接邊和頂點的專用ID;
②構建鄰接邊容器,儲存邊的位置信息(兩個頂點)、邊的鄰接邊的序號的集合以及邊的ID 號;
③構建三角片容器,儲存三角形的頂點、邊和法矢量信息;
④利用鄰接邊信息進行三維模型拓展;
⑤定義表面材質(設置Material 屬性);
最終,通過調用處理后的STL 文件,就可在系統中的3D 顯示區域實現STL 模型的可視化。可視化效果展示如圖6所示。

圖6 STL 文件可視化展示圖
主要設計旋轉、縮放、平移等三大功能。這些可通過操作模型的變化來實現,也可通過操作Camera來實現。操作模型時需要變化模型的全部坐標以及更新,而操作Camera 時只需要變化Camera 的坐標信息,故實現三大功能全部用操作Camera 來實現。
當操作Camera 時,首先需要獲得Camera 的初始位置以及模型的中心位置,然后需要設置每個功能的計算公式以及獲取的變化變量,這樣就可以得到新的Camera 坐標位置,以此實現操作功能。
1)模型中心位置獲取
在WPF 的MeshGeometry3D 中,有一個 Bounds屬性,該屬性的功能是返回MesheGeometry3D 的邊界Rect3D。Rect3D 表示一個三維矩形,也就是模型的外切矩形。由此信息可以得到外切矩形的三條邊長分別為SizeX、SizeY、SizeZ,并且可以得到模型的中心位置(SizeX,SizeY,SizeZ),同時可以計算外切圓半徑,計算公式為:

通過初始設置時可以得到Camera 最初的坐標位置為(x0,y0,z0),這樣可以得到Camera 到模型中心距離為a,其計算公式為:

2)旋轉功能設計
旋轉功能除了中心位置的獲取,還需要旋轉半徑及旋轉角度。旋轉角度可通過鼠標的控制來獲取。旋轉半徑首先比較a 與r 的大小,當a 大于r 時選取a 為旋轉半徑,否則選r。此舉主要是為防止Camera 旋轉時進入模型內部出錯。
3)縮放功能設計
采取向量比例的算法來實現模型縮放功能,根據鼠標轉輪采集的縮放信息進行縮放。設縮放大小為d,縮放后新的Camera 位置可如下式計算得到:

4)平移功能設計
通過計算模型中心位置與期望移動位置的偏差,來確定新的Camera 位置坐標,實現模型的平移功能。
為測試上述構建的方法及所開發系統的有效性,選用某企業實際加工中的一些STL 文件,分別對期文本和二進制兩種格式的STL 文件進行測試。結果表明,系統實現了兩種STL 格式的可視化,并且可以通過人機交互實現模型的旋轉、縮放、平移。系統操作簡單、反應速度快。具體測試效果如圖7。

圖7 實際測試效果展示圖
采用WPF 框架以及XAML 技術的設計方案,優化了系統實現的簡約性,實現了對STL 文件的可視化,也實現了對可視化STL 文件進行操作的功能。用鄰接邊作為STL 文件快速拓展的依據,極大減少了STL 信息的冗余量,提高了可視化速度,為后續研究中進一步處理可視化的STL 模型提供了信息基礎。