劉建秀
目前三維實(shí)體的模型構(gòu)造主要基于兩種內(nèi)核:ACIS和Parasolid。其中,Parasolid是一款功能強(qiáng)大的實(shí)體建模核心軟件,用邊界表示法對實(shí)體進(jìn)行幾何建模[1,3,4]。在 Parasolid 中,采用導(dǎo)動(dòng)(sweep)和放樣(loft)兩種特征造型方法進(jìn)行模型構(gòu)造。本文詳細(xì)介紹放樣函數(shù)的使用方法,在VC++6.0平臺(tái)上以MicrostationV8為CAD系統(tǒng)原型,調(diào)用Parasolid圖形內(nèi)核函數(shù)庫的放樣函數(shù)實(shí)現(xiàn)特殊實(shí)體的建模,該實(shí)例應(yīng)用于彎肘型尾水管的三維建模,并可用于其他異構(gòu)體模型構(gòu)造。
在三維建模中,放樣是基于一組有規(guī)律的輪廓,對輪廓施加一定的對應(yīng)關(guān)系或約束來獲得光滑的放樣體。因此,在放樣操作中,輪廓間點(diǎn)的對應(yīng)關(guān)系和外加約束對放樣體的精確度有決定性作用。在Parasolid函數(shù)庫中,實(shí)現(xiàn)放樣的函數(shù)是PK_BODY_make_lofted_body,其原型為:
int PK_BODY_make_lofted_body (int n_profiles,const PK_BODY_t profiles [],const PK_VERTEX_t start_vertices[],const PK_BODY_make_lofted_body_o_t*options, PK_BODY_tracked_loft_r_t*constlofted_body)
其中,前三個(gè)為輸入?yún)?shù),n_profiles為參與放樣的輪廓個(gè)數(shù);profiles[]為參與放樣的輪廓元素,如果輪廓為面元素,最終結(jié)果會(huì)生成體;如果輪廓為線元素,可以生成面;start_vertices為放樣輪廓的起始點(diǎn),記錄輪廓間起始頂點(diǎn)的匹配關(guān)系,以這些起始點(diǎn)為基準(zhǔn),按照輪廓元素中點(diǎn)的生成順序產(chǎn)生對應(yīng)關(guān)系,理論上應(yīng)該是一一對應(yīng),實(shí)際生產(chǎn)過程中,大部分情況都不是一對一的關(guān)系,具體對應(yīng)關(guān)系可見第3節(jié)的介紹;options是生成放樣體時(shí)可以自定義的一些屬性值,其內(nèi)容包括末端條件、導(dǎo)線、拓?fù)湫问?、彎曲度、精度等,是控制放樣體質(zhì)量的一個(gè)非常重要的參數(shù);lofted_body是一個(gè)輸出參數(shù),存儲(chǔ)生成的結(jié)果。
本節(jié)利用第2部分中介紹的放樣函數(shù)來生成放樣體。在函數(shù)PK_BODY_make_lofted_body中,options是決定最終三維實(shí)體質(zhì)量的關(guān)鍵參數(shù),這里重點(diǎn)介紹這個(gè)參數(shù)。
一般先利用宏定義PK_BODY_make_lofted_body_o_m對結(jié)構(gòu)體參數(shù) PK_BODY_make_lofted_body_o_t進(jìn)行初始化,將其設(shè)為默認(rèn)參數(shù),然后按需進(jìn)行個(gè)性化設(shè)置。在該參數(shù)中,需要重點(diǎn)說明的幾個(gè)成員參數(shù)是:
(1)末端條件
參數(shù)PK_BODY_loft_end_conds_t指定輪廓的末端條件,對放樣輪廓的起始和終止進(jìn)行約束使其符合形狀要求。這是一個(gè)結(jié)構(gòu)體參數(shù),可以通過設(shè)置其成員變量PK_PARAM_periodic_t的值為PK_PARAM_periodic_yes_c約定輪廓是首尾相連的,或者為PK_PARAM_periodic_no_c設(shè)置輪廓首尾不相連;另外一個(gè)成員變量PK_BODY_loft_deriv_conds_t通過首尾輪廓時(shí)的曲率限制,可取值為K_BODY_loft_unconstrained_c無約束,PK_BODY_loft_natural_c曲率為0,以及其他值如:向量約束、面約束和平面約束[2]。
(2)頂點(diǎn)匹配規(guī)則
參數(shù)PK_BODY_vertex_matches_t表示頂點(diǎn)的匹配關(guān)系,這是一個(gè)數(shù)組,存放多個(gè)體(頂點(diǎn))之間的兼容或匹配關(guān)系,其原型為:
struct PK_BODY_vertex_matches_t{int n_mappings;PK_BODY_vertex_match_t*mappings;};
在上面的結(jié)構(gòu)中,n_mappings取值為輪廓的個(gè)數(shù)減1,表示以第一個(gè)輪廓為參考,考慮其他輪廓與參考輪廓的匹配關(guān)系;PK_BODY_vertex_match_t存放當(dāng)前輪廓與其相鄰的輪廓的頂點(diǎn)匹配信息,定義如下:
struct PK_BODY_vertex_match_s{PK_BODY_t profile;int n_matches;PK_BODY_one_vertex_match_t*matches;}
其中,profile表示當(dāng)前輪廓;n_matches表示需要匹配的頂點(diǎn)個(gè)數(shù),如果前后輪廓頂點(diǎn)個(gè)數(shù)相等,取其個(gè)數(shù)即可,如果不等,取最大的;頂點(diǎn)的對應(yīng)關(guān)系存放在數(shù)組matches中,這個(gè)參數(shù)最終決定放樣體質(zhì)量,該結(jié)構(gòu)中存放著當(dāng)前輪廓的當(dāng)前頂點(diǎn)對應(yīng)著相鄰輪廓的哪一個(gè)頂點(diǎn),每個(gè)頂點(diǎn)都要設(shè)置匹配關(guān)系,可能一對一,多對一或者一對多,具體設(shè)置可見第四節(jié)中的例子。
本節(jié)基于VC++6.0軟件平臺(tái),以彎肘型尾水管的三維造型為例,來說明parasolid中放樣函數(shù)的使用。彎肘型尾水管由肘管段和出口擴(kuò)散段組成,三維建模的難點(diǎn)在于肘管段的繪制,它是一個(gè)90°轉(zhuǎn)彎的變截面彎管,進(jìn)口斷面為圓形,經(jīng)橢圓矩形截面漸變到出口處的矩形截面,首尾截面輪廓線相差較大,且肘管段尺寸難以用理論設(shè)計(jì),通常采用推薦的標(biāo)準(zhǔn)肘管尺寸,參數(shù)由水輪機(jī)制造廠家提供。圖1為制造廠家提供的尾水管單線圖,這是一個(gè)輪廓截面由圓到方漸變的尾水管模型,共20個(gè)截面,截面參數(shù)如圖1所示。
圖1 尾水管單線圖
在參數(shù)表中,BCDE四個(gè)參數(shù)確定了輪廓在右視圖中的相對位置(坐標(biāo)),offset參數(shù)確定輪廓相對于中心線的偏移量(見圖1左下頂視圖)。W和H分別為橢圓矩形的寬度和高度,Rroof、Rfloor分別為橢圓矩形上、下圓角的半徑,如圖2所示。
圖2 過渡輪廓(橢圓矩形截面)示意圖
為了生成放樣體,需要將每一個(gè)輪廓按照順序畫在以落點(diǎn)為坐標(biāo)原點(diǎn)的相對位置上,然后用放樣函數(shù)PK_BODY_make_lofted_body來生成體,將輪廓及其頂點(diǎn)分別記錄在數(shù)組profiles和vertices中,需要注意的是,輪廓形狀要嚴(yán)格按照表格中的數(shù)據(jù)來畫,例如第一個(gè)輪廓為半徑為4 600的圓,但是畫圖時(shí)需要按照圖2所標(biāo)注的各參數(shù)來畫,也即該輪廓由四個(gè)弧段組成,如圖3左圖所示,并且在畫輪廓的時(shí)候要注意每個(gè)輪廓的起始點(diǎn)和形成方向應(yīng)該一致,以保證頂點(diǎn)匹配的正確性。
圖3 輪廓示意圖
首先,對圖1表中數(shù)據(jù)進(jìn)行分析可知,末端條件中首輪廓為圓形,尾端輪廓為矩形,且不相連,所以在定義放樣參數(shù)PK_BODY_make_lofted_body_o_t options時(shí),限制其終端條件options.end_conditions.periodic=PK_PARAM_periodic_no_c;其次,分析輪廓形式可知,輪廓變化規(guī)律為圓-橢圓矩形-矩形,在下面的內(nèi)容中,為了方便討論,記“輪廓1到輪廓2的變化規(guī)律”為“輪廓1-2”,以此類推,則頂點(diǎn)匹配上有幾種情況:
(1)輪廓1-2為圓形-橢圓矩形,如圖3所示,頂點(diǎn)為4-6,屬于不同頂點(diǎn)個(gè)數(shù)的匹配;
(2)輪廓2-3為橢圓矩形-橢圓矩形(圖3右圖~圖2),頂點(diǎn)為6-8,屬于不同頂點(diǎn)個(gè)數(shù)的匹配;
(3)輪廓3-18為橢圓矩形-橢圓矩形,頂點(diǎn)為8-8,屬于相同頂點(diǎn)個(gè)數(shù)一一對應(yīng)匹配;
(4)輪廓18-19為橢圓矩形-矩形,頂點(diǎn)為8-4,屬于不同頂點(diǎn)個(gè)數(shù)的匹配;
(5)輪廓19-20為矩形-矩形漸變,頂點(diǎn)為4-4,屬于相同頂點(diǎn)個(gè)數(shù)一一對應(yīng)匹配;
綜上,頂點(diǎn)的匹配是4-6-8-4,以第一種情況為例,顯然只要設(shè)置頂點(diǎn)的匹配規(guī)則為L1_1—L2_1,L1_2—L2_2,L1_2—L2_3,L1-3—L2_4,L1_4—L2_5,L1_4—L2_6,將此對應(yīng)關(guān)系存儲(chǔ)在數(shù)組matches中。部分關(guān)鍵c++代碼如下:
//頂點(diǎn)對應(yīng)關(guān)系
PK_BODY_vertex_matches_t matches;
matches.n_mappings=profileNum-1;
matches.mappings=new PK_BODY_vertex_match_t[profileNum-1];
PK_BODY_vertex_match_t match;
if(currentCount==4&&nextCount==6)
{
match.n_matches=6;
match.matches=new PK_BODY_one_vertex_match_t[6];
PK_BODY_one_vertex_match_t oneVertexMatch;
//1-1對應(yīng)
currentVertex=profileVertexVec[profileIndex][0];
nextVertex=profileVertexVec[profileIndex+1][0];
.....
oneVertexMatch.profile_vertex=(PK_VERTEX_t)currentVertex;
oneVertexMatch.matched_vertex=(PK_VERTEX_t)nextVertex;
match.matches[0]=oneVertexMatch;
//2-2 對應(yīng)
...
}
....
//生成體
PK_BODY_make_lofted_body_o_t options;
PK_BODY_make_lofted_body_o_m(options);
options.end_conditions.periodic = PK_PARAM_periodic_no_c;
options.matches=pMatches;
int failureCode=PK_BODY_make_lofted_body(nProfiles,profiles,vertices,&options,&loft_body)
根據(jù)上面的描述,生成的異構(gòu)體模型如圖4所示,其中,左邊表示生成體所需要的輪廓,右邊是生成的實(shí)體。在圖5中,用該函數(shù)實(shí)現(xiàn)了一個(gè)蝸殼體的三維模型構(gòu)建。
圖4 尾水管放樣生成體
圖5 蝸殼放樣體生成
本文詳細(xì)介紹了Parasolid的放樣函數(shù)及其使用方法,針對彎肘型尾水管和蝸殼體的實(shí)例,用該方法成功實(shí)現(xiàn)了異構(gòu)體三維模型的構(gòu)建,也證明了該函數(shù)可用于其他異構(gòu)體建模。
[1]鄭春峰,王永皎,何利力.基于 PARASOLID的CAD系統(tǒng)開發(fā)[J].計(jì)算機(jī)應(yīng)用研究,2006,23(8):216-217,250.
[2]宋 錦,張應(yīng)中,羅曉芳.基于Parasolid的導(dǎo)動(dòng)與放樣特征造型的實(shí)現(xiàn)[J].計(jì)算機(jī)輔助工程,2001,10(3):23-28.
[3]潘如剛,錢錦鋒,陳志楊,等.基于Parasolid的CAD系統(tǒng)中螺旋實(shí)體的建模[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(31):61-63.
[4]林 焰,王忠勇,紀(jì)卓尚.基于Parasolid船體結(jié)構(gòu)造型程序設(shè)計(jì)[J].大連理工大學(xué)學(xué)報(bào),2000,40(4):473-474.