posts - 409, comments - 576, trackbacks - 0, articles - 0

sgCore库简介

Posted on 2013-06-30 19:59 eryar 阅读(3419) 评论(0)  编辑 收藏 引用 所属分类: 2.OpenCASCADE

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)的类图如所示:

wps_clip_image-10288

3.1 二维基类sgC2DObject

其中二维的基类sgC2DObject很好理解。基本上都用其几何概念来表示,显示时通过GetPoints()得到二维对象上离散的点,用GL_LINE_STRIP来在OpenGL中显示即可。

3.2 三维基类sgC3DObject

三维基类sgC3DObject用来表示用三角面片数组来逼近几何对象(Object)的类。用于三角化及显示的函数主要有:

wps_clip_image-22425

其中AutoTriangulate()用来设置三维对象全局的三角化标志。当创建复杂三维对象时,建议将此标志关闭,可以提高算法速度。并使用函数sgC3DObject::Triangulate来对最终对象进行三角化。

sgCore库的三角离散主要用了两种算法:

wps_clip_image-29678

l SG_VERTEX_TRIANGULATION:这种三角化算法不创建新的顶点,这种三角化的算法有个缺点,可能导致stretched三角形;

l SG_DELAUNAY_TRIANGULATION:Delaunay三角化。

两种三角化效果的比较如下图所示:

wps_clip_image-6320

三维对象经过三角离散化后,就可以用GL_TRIANGLES在OpenGL中显示了。

如下图所示为使用 三角化后的Box:

 

// Make a box 
sgCBox* aBox = sgCreateBox(122.1); 
aBox
->Triangulate(SG_DELAUNAY_TRIANGULATION); 

 

三角化后的三角形可以通过函数GetTriangles()取得,用于显示。

wps_clip_image-4312

其中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个基面、一个侧面和孔面。如下图所示:

wps_clip_image-14857

下表将这个BRep体的顶点和边的信息进行说明。

wps_clip_image-31398

面(Face)由边的集合Edges组成。面的初始边的索引(Index)会设置,然后环(Cycle)的结构可以用来确定面的下一个边。这样面的外轮廓和孔都可以区分了。

如下图所示为一个Box的BRep表示的数据结构:

 

// Make a box 
sgCBox* aBox = sgCreateBox(122.1); 

 

wps_clip_image-28847

四、造型算法

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:布尔交;

wps_clip_image-25000

l Union:布尔并;

wps_clip_image-25972

l Sub:布尔减;

wps_clip_image-9757

l IntersectionContour:计算交线;

wps_clip_image-20330

l Section:

wps_clip_image-25431

4.2 放样操作

放样操作(Kinematic Options)意思是将一个二维对象沿三维空间的路径拉伸得到的三维对象。拉伸的对象称为clip,路径称为profile。放样操作主要有以下几种:

l Rotation:旋转;

wps_clip_image-17150 wps_clip_image-12527

l Extrusion:拉伸;

wps_clip_image-25306

wps_clip_image-12942

l Spiral:螺旋;

wps_clip_image-18693

wps_clip_image-4892

l Pipe-like:管状;

wps_clip_image-29143

wps_clip_image-11861

4.3 构建表面

库sgCore实现一些从二维对象构建三维面的算法。实现的算法如下所示:

wps_clip_image-32700

构造带孔的平面:

wps_clip_image-1043

Coons曲面:

wps_clip_image-9690

wps_clip_image-10956

由控制点构造曲面Mesh:

wps_clip_image-14613

由截面Section创建:

wps_clip_image-25360

wps_clip_image-8711

wps_clip_image-15387

五、结论

sgCore是个小巧且造型功能还不错的库,且是免费的,能满足一般的造型需要。

更多详细说明请参考sgCore的文档。


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理