Introduction of sgCore
eryar@163.com
摘要Abstract:本文結(jié)合sgCore的幫助文檔簡(jiǎn)要介紹了一個(gè)sgCore庫(kù)的功能。
關(guān)鍵字KeyWords:sgCore、Modeling Algorithm、Triangulation
一、簡(jiǎn)介
sgCore是由Geometros公司創(chuàng)建的實(shí)體造型庫(kù),是其公司的一個(gè)產(chǎn)品SolidGraph(參數(shù)化CAD系統(tǒng))的幾何內(nèi)核。sgCore只用C++開發(fā),導(dǎo)出了約30多個(gè)類及實(shí)現(xiàn)了二維和三維造型中的大部分算法。如:布爾運(yùn)算、放樣和其他曲面。 其免費(fèi)庫(kù)及示例程序可以從這里獲得:http://www.geometros.com/。
二、幾何
幾何(Geometry)是sgCore庫(kù)中的一個(gè)核心概念。用戶使用庫(kù)來造型時(shí)有兩個(gè)基本點(diǎn):一是幾何對(duì)象的數(shù)學(xué)描述;一是其顯示,對(duì)于三維對(duì)象而言是其多邊形(polygonal),對(duì)于二維對(duì)象是其線段(segment)。
幾何(Geometry)是獨(dú)立的概念。它只是幾何對(duì)象的數(shù)學(xué)的精確描述。
三、sgCore對(duì)象
對(duì)象(Object)和幾何(Geometry)是庫(kù)sgCore中的主要概念。與幾何的精確描述幾何體的概念不同,對(duì)象是用來顯示的,它只是幾何體的近似逼近。庫(kù)sgCore中所有的操作都是基于對(duì)象(Object)的,而不是針對(duì)幾何(Geometries)的。
庫(kù)sgCore中的二維對(duì)象只是一些線段(a number of line segments);三維對(duì)象是一些三角面片(a number of triangles)。三維對(duì)象在計(jì)算機(jī)中最終都是被離散成三角面片后顯示的。
與幾何(Geometry)精確表示幾何體不同,對(duì)象(Object)并不精確表示幾何體,它是在幾何上以一定精度近似表示幾何體的。我們通常只能得到幾何(Geometry)的一定精度的對(duì)象(Object)。這也是每個(gè)對(duì)象(Object)都保存一份(Geometry)的原因。
對(duì)象(Object)的類圖如所示:
3.1 二維基類sgC2DObject
其中二維的基類sgC2DObject很好理解。基本上都用其幾何概念來表示,顯示時(shí)通過GetPoints()得到二維對(duì)象上離散的點(diǎn),用GL_LINE_STRIP來在OpenGL中顯示即可。
3.2 三維基類sgC3DObject
三維基類sgC3DObject用來表示用三角面片數(shù)組來逼近幾何對(duì)象(Object)的類。用于三角化及顯示的函數(shù)主要有:
其中AutoTriangulate()用來設(shè)置三維對(duì)象全局的三角化標(biāo)志。當(dāng)創(chuàng)建復(fù)雜三維對(duì)象時(shí),建議將此標(biāo)志關(guān)閉,可以提高算法速度。并使用函數(shù)sgC3DObject::Triangulate來對(duì)最終對(duì)象進(jìn)行三角化。
sgCore庫(kù)的三角離散主要用了兩種算法:
l SG_VERTEX_TRIANGULATION:這種三角化算法不創(chuàng)建新的頂點(diǎn),這種三角化的算法有個(gè)缺點(diǎn),可能導(dǎo)致stretched三角形;
l SG_DELAUNAY_TRIANGULATION:Delaunay三角化。
兩種三角化效果的比較如下圖所示:
三維對(duì)象經(jīng)過三角離散化后,就可以用GL_TRIANGLES在OpenGL中顯示了。
如下圖所示為使用 三角化后的Box:
// Make a box
sgCBox* aBox = sgCreateBox(1, 2, 2.1);
aBox->Triangulate(SG_DELAUNAY_TRIANGULATION);
三角化后的三角形可以通過函數(shù)GetTriangles()取得,用于顯示。
其中Box經(jīng)過Delaunay三角化后,生成12個(gè)三角形,即一個(gè)Box由六個(gè)面,每個(gè)面2個(gè)三角形。
顯示的實(shí)現(xiàn)可以參考sgCore的示例程序:demo_sources中的OpenGL文件夾下的Painter類。
3.3 邊界表示法表示幾何體sgCBRep
在庫(kù)sgCore中所有的三維對(duì)象(3D solids)都是以多邊形面的形式存儲(chǔ),即也是邊界表示(BRep)存儲(chǔ)的。這種表示方法使用幾何實(shí)體的邊界面(Boundary surface)來表示實(shí)體。
每個(gè)表面(Surface)由一系列的面(Faces)來逼近。每個(gè)面(Face)由其數(shù)學(xué)方式來描述(compact mathematical representation)。
面(Face)的邊界由邊(Edges)來表示。邊(Edges)與面類似,也是用其數(shù)學(xué)方式來描述。
組成邊(Edge)的曲線的端點(diǎn)就是頂點(diǎn)(Vertexes)。
這里有必要引入環(huán)(Cycle)的概念,用來描述面(Face)的輪廓(Contour)。因?yàn)槊總€(gè)面(Face)可以是由多個(gè)孔(any number of holes)的非凸包(non-convex)的多邊形表示。
只有平面(Flat face)表示的模型稱為多邊形模型(Polygonal Model)。則多邊形面包含了一系列的坐標(biāo)頂點(diǎn)。
一個(gè)對(duì)象(Object)包含由一系列的表組成。
sgCore庫(kù)也引入一個(gè)術(shù)語:BRep面片(BRep piece)。一個(gè)BRep面片就是與邊界表面相連的一個(gè)面片。引入這個(gè)概念的目的是為了加快一些造型算法(如布爾運(yùn)算算法)。每個(gè)BRepPiece有一個(gè)有限邊界的立體平行四邊形。It was designed to avoid passes of each BRep pieces face in the cycles. 所有的BRep面片連接起來組成一個(gè)完整的BRep。
下面以一個(gè)非凸的有一個(gè)孔的平面拉伸得到的BRep實(shí)體為例來說明相關(guān)概念。把這個(gè)BRep體分為四個(gè)面片:2個(gè)基面、一個(gè)側(cè)面和孔面。如下圖所示:
下表將這個(gè)BRep體的頂點(diǎn)和邊的信息進(jìn)行說明。
面(Face)由邊的集合Edges組成。面的初始邊的索引(Index)會(huì)設(shè)置,然后環(huán)(Cycle)的結(jié)構(gòu)可以用來確定面的下一個(gè)邊。這樣面的外輪廓和孔都可以區(qū)分了。
如下圖所示為一個(gè)Box的BRep表示的數(shù)據(jù)結(jié)構(gòu):
// Make a box
sgCBox* aBox = sgCreateBox(1, 2, 2.1);
四、造型算法
2D、3D的許多數(shù)學(xué)算法都在sgCore庫(kù)中實(shí)現(xiàn)了。最基本和最重要的就是從已有的對(duì)象基礎(chǔ)上創(chuàng)建出新的對(duì)象。在現(xiàn)代的計(jì)算機(jī)輔助設(shè)計(jì)系統(tǒng)(CAD)中創(chuàng)建新的對(duì)象的主要工具是布爾運(yùn)算(Boolean operations)和基于二維對(duì)象創(chuàng)建體和面。sgCore庫(kù)為開發(fā)者提供了大部分相關(guān)算法:布爾操作(Boolean operations)、放樣(Kinematic operations)、基于二維對(duì)象創(chuàng)建三維對(duì)象(Creating 3D objects based on 2D objects.)。
4.1 布爾操作
布爾操作是由兩個(gè)已經(jīng)存在的對(duì)象創(chuàng)建出一個(gè)新的對(duì)象。布爾操作有以下幾種:Intersection、Union、Sub、Section、IntersectionContour。
l Intersection:布爾交;
l Union:布爾并;
l Sub:布爾減;
l IntersectionContour:計(jì)算交線;
l Section:
4.2 放樣操作
放樣操作(Kinematic Options)意思是將一個(gè)二維對(duì)象沿三維空間的路徑拉伸得到的三維對(duì)象。拉伸的對(duì)象稱為clip,路徑稱為profile。放樣操作主要有以下幾種:
l Rotation:旋轉(zhuǎn);
l Extrusion:拉伸;
l Spiral:螺旋;
l Pipe-like:管狀;
4.3 構(gòu)建表面
庫(kù)sgCore實(shí)現(xiàn)一些從二維對(duì)象構(gòu)建三維面的算法。實(shí)現(xiàn)的算法如下所示:
構(gòu)造帶孔的平面:
Coons曲面:
由控制點(diǎn)構(gòu)造曲面Mesh:
由截面Section創(chuàng)建:
五、結(jié)論
sgCore是個(gè)小巧且造型功能還不錯(cuò)的庫(kù),且是免費(fèi)的,能滿足一般的造型需要。
更多詳細(xì)說明請(qǐng)參考sgCore的文檔。