Mesh BRep Shapes

摘要:
OpenCASCADE开源版本中的模块TKMesh可以用来生成网格的显示数据,主要的类为BRepMesh_IncrementalMesh。在使用BRepMesh_IncrementalMesh的过程中发现其剖分精度高,且精度不便于控制。如对一个球进行网格剖分,想得到一个粗糙的效果,即一个多边形,使用BRepMesh_IncrementalMesh是不容易得到的。为了对模型的网格精度进行更好地控制,自己实现一套网格剖分功能,且性能要优于TKMesh。

Mesh BRep Shapes

eryar@163.com

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

Key Words. BRep, Mesh, Triangulation

1.Introduction

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

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

Mesh BRep Shapes第1张Mesh BRep Shapes第2张

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

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

2.Mesh Boundary Region

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

Mesh BRep Shapes第3张

Mesh BRep Shapes第4张

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

Mesh BRep Shapes第5张

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

Mesh BRep Shapes第6张

3.Deflection Control

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

Mesh BRep Shapes第7张

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

Mesh BRep Shapes第8张

4.Demo

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

Mesh BRep Shapes第9张

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

Mesh BRep Shapes第10张

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

Mesh BRep Shapes第11张

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

Mesh BRep Shapes第12张

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

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

5.Conclusion

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

免责声明:文章转载自《Mesh BRep Shapes》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于java容器注解---基于泛型的自动装配(转)Ubuntu中启用关闭Networkmanager网络设置问题!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity中Mesh分解与边缘高亮加上深度检测

  一个比较简单的需求,不过遇到些坑,记录下。   房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMesh对应的Material。如一个桌子的Mesh,其实有二个材质,分别对应二个SubMesh,一个桌面和一个桌脚,点击桌面后,只有这个桌面高光,而不是...

matlab画3维meshgrid/plot3/mesh/surf的用法

MATLAB三维绘图基础meshgrid函数的用法解析:见参考网址1   介绍3类(plot3/mesh/surf)7种三维图像绘制的方法。见参考网址2 plot3 三维曲线图; mesh 三维网格图; meshc 除了生成网格图外,还在xy平面生成曲面的等高线; meshz 除了生成网格图外,还在曲线下面加上个矩形垂帘; surf 三维着色曲面图; su...

Unity3D中使用Mesh动态创建编辑轴(点,线,圆,圆锥)

问题分析: 最近在搞软件底层开发,将一些工具或者底层脚本打成dll导入unity使用,有这样一需求,就是编辑功能,需要像Scene场景一样,实现那种编辑轴 实现方式: 创建Mesh,构建编辑轴,这个地方这么几步: 1.线(轴) 2.圆(旋转线) 3.正方形(轴面) 4.圆锥(轴方向) 具体步骤: 1.创建线Mesh: 代码: 1 /// <su...

[UE4]虚幻4 spline组件、spline mesh组件的用法

最近公司项目需要,把这两个东东好好看了下。不得不说,这两个组件还是非常方便的,但是相关的介绍、教程却非常的少。它们概念模糊,用法奇特,我就总结下吧。 首先,先要明白spline component。spline,中文翻译样条曲线,所以虚幻里的spline组件就是一条曲线,支持增加减少点、曲线点自动光滑连接等功能。通过spline组件可以获得spline曲线...

Assimp里的一些知识(1)

OpenGL 学习到模型加载的时候,介绍了一个模型导入库(Open Asset Import Library,Assimp)的用法。初学的时候觉得稍微有些复杂,故借由这篇blog来简单地捋一下其中的细节。 首先,当我们使用Assimp导入模型的时候,它通常会将整个模型加载到一个场景(Scene)对象,这个对象包含了导入模型的所有数据。具体结构如下图所示(...

ue4读取灰度图生成三维地形mesh

转自:https://www.cnblogs.com/gucheng/p/10116857.html 新建ue c++工程。 在Build.cs中添加"ProceduralMeshComponent"模块。 在 uproject中添加"ProceduralMeshComponent"模块。 创建材质,传入grass贴图 导入灰度图资源 创建继承自...