Mesh BRep Shapes
Mesh BRep Shapes
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的更多相关文章
- BRep Shapes Based on Tessellated Geometry
BRep Shapes Based on Tessellated Geometry eryar@163.com Key Words. BRep Shape, Tessellated Geometry, ...
- Topology Shapes of OpenCascade BRep
Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...
- Mesh Algorithm in OpenCascade
Mesh Algorithm in OpenCascade eryar@163.com Abstract. Rendering a generic surface is a two steps pro ...
- OpenCascade Primitives BRep - Box
OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is short for Boundary Representation. ...
- Representation Data in OpenCascade BRep
Representation Data in OpenCascade BRep eryar@163.com 摘要Abstract:现在的显示器大多数是光栅显示器,即可以看做一个像素的矩阵.在光栅显示器 ...
- OpenCascade BRep Format Description
OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...
- OpenCascade 边界表示法(BRep)
转自 http://www.cppblog.com/eryar/archive/2013/08/20/202678.html Topology and Geometry in OpenCascade- ...
- OpenCASCADE Incremental Mesh
OpenCASCADE Incremental Mesh eryar@163.com Abstract. OpenCASCADE IncrementalMesh is used to build th ...
- EasyMesh - A Two-Dimensional Quality Mesh Generator
EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ...
随机推荐
- 【转载】CPU架构、指令集与指令集体系结构(ISA)
最近学习计算机系统基础,了解到指令集体系结构. 对CPU架构.指令集和指令集体系结构的关系不清楚,特此记录. 指令集体系结构(ISA)包括 指令集.指令集编码.基本数据类型等. CPU架构 实现了 指 ...
- Jtester使用
1.在Jtester中使用DataMap 为什么要使用DataMap? 早先的jTester中提供了dbFit方式来准备和验证数据库数据,应该来说,这个工具解决了很多问题.实际使用过程中,开发同学反映 ...
- oracle 11G 配置侦听文件
lsnrctl status 130 2017-08-23 03:15:16 oracle cat /etc/hosts 131 2017-08-23 03:15:26 oracle ca ...
- virtualbox挂载目录失败mount: unknown filesystem type ‘vboxsf’
转自[https://blog.csdn.net/u011486871/article/details/79443375] [有小修改] 错误提示:Vagrant was unable to moun ...
- 仿百度排列图片预览插件-Simple Lightbox
很久以前遇到过这样的一个面试题,要求手写代码,实现百度图片的排列预览,并且可以左右点击查看下一张照片,当时没有做出来,这个问题也就一直放在了脑后,工作之后,遇到这样的需求之后,第一反应想到的是在源码网 ...
- 【C语言】递归函数DigitSum(n)
//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和, //比如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 #include <std ...
- 使用AFNetworking第三方下载类
AFNetworking 眼下使用比較多得一个下载库 眼下一直在维护更新,使用的是很easy 不须要加入不论什么关联的库 1.带block形式 内部是任务队列进行下载 就是对operation的一 ...
- 关于Android制作.9.png图片
第一个问题,.9格式的图片与我们之前的一般图片有什么问题呢? 这是安卓开发里面的一种特殊的图片. 这样的格式的图片在android 环境下具有自适应调节大小的能力. (1)同意开发者定义可扩展区域,当 ...
- mysql-数据分组
一.创建分组 上面所讲的语句都是建立在表的所有数据或匹配特定的where子句的数据上进行的.是否能够进行分组,在进行汇总计算哪儿?例如:要想返回每个供应商提供的产品数目怎么办? 分组是在select语 ...
- 一步一步跟我学习lucene(19)---lucene增量更新和NRT(near-real-time)Query近实时查询
这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lu ...