汪雨蓉
(楊凌職業(yè)技術(shù)學(xué)院機電工程分院,陜西 楊凌 712100)
Open CASCADE(簡稱OCC)是基礎(chǔ)類、建模數(shù)據(jù)、建模算法、應(yīng)用框架、可視化和數(shù)據(jù)交換6 大模塊[1-2]集于一體的一個軟件開發(fā)平臺,每個模塊由多個工具箱組成,每個工具箱由一個或者多個包組成,每個包則由若干個不同的類組成,比如一個幾何包包含點類、線類、面類等。
OCC 幾何功能豐富,擁有的開源函數(shù)庫使用免費,實現(xiàn)靈活,定義的函數(shù)算法能夠?qū)崿F(xiàn)面向?qū)ο蟮腃++編程,提供的OCAF(Open CASCADE Application Framework)能夠幫助開發(fā)人員通過搭建算法框架,從底層完成二維或三維模型的建模、各種曲線建模、各種曲面建模、布爾運算、模型標(biāo)準(zhǔn)化、模型顯示等功能,實現(xiàn)CAD/CAM/CAE 技術(shù)相關(guān)的快速開發(fā),為用戶使用和開發(fā)提供便利服務(wù)。但目前沒有專門針對該函數(shù)庫的學(xué)習(xí)書籍,開發(fā)難度相對較大,需要熟練運用相應(yīng)的程序開發(fā)工具,如C++,并能夠清楚了解如圖1 所示的結(jié)構(gòu)模塊。
用戶追求現(xiàn)代產(chǎn)品的外觀美感,使得自由曲面的設(shè)計生產(chǎn)應(yīng)運而生,但在實際工程中,高自由度和變化多樣的形狀對曲面的應(yīng)用增加了相當(dāng)?shù)碾y度,其中曲面上某點的法向量計算是自由曲面應(yīng)用的關(guān)鍵。學(xué)者們通常采用傳統(tǒng)的數(shù)學(xué)微分幾何法[3]、離散三角形面片法和棱邊分裂法[4]等研究曲面某點的法線方向。李都寧等[5]結(jié)合微分幾何法、曲面的離散化三角形法和Open CASCADE 中的曲面屬性,分析Open CASCADE 曲面法線方向的計算方法。本文運用OCC 函數(shù)庫,在OCC 和C++搭建的軟件平臺上用邊界表達法構(gòu)造B 樣條曲面,分析B 樣條曲面的曲率特征,根據(jù)高斯曲率在曲面上取點,計算該點的法向量,設(shè)計了自由曲面法向量計算算法,為自由曲面法向量的精確計算提供了可行思路如圖1 所示。
圖1 OCC 結(jié)構(gòu)模塊
OCC 函數(shù)庫中,建模數(shù)據(jù)模塊的Geom 幾何包,提供了能夠表達三維空間曲面及數(shù)學(xué)計算的各種幾何曲面類,主要包括有界曲面類Geom_BoundSurface,簡單曲面類Geom_ElementarySurface,偏置曲面類Geom_OffsetSurface,掃略曲面類Geom_ElementarySurface 等。文章用面向?qū)ο蟮木幊趟枷?,使用有界曲面類的子類Geom_BSplineSurface 研究自由曲面的法向量。
OCC 構(gòu)造的曲面對象是用邊界表示法表達的B樣條曲面(如圖2 所示),通常不采用有界曲面類生成B 樣條曲面,而是通過其他方法,比如通過建模算法模塊的幾何工具GeomAPI 類包,使用幾何造型算法類GeomAPI_PointsToBSplineSurface 輸入點組,以參數(shù)驅(qū)動構(gòu)造B 樣條曲面,再調(diào)用有界曲面類Geom_BSplineSurface 的方法訪問B 樣條曲面的屬性。建模算法模塊的拓撲算法包BRepBuilderAPI 提供了BRep 拓撲數(shù)據(jù)結(jié)構(gòu)的應(yīng)用程序編程接口,可將幾何對象轉(zhuǎn)換成拓撲對象,構(gòu)造出建模數(shù)據(jù)模塊TopoDS 拓撲類包的對象,形成拓撲數(shù)據(jù)結(jié)構(gòu),再通過數(shù)據(jù)交換模塊后實現(xiàn)構(gòu)造模型的可視化。
圖2 OCC 構(gòu)造的B 樣條曲面
自由曲面法向量計算算法主要包括三維曲面造型、曲面上取點、計算點的法向量等,算法的實現(xiàn)流程如圖3 所示。
圖3 算法實現(xiàn)流程
首先,利用OCC 函數(shù)庫和微軟基礎(chǔ)類庫(MFC)框架在C++環(huán)境中搭建一個系統(tǒng)開發(fā)平臺;其次,通過該平臺選擇曲面類型,可以在軟件平臺讀入其他造型軟件生成的各種格式的三維模型,也可以根據(jù)OCC 的建模算法模塊,選擇合適的建模類函數(shù)在平臺上輸入驅(qū)動參數(shù)構(gòu)造模型,結(jié)合可視化模塊顯示出B 樣條曲面模型;然后,根據(jù)曲面模型的區(qū)域特征提取曲面點,計算曲面點的法向量并輸出。
在Visual Studio 編程環(huán)境中,基于Open CASCADE 函數(shù)庫,應(yīng)用OCC 提供的OCAF 應(yīng)用框架搭建開發(fā)系統(tǒng)平臺。OCC 搭建的系統(tǒng)平臺主要包括框架的搭建、功能界面的可視化和基本幾何功能的開發(fā)。開發(fā)的系統(tǒng)界面如圖4 所示,由上至下依次包括主框架、主菜單、快捷菜單欄、工具欄、顯示區(qū)和狀態(tài)欄,主菜單包含若干子菜單,開發(fā)者可以在該系統(tǒng)的已有框架中添加新功能,并在主菜單的下拉子菜單里使用相應(yīng)的功能命令。
圖4 OCC 開發(fā)的系統(tǒng)界面
算法實現(xiàn)流程中,可以通過讀入各種格式的模型獲取曲面,也可通過構(gòu)造函數(shù)生成自由曲面。OCC 繪制曲面模型,需要調(diào)用函數(shù)庫提供的曲面構(gòu)造類函數(shù)GeomAPI_PointsToBSplineSurface,輸入一個點組arr,通過訪問實現(xiàn)方法輸出B 樣條曲面。為便于研究,考慮曲面的一般性,B 樣條曲面參數(shù)u、v 的取值范圍設(shè)為單位正方形,即0≤u≤1,0≤v≤1。實現(xiàn)圖2 所示的曲面模型,構(gòu)造的主要內(nèi)容有以下3 點。
(1)定義生成曲面的點組。根據(jù)需要聲明一個4×4 的二維數(shù)組變量,用數(shù)學(xué)工具箱的gp 包定義空間坐標(biāo)點,數(shù)組變量調(diào)用設(shè)置數(shù)值的函數(shù)來定義變量中的每一個元素。
(2)點組構(gòu)造幾何曲面。調(diào)用GeomAPI 包提供的點組構(gòu)造曲面的函數(shù),在公差E 允許范圍內(nèi),通過二維點組無限逼近或插值方式擬合構(gòu)建B 樣條曲面。該類的對象提供了一個框架:定義要構(gòu)建B樣條曲面的數(shù)據(jù),實現(xiàn)近似算法或插值算法,并返回結(jié)果。本文在構(gòu)造函數(shù)輸入點組參數(shù)時,設(shè)置E=1.0e-6,每個逼近點處至少二階連續(xù)可導(dǎo)。
(3)幾何對象轉(zhuǎn)換為拓撲對象。拓撲算法包BRep-BuilderAPI 將抽象拓撲類與幾何信息關(guān)聯(lián)起來,給定計算精度Tol(文中設(shè)定:Tol=1.0e-3),為BRep 拓撲數(shù)據(jù)結(jié)構(gòu)提供數(shù)據(jù)轉(zhuǎn)換接口,便于添加到應(yīng)用程序交互環(huán)境中實現(xiàn)對象的可視化。
主要算法代碼:
TColgp_Array2OfPnt arr(1,4,1,4);//聲明生成曲面的二維數(shù)組變量
arr.SetValue(1,1,gp_Pnt(0,0,0));//調(diào)用成員函數(shù)設(shè)置數(shù)組變量中的元素
…
GeomAPI_PointsToBSplineSurface PntToSurf(arr,3,8,GeomAbs_C2,1.0e-6);//輸入點組,設(shè)置參數(shù),函數(shù)構(gòu)造類的對象
Handle (Geom_BSplineSurface) BSplineSurf=PntToSurf.Surface();//調(diào)用成員函數(shù)構(gòu)建B 樣條曲面BRepBuilderAPI_MakeFace MakeF(BSplineSurf,1.0e-3);//B 樣條曲面構(gòu)造拓撲類的對象
TopoDS_Face aFace=MakeF.Face();//調(diào)用函數(shù)構(gòu)建拓撲曲面
Handle (AIS_Shape) ais_Face=new AIS_Shape(aFace);//拓撲曲面添加到應(yīng)用程序交互環(huán)境中
接3.2 節(jié),構(gòu)造如圖2 所示B 樣條曲面具有一般性,包含凹、凸、鞍、平四種不同的區(qū)域。根據(jù)微分幾何,曲面上一點P 的高斯曲率K 定義為該點最大最小主曲率Kmax和Kmin的乘積,兩者的平均數(shù)定義為點P 的平均曲率M,K 和M 的數(shù)值符號決定曲面的區(qū)域類型。若K>0 且M<0,則曲面為凸區(qū)域;K>0且M>0,則曲面為凹區(qū)域;K≤0,則曲面為鞍區(qū)域。方法流程如下:
(1)定義雙重for 循環(huán)遍歷曲面的2 個參數(shù)U、V,確定對應(yīng)點的參數(shù)值。
(2)調(diào)用計算幾何曲面屬性的類GeomLProp_SLProps,輸入3.2 節(jié)構(gòu)造的B 樣條幾何曲面對象和本節(jié)(1)中確定的參數(shù)U、V,并設(shè)置允許誤差E=1.0e-6,用此類的構(gòu)造函數(shù)定義用于計算對應(yīng)點曲率值的對象。用構(gòu)造對象調(diào)用類的成員函數(shù)GaussianCurvature(),計算該點的高斯曲率K,調(diào)用函數(shù)MeanCurvature()計算平均曲率M;
(3)判別高斯曲率和平均曲率的數(shù)值符號。
if(K≤0)then 曲面區(qū)域為鞍型特征;
else if(M>0)then 曲面區(qū)域為凹特征;
else if(M<0)then 曲面區(qū)域為凸特征;
else 曲面區(qū)域為平特征。
(4)根據(jù)(3)中已判別的區(qū)域特征(如圖5 所示),分區(qū)域遍歷曲面點,計算點的法向量。此處列舉凸區(qū)域的取點(如圖6 所示),繼續(xù)應(yīng)用(2)中GeomLProp_SLProps 類構(gòu)造的對象,調(diào)用其成員函數(shù)Normal()定義一點的法向量,返回向量的三個坐標(biāo)值(如圖7 所示)。
圖5 判別區(qū)域類型
圖6 凸區(qū)域取點
圖7 曲面一點的法向量坐標(biāo)值
基于Open CASCADE 開源函數(shù)庫,利用OCAF向?qū)Э蚣茉贑++編程環(huán)境中從底層搭建OCC 開發(fā)系統(tǒng)平臺,通過輸入輸出接口導(dǎo)入選定格式的曲面,或者在搭建平臺上調(diào)用建模算法直接構(gòu)造B 樣條曲面模型,再根據(jù)曲面的高斯曲率和平均曲率判別區(qū)域特征,分區(qū)域取點計算法向量,完成自由曲面法向量計算算法的設(shè)計。文章研究對豐富OCC 函數(shù)庫和探究自由曲面的屬性提供了便利,也為其他相關(guān)建模研究提供參考思路。