Mesh BRep Shapes

eryar@163.com

Abstract. 当对OpenCASCADE的BRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖分功能。

Key Words. BRep, Mesh, Triangulation

1. Introduction

在OpenCASCADE中网格剖分功能是很重要的一个模块,他可用于生成模型的可视化数据,还可用于HLR消隐,对于离散求交算法也是基于网格数据。OpenCASCADE开源版本中的模块TKMesh可以用来生成网格的显示数据,主要的类为BRepMesh_IncrementalMesh。

在使用BRepMesh_IncrementalMesh的过程中发现其剖分精度高,且精度不便于控制。如对一个球进行网格剖分,想得到一个粗糙的效果,即一个多边形,使用BRepMesh_IncrementalMesh是不容易得到的。

如上图所示为同一个球的不同的剖分精度得到的模型。为了能精确控制网格剖分精度,以便后期使用LOD等优化算法,自己实现一个网格剖分功能。

网格剖分的主要思路就是遍历每个TopoDS_Face的TopoDS_Wire,根据Wire找到边界或面上的孔洞。将Wire对应到二维参数空间,并对二维参数空间中的边界先进行一次三角网格剖分。对于平面来说,只需要这一步就可以满足可视化的要求。对于其他曲面来说,就需要在二维参数空间中额外插入一些点,以使最终生成的网格满足剖分精度要求。最后将二维参数空间的三角剖分映射到三维空间。

2. Mesh Boundary Region

因为使用BRepBuilderAPI_MakeFace可以通过Add(TopoDS_Wire)来添加面上的开孔,所以一个TopoDS_Face会有大于1个的TopoDS_Wire。找出外边界和内孔Wire后可进行一次三角剖分,如下图所示:

如上图所示,对于平面而言,直接对边界及内孔进行一次三角剖分即可以得到满意的网格数据。对于曲面而言,这显然是不满足精度要求的。

如上图所示为球面的第一次对边界进行三角剖分得到的效果。因为在一个参数上的边是退化Degenerated边,所以退化边的参数空间上没有均分。将参数空间的三角剖分映射到三维空间后,得到的是一条线,其实是两个非退化边。

3. Deflection Control

对于曲面来说,如果直对边界进行一次三角剖分,是达不到精度要求。为了使曲面网格剖分效果更好,就需要对按边界剖分后的网格进行插入点继续剖分。对于上面球面的参数空间区域,根据精度要求插入点剖分后的结果如下图所示:

得到的三维效果如下图所示:

4. Demo

下面给出几个自己实现网格剖分的结果与OpenCASCADE的TKMesh作个对比:

上图为自己实现网格剖分算法对椭球面的网格剖分结果

上图为TKMesh网格剖分算法对椭球面的网格剖分结果

上图为自己实现网格剖分算法对椭圆环面的网格剖分结果

上图为TKMesh网格剖分算法对椭圆环面的网格剖分结果

通过上面的对比可以发现,在大致相同的显示效果情况下,OpenCASCADE产生了更多的顶点和三角形数据。自己实现的网格剖分产生的网格质量相对可控且性能高。

5. Conclusion

OpenCASCADE中开源的网格剖分库TKMesh可以实现模型的可视化数据生成功能,但是对于网格剖分的精度可控性差。为了对模型的网格精度进行更好地控制,自己实现一套网格剖分功能,且性能要优于TKMesh。在程序的编写过程中,可以加深BREP数据结构中一些概念的理解。有兴趣的读者在熟悉BREP数据结构后,也可以尝试下网格剖分功能的实现。

Mesh BRep Shapes的更多相关文章

  1. BRep Shapes Based on Tessellated Geometry

    BRep Shapes Based on Tessellated Geometry eryar@163.com Key Words. BRep Shape, Tessellated Geometry, ...

  2. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

  3. Mesh Algorithm in OpenCascade

    Mesh Algorithm in OpenCascade eryar@163.com Abstract. Rendering a generic surface is a two steps pro ...

  4. OpenCascade Primitives BRep - Box

    OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is short for Boundary Representation. ...

  5. Representation Data in OpenCascade BRep

    Representation Data in OpenCascade BRep eryar@163.com 摘要Abstract:现在的显示器大多数是光栅显示器,即可以看做一个像素的矩阵.在光栅显示器 ...

  6. OpenCascade BRep Format Description

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...

  7. OpenCascade 边界表示法(BRep)

    转自 http://www.cppblog.com/eryar/archive/2013/08/20/202678.html Topology and Geometry in OpenCascade- ...

  8. OpenCASCADE Incremental Mesh

    OpenCASCADE Incremental Mesh eryar@163.com Abstract. OpenCASCADE IncrementalMesh is used to build th ...

  9. EasyMesh - A Two-Dimensional Quality Mesh Generator

    EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ...

随机推荐

  1. 【转载】CPU架构、指令集与指令集体系结构(ISA)

    最近学习计算机系统基础,了解到指令集体系结构. 对CPU架构.指令集和指令集体系结构的关系不清楚,特此记录. 指令集体系结构(ISA)包括 指令集.指令集编码.基本数据类型等. CPU架构 实现了 指 ...

  2. Jtester使用

    1.在Jtester中使用DataMap 为什么要使用DataMap? 早先的jTester中提供了dbFit方式来准备和验证数据库数据,应该来说,这个工具解决了很多问题.实际使用过程中,开发同学反映 ...

  3. oracle 11G 配置侦听文件

    lsnrctl status   130  2017-08-23 03:15:16 oracle cat /etc/hosts   131  2017-08-23 03:15:26 oracle ca ...

  4. virtualbox挂载目录失败mount: unknown filesystem type ‘vboxsf’

    转自[https://blog.csdn.net/u011486871/article/details/79443375] [有小修改] 错误提示:Vagrant was unable to moun ...

  5. 仿百度排列图片预览插件-Simple Lightbox

    很久以前遇到过这样的一个面试题,要求手写代码,实现百度图片的排列预览,并且可以左右点击查看下一张照片,当时没有做出来,这个问题也就一直放在了脑后,工作之后,遇到这样的需求之后,第一反应想到的是在源码网 ...

  6. 【C语言】递归函数DigitSum(n)

    //写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和, //比如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 #include <std ...

  7. 使用AFNetworking第三方下载类

    AFNetworking 眼下使用比較多得一个下载库 眼下一直在维护更新,使用的是很easy 不须要加入不论什么关联的库  1.带block形式 内部是任务队列进行下载  就是对operation的一 ...

  8. 关于Android制作.9.png图片

    第一个问题,.9格式的图片与我们之前的一般图片有什么问题呢? 这是安卓开发里面的一种特殊的图片. 这样的格式的图片在android 环境下具有自适应调节大小的能力. (1)同意开发者定义可扩展区域,当 ...

  9. mysql-数据分组

    一.创建分组 上面所讲的语句都是建立在表的所有数据或匹配特定的where子句的数据上进行的.是否能够进行分组,在进行汇总计算哪儿?例如:要想返回每个供应商提供的产品数目怎么办? 分组是在select语 ...

  10. 一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询

    这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lu ...