OpenCASCADE Incremental Mesh

eryar@163.com

Abstract. OpenCASCADE IncrementalMesh is used to build the mesh of a shape with respect of their correctly triangulated parts. The blog focus on the deflection control of the algorithm.

Key Words. Mesh, Visualization

1. Introduction

Mesh是生成三维模型显示数据的关键算法。OpenCASCADE的TKMesh提供了网格剖分算法,用于生成BREP体的显示数据。原来的一些文章对网格剖分的算法及其用法进行过说明,本文主要对网格剖分的核心部分进行深入挖掘,理解其剖分精度控制原理。感兴趣的读者可以结合源码,学习其实现方法。当理解其算法原理后,也可以自己实现一套结合实际需求的高性能网格剖分库。

网格剖分的主要流程如下:

遍历TopoDS_Shape的TopoDS_Face,对于每个TopoDS_Face,遍历其TopoDS_Wire,对于每个TopoDS_Wire遍历其TopoDS_Edge,在根据Edge和Face得到PCurve。因为TopoDS_Wire是闭合的,所以Wire的PCurve是在参数空间闭合区域。对PCurve围成的参数区域进行三角剖分,将三角剖分的结果映射到三维空间,最终生成每个Face的网格剖分。这个流程很好理解,但是如何对网格剖分的质量进行控制呢?即用相对少的三角网格来更好地表示三维模型呢?

2. Mesh Deflection Control

OpenCASCADE对BRep体进行三角剖分网格化的类是BRepMesh_IncrementalMesh,此类有两个主要的选项来控制三角网格化:线性偏差Linear deflection和角度偏差Angular deflection。

三角网格剖分第一步是将所有的边Edge进行离散,即根据一定的精度生成多段线;

线性偏差限制离散的多段线与曲线之间的距离;角度偏差限制每段线段端部切线的夹角。

第二步是对面进行三角剖分。线性偏差也限制离散的三角形中点到曲线的距离。

应用程序应该提供适当的偏差参数以达到生成满意的三角网格。角度偏差Angular deflection比较简单且允许使用一个默认值(12~20度)。线性偏差Linear deflection有绝对的含义,需要由程序来给定正确的值。给一个很小的线性偏差值会导致网格剖分过密,消耗大量内存及影响显示效率;但是值太大得到的网格效果就是显示失真。所以对于LOD的网格来说,需要根据模型尺寸来设置相应的线性偏差值。

上面对网格剖分的参数设置进行了介绍,下面对网格剖分的实现原理进行说明。因为曲线曲面是三维的,而对曲面进行剖分的底层三角剖功能是个二维三角剖分库,所以网格剖分总的思路是对曲线在二维参数空间进行剖分,将参数空间剖分的结果通过曲面参数方程映射回到三维空间。通过对pcurve围成的参数空间闭合区域进行二维三角剖分,即可对三维曲面进行剖分。类BRepMesh_FastDiscretFace是对每个TopoDS_Face进行离散,其中函数control()是用来控制生成网格的质量的。

最多迭代次数是11次。在每一次迭代过程中,检查生成的所有三角形在参数空间中心点处与曲面的距离是否满足线性偏差,如果不满足,则插入新的点以便下次迭代。

从上面的代码可以看出其实现思路与其类名Incremental还是很贴切的,即增量法。

3. Conclusion

OpenCASCADE的网格剖分中网格质量控制是相对重要的核心功能。在理解其原理后,可以自己实现一个更清晰的网格剖分库。

2018年就过结束了,这一年收获颇丰,其中最大的收获就是有了自己的小宝宝。

分享创建价值。虽然OpenCASCADE不是完美的,但是她是目前世界上唯一一款功能相对完善的开放的几何造型库。OpenCASCADE的开放分享,给她带来生机。当他人因为我的blog的分享的文章或代码联系我时,他们的一声感谢,我都会觉得很高兴。

2019年马上就要到来,希望大家在新的一年里,创造、创新,突破自我,更上一层楼!

OpenCASCADE Incremental Mesh的更多相关文章

  1. Apache Spark 2.2.0 中文文档

    Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN Geekhoo 关注 2017.09.20 13:55* 字数 2062 阅读 13评论 0喜欢 1 快速入门 使用 ...

  2. Mesh Data Structure in OpenCascade

    Mesh Data Structure in OpenCascade eryar@163.com 摘要Abstract:本文对网格数据结构作简要介绍,并结合使用OpenCascade中的数据结构,将网 ...

  3. Mesh Algorithm in OpenCascade

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

  4. Delaunay Triangulation in OpenCascade

    Delaunay Triangulation in OpenCascade eryar@163.com 摘要:本文简要介绍了Delaunay三角剖分的基础理论,并使用OpenCascade的三角剖分算 ...

  5. OpenCASCADE PCurve of Topological Face

    OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...

  6. OpenCASCADE Performance Test

    OpenCASCADE Performance Test eryar@163.com Abstract. Use the Draw Test Harness to test the performan ...

  7. OpenCascade MeshVS Usage

    OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...

  8. Surface Normal Vector in OpenCascade

    Surface Normal Vector in OpenCascade eryar@163.com 摘要Abstract:表面上某一点的法向量(Normal Vector)指的是在该点处与表面垂直的 ...

  9. Topology Shapes of OpenCascade BRep

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

随机推荐

  1. requests 常见方法总结

    请求设置:requests.get/post ( url, data={}, params={}, headers={}, timeout=0.01, files={}   Session()    ...

  2. ajax请求携带 cookie

    之前都有这样一个理解:ajax请求时是不会自动带上cookie的,要是想让他带上的话,必须哟啊设置withCredential为true.这个说法会让人产生完全扭曲的误解,我就是其中之一.完整的无歧义 ...

  3. BZOJ 2555 SubString(LCT+后缀树)

    喜闻乐见的LCT+SAM 此题要求动态插入,直接上后缀树.然后询问其实就是求一个节点的子树后缀结束节点的个数. 因为建立后缀树需要插入和删除,就直接上LCT.每次加入一个点,把它到根的路径加一 (现在 ...

  4. django 开发之给admin 模块添加富文本编辑器

    第一步下载kindeditor  http://kindeditor.net/demo.php 下载下来后放到静态文件static 下面的js下面 接着在admin 模块文章类下引入这富文本编辑器: ...

  5. 'mingw32-make' 不是内部或外部命令,也不是可运行的程序 或批处理文件。(的解决方案)

    问题如上. 解决方案:找到mingw32-make,方法是在计算中搜索 然后将其复制到C:Windows\System32下,需要管理员权限才能复制的情况下直接点继续.然后就可以了.

  6. Python学习笔记(二):字符串类型

    在上一篇随笔(https://www.cnblogs.com/g-qiang/p/10448813.html)中,说到 Python 有六种标准数据类型,而数字类型和字符串类型又是其中基本的数据类型. ...

  7. 题解 P2532 【[AHOI2012]树屋阶梯】

    本题运用卡特兰数求解. 卡特兰数有两种表达方式: 1)\(h_i=\sum^{k=0}_{i-1}h_kh_{i-k-1}\) 2)\(h_i=\frac{1}{n+1}C^{n}_{2n}\) 运用 ...

  8. Linux入门基础(一)

    UNIX/Linux 本身是没有图形界面的,我们通常在 UNIX/Linux 发行版上看到的图形界面实际都只是运行在 Linux 系统之上的一套软件XFree86,现在则是 xorg(X.Org),而 ...

  9. nyoj33 蛇形填数

    蛇形填数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 在n*n方陈里填入1,2,...,n*n,要求填成蛇形.比如n=4时方陈为: 10 11 12 1 9 16 ...

  10. VS2008 集成Lua解释器

    1. 登陆官网下载源代码 -> www.lua.org -> get started ->  installing  选择系统类型(这里是Windows的,所下面载 luaDist) ...