OpenCASCADE Incremental Mesh
OpenCASCADE Incremental Mesh
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的更多相关文章
- Apache Spark 2.2.0 中文文档
Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN Geekhoo 关注 2017.09.20 13:55* 字数 2062 阅读 13评论 0喜欢 1 快速入门 使用 ...
- Mesh Data Structure in OpenCascade
Mesh Data Structure in OpenCascade eryar@163.com 摘要Abstract:本文对网格数据结构作简要介绍,并结合使用OpenCascade中的数据结构,将网 ...
- Mesh Algorithm in OpenCascade
Mesh Algorithm in OpenCascade eryar@163.com Abstract. Rendering a generic surface is a two steps pro ...
- Delaunay Triangulation in OpenCascade
Delaunay Triangulation in OpenCascade eryar@163.com 摘要:本文简要介绍了Delaunay三角剖分的基础理论,并使用OpenCascade的三角剖分算 ...
- OpenCASCADE PCurve of Topological Face
OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...
- OpenCASCADE Performance Test
OpenCASCADE Performance Test eryar@163.com Abstract. Use the Draw Test Harness to test the performan ...
- OpenCascade MeshVS Usage
OpenCascade MeshVS Usage eryar@163.com Abstract. MeshVS means Mesh Visualization Service. It can be ...
- Surface Normal Vector in OpenCascade
Surface Normal Vector in OpenCascade eryar@163.com 摘要Abstract:表面上某一点的法向量(Normal Vector)指的是在该点处与表面垂直的 ...
- Topology Shapes of OpenCascade BRep
Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...
随机推荐
- 手把手教你如何新建scrapy爬虫框架的第一个项目(下)
前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章页为例进行说明. 在我们创建好Scrap ...
- VC++ 借助 Win32 API 绘图实现基本的细胞自动机演示
//本程序使用 Visual Studio 2015 生成的 Win32 窗口程序模板 开发//使用 Win32 API 绘图//实现基本的细胞自动机演示////目前已知问题://存在内存泄漏,但具体 ...
- [LOJ2607]【NOIP2012】疫情控制
题意: 题目描述 H 国有n个城市,这n个城市用n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边 ...
- pytorch 2 variable 变量
import torch from torch.autograd import Variable tensor = torch.FloatTensor([[1, 2], [3, 4]]) variab ...
- WPF 列表自动换行
原文:WPF 列表自动换行 本文告诉大家如何在 ListView 或 ListBox 使用 WrapPanel 让里面的控件自动换行 在 WPF 可以通过修改 ItemsPanel 设置使用不同的 I ...
- pointer-events的css属性。使用该属性可以决定是否能穿透绝对定位元素去触发下面元素的某些行为
pointer-events的css属性.使用该属性可以决定是否能穿透绝对定位元素去触发下面元素的某些行为,比如当一个元素盖住了某个点击事件时可用. 现在Firefox3.6+/Safari4+/Ch ...
- Lambda表达式-使用说明
jdk8已经发布4年,其中有一个特性:Lambda,它是一个令开发者便捷开发的一种方式,Lambda Expression (Lambda表达式)是为了让java提供一种面向函数编程,原本在jdk8之 ...
- 使用ShareSDK分享-图片的链接
微信中使用ShareSDK分享,需要申请微信开放平台账号,并且以微信中的声明的应用签名打包程序. private void showShare(String url, String title, St ...
- cnmp安装失败,报错npm ERR! enoent ENOENT: no such file or directory,
1.cnmp安装失败 2.提示如下: bogon:node_modules liangjingming$ sudo npm install cnpm -g --registry=https://reg ...
- win10安装jdk8 配置环境变量
参考:https://jingyan.baidu.com/article/6b97984dd257b41ca2b0bf86.html