
1、介绍
该包实现了一组用于多边形网格处理的方法和类,从简单化的基本操作到复杂的几何处理算法。该软件包的实现主要遵循Botsch等人关于多边形网格处理的书中给出的算法和参考文献。
1.1、多边形网格
多边形网格是一个一致且可定向的曲面网格,可以有多个边界。面是简单的多边形。边是线段。每条边连接两个顶点,并由两个面(包括边界边的零面)共享。多边形网格可以有任何数量的连接组件,也可以有一些自交点。在这个包中,多边形网格被认为具有2-流形的拓扑结构。
1.2、API
该软件包遵循CGAL和Boost图库中描述的BGL API。因此,它可以与Polyhedron_3、 Surface_mesh或FaceGraph概念的任何类模型一起使用。该包的每个函数或类都详细说明了对输入多边形网格的要求。
1.3、概述
本手册中描述的算法按章节组织:
网格化:网格化算法,包括非三角网格的三角剖分、细化、通过光顺进行优化、对三角网格表面的重新网格化和平滑算法。
核心细化与布尔运算:对三角形网格进行核心细化的方法和从核心细化的封闭三角形网格中计算布尔运算的方法。
孔填充:可用的孔填充算法,可能与细化和光顺相结合。
谓词:对已处理的多边形网格进行谓词评估,包括点定位和自交测试。
方向:检查或修复多边形汤的方向。
组合修复:修复多边形网格和多边形汤。
几何修复:修复多边形网格的几何形状。
计算法向量:在多边形网格的顶点和面上计算法向量。
计算曲率:在多边形网格上计算曲率(平均值、高斯、主)。
切片器:能够计算多边形网格与任意平面交点的函数(切片器)。
连接组件:处理多边形网格连接组件的方法(提取、标记、移除等)。
1.4、多边形网格的读写
在该包的所有功能中,多边形网格都需要是包CGAL和Boost graph Library Reference中定义的图形概念的模型。使用公共图概念使得能够为这些概念的所有模型具有公共输入/输出函数。I/O功能页提供了可用I/O功能的详尽描述。
此外,该包还提供了函数CGAL::Polygon_mesh_production::IO::read_Polygon_mesh(),如果输入数据不表示流形曲面,则可以执行一些修复。
2、网格
通过插入新顶点和翻转边可以得到一个三角剖分来细化曲面片。使用XX准则,通过细化函数近似得到靠近曲面片边界的三角形密度。通过翻转边强制网格的有效性。只有在对面的边在原始网格中不存在,并且不产生退化三角形时,才会翻转边。
可以对表面网格的一个区域(例如细化区域)进行光顺处理,以获得切线连续和平滑的曲面片。要光顺的区域被定义为重新定位的顶点的范围。光顺步骤最小化一个带有边界约束的线性双拉普拉斯系统。
2.1、API
2.1.1、网格生成
改进和光顺函数可应用于三角形网格上的任意区域,使用:
CGAL::Polygon_mesh_processing::refine():给定网格上一组面,改进该区域。
GAL::Polygon_mesh_processing::fair():给定网格上一组顶点,光顺该区域。
光顺需要一个稀疏线性求解器,我们建议使用Eigen 3.2或更高版本。请注意,如果用作边界条件的光滑固定顶点不足以求解所构建的线性系统,则光顺可能会失败。
许多算法要求输入网格中所有面的度相同,甚至是三角形。因此,可能需要将网格的所有多边形面进行三角剖分。
此软件包提供了函数CGAL::Polygon_mesh_processing::triangulate_faces(),可以对输入多边形网格的所有面进行三角剖分。为每个面选择一个近似支撑平面,与CGAL::Polygon_mesh_processing::compute_face_normal()计算出的法向量正交。然后,每个面的三角剖分是在该平面上构建CGAL::Constrained_Delaunay_triangulation_2所获得的。之所以做出这样的选择,是因为约束Delaunay三角剖分是在给定要三角剖分的面的边的情况下,最大化三角剖分中所有三角形最小角的最大值。
2.1.2、网格重新生成
各向同性增量网格重划分
Botsch等人提出的增量式基于三角形的各向同性网格重分算法在此软件包中实现。该算法增量式执行简单的操作,如边缘分裂、边缘折叠、边缘翻转和拉普拉斯平滑。重分网格的所有顶点都重新投影到原始曲面,以保持对输入的良好近似。
可以使用函数CGAL::Polygon_mesh_processing::isotropic_remeshing()对多边形网格的三角形区域进行网格重排,如下图所示。该算法只有两个参数:重排曲面片的目标边长,以及上述操作序列的迭代次数。该数字越大,网格越平滑,越接近目标边长。
添加了一个额外的选项来保护(即不修改)一些给定的折线。在某些情况下,这些折线太长,在保护它们的同时达到所需的目标边长是不可能的,并导致事件面中的边分裂无限循环。为了避免这个陷阱,在重新网格化之前,应在受约束的边列表上调用函数 CGAL::Polygon_mesh_processing::split_long_edges()。

各向同性再网格。(a) 三角形输入曲面网格。(b) 表面均匀且完全重熔。(c) 选择要重新曲面化的面范围。(d) 选择的曲面网格均匀地重新划分。
曲面重新网格化
在3D网格生成包中实现的网格生成算法可用于对给定的三角表面网格进行重新网格化。该算法基于限制性Delaunay三角剖分的Delaunay细化,生成三角形表面网格,该网格在单形大小、表面近似、面形状和表面拓扑方面具有所需的特性。可以给定一组来自输入网格的边作为约束,以构建和保护一组折线特征,这些特征在保持输入特征图的拓扑的同时进行重新采样。
此软件包中提供了三角形表面网格重分的解决方案,该解决方案具有 CGAL::Polygon_mesh_processing::surface_Delaunay_remeshing() 函数。为 CGAL::make_mesh_3() 定义的所有网格标准可以直接用于单形的大小、面的形状、表面近似、拓扑和一维特征采样。
Polygon_mesh_processing/delaunay_remeshing_example.cpp中给出了一个例子,说明如何使用Delaunay细化算法对给定的三角表面网格进行重新网格化,同时保留检测到的锐边。
(几乎)平面补片的重划
当使用许多三角形来描述模型的平面区域时,人们可能希望简化该区域中的网格,使用少量元素,甚至当该区域构成一个简单连接的补丁时使用单个大型多边形面。这可以通过使用函数CGAL::Polygon_mesh_processing::remesh_planar_patches()来实现。该函数用于检测平面区域,使用几何断言进行共面性和共线性检查。
如果这些测试准确执行,由于输入实际上不是完全平面的,平面区域可能会意外地小。为了缓解这种情况,可以指定相邻面(或线段)之间角度的容差,以便它们被视为共面(或共线性)。
然而,此容差阈值仅是局部的,没有全局控制,这可能会导致不希望的效果,例如在密集采样的圆弧上的经典示例,其中所有点最终都被发现几乎共线性。为了避免这种情况,我们提供了函数CGAL::Polygon_mesh_processing::remesh_almost_planar_patches(),它期望用户提供平面补丁和拐角的分割。
这种分割可以通过使用函数GAL::Polygon_mesh_processing::region_growing_of_planes_on_faces()获得,该函数使用区域增长算法在具有全局和局部准则的网格中检测平面区域。同样,函数cgal::Polygon_mesh_processing::detect_corners_of_regions()可用于检测由运行在补丁边界段上的区域增长算法检测到的平面区域的边界拐角点。

在两个模型中对平面面片进行重新划分:(a)奶酪模型中的平面面片进行了重新划分(b)该模型的重新划分版本包含14个顶点,但尚未进行重新划分,面片ID已分配给输入和输出网格,从而允许相同的配色方案。

&n


4334

被折叠的 条评论
为什么被折叠?



