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数据的读写,理解边界表示法的概念及实现 ...
随机推荐
- C# AES 加解密处理
引言 这是一个有关AES加解密的方法类 一.设置AES加解密密钥:下面列出自己分配的三类密钥 private const string UserKey = "roshan-2015-user ...
- [agc016d]xor replace
题意: 题解: 棒棒的神仙题...这题只是D题???(myh:看题五分钟,讨论两小时) 首先这个异或和是假的,比如我现在有$a=(a_1,a_2,a_3,a_4)$,操作一下$a_2$,就变成了$a= ...
- (QT)在命令行编译ui文件和程序
1.新建helloworld_2文件夹,将helloworld里的main.cpp和hellodialog.cpp两个文件复制过来. 2.打开控制台.此时不能用cmd,否则不能出最后的结果(lz在运行 ...
- 关于vue事件监听的一个问题
由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的.我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间 ...
- 2015,鬼王Xun和GGL比赛,带给我们无尽的欢乐
一如既往的风格,正文之前,先扯蛋~ 这篇文章好久就想写了,一直没有动笔,最近在忙于Android和iOS等技术研究,又忙于金融投资等方面的学习和写作.这个周末,把技术进度延缓了点,把很多闲杂的 ...
- Thinking in States
Thinking in States Niclas Nilsson PEOPLE IN THE REAL WORLD HAVE A WEIRD RELATIONSHIP WITH STATE. Thi ...
- android mvp高速开发框架介绍(dileber使用之小工具使用)
android mvp框架:dileber(https://github.com/dileber/dileber.git) 继续为大家介绍android mvp开源框架 dileber 官方交流qq群 ...
- Linux之我最常用的20条命令
Linux之我最常用的20条命令 玩过 Linux的人都会知道, Linux中的命令的确是非常多,但是玩过 Linux的人也从来不会因为 Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的 ...
- hdu 1075 What Are You Talking About(map)
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- 赵雅智:android教学大纲
带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...