Introduction of sgCore
eryar@163.com
摘要Abstract:本文结合sgCore的帮助文档简要介绍了一个sgCore库的功能。
关键字KeyWords:sgCore、Modeling Algorithm、Triangulation
一、简介
sgCore是由Geometros公司创建的实体造型库,是其公司的一个产品SolidGraph(参数化CAD系统)的几何内核。sgCore只用C++开发,导出了约30多个类及实现了二维和三维造型中的大部分算法。如:布尔运算、放样和其他曲面。 其免费库及示例程序可以从这里获得:http://www.geometros.com/。
二、几何
几何(Geometry)是sgCore库中的一个核心概念。用户使用库来造型时有两个基本点:一是几何对象的数学描述;一是其显示,对于三维对象而言是其多边形(polygonal),对于二维对象是其线段(segment)。
几何(Geometry)是独立的概念。它只是几何对象的数学的精确描述。
三、sgCore对象
对象(Object)和几何(Geometry)是库sgCore中的主要概念。与几何的精确描述几何体的概念不同,对象是用来显示的,它只是几何体的近似逼近。库sgCore中所有的操作都是基于对象(Object)的,而不是针对几何(Geometries)的。
库sgCore中的二维对象只是一些线段(a number of line segments);三维对象是一些三角面片(a number of triangles)。三维对象在计算机中最终都是被离散成三角面片后显示的。
与几何(Geometry)精确表示几何体不同,对象(Object)并不精确表示几何体,它是在几何上以一定精度近似表示几何体的。我们通常只能得到几何(Geometry)的一定精度的对象(Object)。这也是每个对象(Object)都保存一份(Geometry)的原因。
对象(Object)的类图如所示:
3.1 二维基类sgC2DObject
其中二维的基类sgC2DObject很好理解。基本上都用其几何概念来表示,显示时通过GetPoints()得到二维对象上离散的点,用GL_LINE_STRIP来在OpenGL中显示即可。
3.2 三维基类sgC3DObject
三维基类sgC3DObject用来表示用三角面片数组来逼近几何对象(Object)的类。用于三角化及显示的函数主要有:
其中AutoTriangulate()用来设置三维对象全局的三角化标志。当创建复杂三维对象时,建议将此标志关闭,可以提高算法速度。并使用函数sgC3DObject::Triangulate来对最终对象进行三角化。
sgCore库的三角离散主要用了两种算法:
l SG_VERTEX_TRIANGULATION:这种三角化算法不创建新的顶点,这种三角化的算法有个缺点,可能导致stretched三角形;
l SG_DELAUNAY_TRIANGULATION:Delaunay三角化。
两种三角化效果的比较如下图所示:
三维对象经过三角离散化后,就可以用GL_TRIANGLES在OpenGL中显示了。
如下图所示为使用 三角化后的Box:
// Make a box
sgCBox* aBox = sgCreateBox(1, 2, 2.1);
aBox->Triangulate(SG_DELAUNAY_TRIANGULATION);
三角化后的三角形可以通过函数GetTriangles()取得,用于显示。
其中Box经过Delaunay三角化后,生成12个三角形,即一个Box由六个面,每个面2个三角形。
显示的实现可以参考sgCore的示例程序:demo_sources中的OpenGL文件夹下的Painter类。
3.3 边界表示法表示几何体sgCBRep
在库sgCore中所有的三维对象(3D solids)都是以多边形面的形式存储,即也是边界表示(BRep)存储的。这种表示方法使用几何实体的边界面(Boundary surface)来表示实体。
每个表面(Surface)由一系列的面(Faces)来逼近。每个面(Face)由其数学方式来描述(compact mathematical representation)。
面(Face)的边界由边(Edges)来表示。边(Edges)与面类似,也是用其数学方式来描述。
组成边(Edge)的曲线的端点就是顶点(Vertexes)。
这里有必要引入环(Cycle)的概念,用来描述面(Face)的轮廓(Contour)。因为每个面(Face)可以是由多个孔(any number of holes)的非凸包(non-convex)的多边形表示。
只有平面(Flat face)表示的模型称为多边形模型(Polygonal Model)。则多边形面包含了一系列的坐标顶点。
一个对象(Object)包含由一系列的表组成。
sgCore库也引入一个术语:BRep面片(BRep piece)。一个BRep面片就是与边界表面相连的一个面片。引入这个概念的目的是为了加快一些造型算法(如布尔运算算法)。每个BRepPiece有一个有限边界的立体平行四边形。It was designed to avoid passes of each BRep pieces face in the cycles. 所有的BRep面片连接起来组成一个完整的BRep。
下面以一个非凸的有一个孔的平面拉伸得到的BRep实体为例来说明相关概念。把这个BRep体分为四个面片:2个基面、一个侧面和孔面。如下图所示:
下表将这个BRep体的顶点和边的信息进行说明。
面(Face)由边的集合Edges组成。面的初始边的索引(Index)会设置,然后环(Cycle)的结构可以用来确定面的下一个边。这样面的外轮廓和孔都可以区分了。
如下图所示为一个Box的BRep表示的数据结构:
// Make a box
sgCBox* aBox = sgCreateBox(1, 2, 2.1);
四、造型算法
2D、3D的许多数学算法都在sgCore库中实现了。最基本和最重要的就是从已有的对象基础上创建出新的对象。在现代的计算机辅助设计系统(CAD)中创建新的对象的主要工具是布尔运算(Boolean operations)和基于二维对象创建体和面。sgCore库为开发者提供了大部分相关算法:布尔操作(Boolean operations)、放样(Kinematic operations)、基于二维对象创建三维对象(Creating 3D objects based on 2D objects.)。
4.1 布尔操作
布尔操作是由两个已经存在的对象创建出一个新的对象。布尔操作有以下几种:Intersection、Union、Sub、Section、IntersectionContour。
l Intersection:布尔交;
l Union:布尔并;
l Sub:布尔减;
l IntersectionContour:计算交线;
l Section:
4.2 放样操作
放样操作(Kinematic Options)意思是将一个二维对象沿三维空间的路径拉伸得到的三维对象。拉伸的对象称为clip,路径称为profile。放样操作主要有以下几种:
l Rotation:旋转;
l Extrusion:拉伸;
l Spiral:螺旋;
l Pipe-like:管状;
4.3 构建表面
库sgCore实现一些从二维对象构建三维面的算法。实现的算法如下所示:
构造带孔的平面:
Coons曲面:
由控制点构造曲面Mesh:
由截面Section创建:
五、结论
sgCore是个小巧且造型功能还不错的库,且是免费的,能满足一般的造型需要。
更多详细说明请参考sgCore的文档。