1 研究领域内网格的定义
网格(有研究也成格网)指的是三维多边形网格模型,简称“网格”。简单的定义为:由多边形集合定义,用以表示三维模型表面轮廓的拓扑和空间结构,英文为polygon mesh或mesh。
其中,三角网格的应用最为广泛,其表示简单且稳定。大多数研究讨论的网格均为三角网格,四边形及多边形构成的网格可都可以通过三角剖分方法得到三角网格。
三维空间中的多面体表面是由顶点、边、面以及他们之前的关联构成的。
组织的基础是半边数据结构,这个数据结构约束可描述的表面到定向二维流行上,包含有边界和无边界的。
如果表面封闭,我们称之为多面体。
1.1 网格修复
网格表面的质量不够好,存在以下情况:
- 本应该连在一起的某两段间存在细小的间隔;
- 本应该是封闭的物体,出现孔洞;
- 本应该是流形,但存在非流形(Non-manifold)的边;
- 存在自交多边形;
- 多边形分布不够均匀,存在过于细长的三角形;
- 不符合打印或建模的网格表面;
大部分的网格处理算法都是基于表面封闭且符合2-manifold特性的网格设计的(简单理解为网格表面封闭且光滑),部分算法还需要多边形在网格上分布均匀。
网格质量问题在实际应用中不可避免,例如扫描设备的精度问题、模型的遮蔽问题,文物本身的残缺、图形算法的网格输出存在问题。
1.2 流形与非流形介绍
流形(Manifold)和非流形(Non-Manifold) 是几何学和计算机图形学(尤其是3D建模)中的核心概念,用于描述几何结构的数学性质和拓扑特性。
- 流形(Manifold)
数学定义:
在拓扑学中,流形是一个局部类似于欧几里得空间(如平面或三维空间)的拓扑空间。简单来说,流形的每个点周围的小邻域都可以被“平滑地映射”到平面或三维空间。
例如:
二维流形:球面、平面、环面(甜甜圈形状)等。
三维流形:立方体的表面、闭合的3D模型等。
在3D建模中的定义:
在计算机图形学中,流形网格(Manifold Mesh)是一个严格满足以下条件的多边形网格:
每条边被且仅被两个面共享(没有孤立的边或悬垂边)。
每个顶点至少被三条边连接(避免“刺”状结构)。
没有自交或内部孔洞(闭合且无穿透的结构)。
流形的意义:
可计算性:流形结构是许多几何算法(如布尔运算、曲面细分、物理仿真)的前提条件。
可制造性:流形模型可以直接用于3D打印或工程分析,因为其代表一个“闭合的实体”。
示例:
一个闭合的立方体是流形,因为每条边被两个面共享,所有顶点连接三条边。
- 非流形(Non-Manifold)
定义:
非流形是违反流形规则的几何结构,通常会导致算法错误或无法处理。常见非流形情况包括:
一条边被三个或更多面共享(例如:三个面交汇的T形连接)。
孤立的顶点或边(未被任何面连接)。
自交的几何体(如两个面穿透彼此)。
未闭合的孔洞(如一个立方体缺少一个面)。
非流形的危害:
算法失效:例如布尔运算、网格简化、UV展开等操作可能失败。
无法3D打印:非流形结构无法被识别为实体(例如存在悬垂边或开放面)。
渲染错误:可能导致光线追踪错误或表面法线混乱。
示例:
T形连接:三个面共享一条边(如两个立方体在一条边上重叠)。
悬垂顶点:一个顶点仅连接一条边(如一个立方体表面多出一个“刺”)。
开放表面:一个立方体缺少一个面,导致内部暴露。
- 流形与非流形的对比
特征 | 流形 | 非流形 |
---|---|---|
边的共享数量 | 每条边被两个面共享 | 边被一个或多个三个面共享 |
顶点连接性 | 每个顶点连接至少三条边 | 存在孤立顶点或悬垂顶点 |
闭合性 | 完全闭合(如球体) | 开放孔洞或自交表面 |
算法兼容性 | 支持布尔运算、仿真、3D打印 | 可能导致算法崩溃或错误 |
- 实际应用中的处理
如何检测非流形结构?
使用3D建模软件(如Blender、MeshLab)的“检查网格”工具,自动标记非流形边、顶点或面。
常见检测项:孤立顶点、开放边、多重面共享边。
如何修复非流形?
删除孤立元素:移除未被面连接的顶点或边。
填补孔洞:为开放边界添加缺失的面。
拆分多重边:将共享三个面的边拆分为多条边。
使用修复工具:如Blender的“Clean Up → Make Manifold”或MeshLab的“Remove Non-Manifold Edges”。
- 总结
流形是“数学上干净”的结构,代表闭合、无穿透的几何体,是3D建模和计算的基石。
非流形是“病态结构”,会导致算法错误或制造失败,需在建模过程中避免或修复。
理解流形与非流形是3D建模、计算机图形学和拓扑优化的基础,尤其在工业设计、游戏开发和3D打印中至关重要。
1.3 在CGAL中
定义
vertex表示空间中的点,edge是两个端点(endpoint)之间的线段,一个线段被分成两个方向相反的半边;facet是没有洞(hole)的多边形平面,facet由一串有顺序的循环的半边定义的,这些半边是该面的边缘;多边形表面是可以有洞的,由于每一个facet都不准有洞,每一个facet至少需要两个facet和它相邻。
洞(hole)周围的半边被叫做border halfedge
border halfedge是没有incident facet的,一条edge是border edge当且仅当它的其中一条halfedges是border halfedges,一个表面如果不含border halfedges,那它就是封闭的。一个封闭的表面的是一个多面体在三维空间中的表现。
人为规定
从多面体的外部观察,facet是由逆时针方向排列的半边表示的。点(vertices)周围的halfedges是顺时针排列的,facets的法向量是朝外的(右手定律)。
二维定向流形是指
每个点的周围既不和disc拓扑等价也不和half disc拓扑等价(either homeomorphic to a disc or to a half disc),除非(except for vertices where many holes and surfaces with boundary can join)
此外,最小的代表表面如三角形和四面体,要避免自交(self intersection)。
在欧拉操作(Euler operations)下,二维可定向流形的边界表达是封闭的。
Polyhedron_3<PolyhedronTraits_3>只实现了欧拉操作下的多面体表面的组合完整性(combinatorial integrity)判定,而没有考虑点的坐标或者其他几何信息。
Polyhedron_3<PolyhedronTraits_3> 既能够表达多面体表面,又能够表达多面体。我们将接口设计成了可以忽略border edge,所以用户不需要考虑目标网格是多面体表面还是多面体,统一将该网格当做多面体去操作。
2 网格修补方法
总体来说,当前的网格修补常见的方法分类为:基于点云数据的和基于网格数据的。两者都可以通过体方法和网格方法实现。
对于较为细致的网格或特征区域,必须要求很高的精度才能保持原模型特征。在这一方面使用基于网格的处理算法具有良好的优势。
-
论文A lightweight approach to repairing digitized polygon meshes主要应包含两个过程,一个是拓扑重建(Topology reconstruction),第二是几何校正(Geometry correction)。
-
通常,拓扑重建就是删除离群点,冗余小联通块,修补空洞等。在修补空洞的策略上,可以采用Filling gaps in the boundary of a polyhedron [底部有介绍] 中的三角剖分策略剖分策略,然后依据邻域法线唱的变化来插入新点并调整连接关系。
-
- Main steps of the topology reconstruction phase.
Require: An indexed face set F F F.
Ensure: A single combinatorial manifold M M M.
1: Triangulate all the faces in F F F
2: Initialize M M M with the resulting triangles
3: Compute the triangle-triangle adjacency relations
4: Remove singularities as described in 论文中[16]
5: Remove all the connected components but the largest one
6: Orient the mesh
7: If cuts were necessary then
8: ~~~~~~~~ warn the user and terminate
9: else
10: ~~~~~~ patch mesh holes with new triangless论文中[20]
11: end if
- Main steps of the topology reconstruction phase.
-
- Main steps of the geometry correction phase.
Require: A combinatorial manifold M M M
Ensure: A combinatorial manifold M ′ M' M′ and a status notice (success / failure)
1: M ′ M' M′ := M M M
2: m a x i t e r a t i o n s max_{iterations} maxiterations: =10
3: for k=0 to m a x i t e r a t i o n s max_{iterations} maxiterations do
4: ~~~~~~~~ Run Algorithm 2 with parameters M ′ M' M′ and 3. Let M ~ \widetilde{M} M be the output.
5: ~~~~~~~~ M ′ M' M′: = M ~ \widetilde{M} M
6: ~~~~~~~~ Run Algoithm 3 with parameters M ′ M' M′ and 3. Let M ~ \widetilde{M} M be the output.
7: ~~~~~~~~ M ′ M' M′: = M ~ \widetilde{M} M
8: ~~~~~~~~ if both the algorithms succeeded and M ′ M' M′ has no degenerate faces then
9: ~~~~~~~~~~~~~~~~~~ terminate with success /* M ′ M' M′has no geometric flaw */
10: ~~~~~~~ end if
11: end for
12: terminate with failure
- Main steps of the geometry correction phase.
几何校正包含校正退化元素(比如夹角近乎0或180度,长度近乎0的线段,可以理解为近乎空面积或者夹角过小的三角形),自交多边形,甚至是超过阈值的某个三角边长等。较长的边长可以利用启发式细分三角面片的方法得到更好的网格质量。
稳健性并不是很好,在自交多边形区域过大时,可能失效,需要测试最佳的n-邻域参数。
几何校正中常用的有Swap和Collapse操作。
论文Filling Gaps in the Boundary of a Polyhedron介绍
本文提出了一种用于检测和修复多面体边界缺陷的算法,这些缺陷通常由CAD软件中的问题导致,表现为边界上的小缝隙。这些缝隙由仅与一个多面体面相连的边组成,而正常情况下每条边应与两个面相连。文章通过部分曲线匹配技术和三维多边形的最优三角剖分来修复这些缺陷,并证明了寻找一致的部分曲线匹配集合是一个NP-Hard问题。实验结果表明,该算法在多个多面体模型上表现出色。
1. 研究背景
在CAD模型的多面体近似中,边界通常由高阶曲线实体描述。由于曲面处理、相邻曲面的交线处理不当,或者曲面修剪曲线的错误处理,边界可能出现缝隙。这些缝隙可能导致多面体边界不连续,甚至形成小孔,从而影响依赖边界连续性的应用,如有限元分析和光栅化算法。
2. 方法概述
算法分为三个主要步骤:
- 数据获取:识别多面体边界的连通分量,确定边界边,并将它们分组成边界多边形。
- 边界部分匹配:通过离散化边界多边形并投票选择最佳匹配对,然后选择一致的匹配集合。
- 填充缝隙:将匹配的边界部分通过三角形连接起来,并对剩余的孔洞进行三角剖分。
3. 数据获取
输入为多面体的边界描述,包括顶点列表和面列表。算法首先生成面之间的邻接信息(如果输入中未提供),然后通过深度优先搜索计算边界的连通分量,并确定每个分量的方向。边界边被识别为仅与一个面相连的边,并被组织成边界多边形。
4. 边界部分匹配
4.1 边界离散化
每个边界多边形被离散化为一系列等间距的点,这些点之间的弧长由参数 ( s ) 决定。离散化后的边界多边形被视为“签名”,用于后续的匹配过程。
4.2 投票选择匹配
对于每对边界多边形,通过比较离散化后的点对之间的距离来投票选择可能的匹配。如果两个点之间的距离小于阈值 ( \epsilon ),则为这两个边界多边形之间的匹配投票。匹配分为“直接匹配”和“反转匹配”,分别对应于两个边界多边形的方向关系。
4.3 匹配选择
投票结果被转换为部分匹配的建议,每个建议都有一个分数,表示匹配的质量。选择一个一致的匹配子集,使得总分数最大化。这一过程被证明是NP-Hard的,因此作者采用了一种近似方案来解决。
5. 填充缝隙
5.1 连接匹配的边界部分
对于每对匹配的边界部分,通过添加三角形将它们连接起来。这一过程类似于合并两个有序列表,通过选择较短的边来逐步构建三角形。
5.2 孔洞三角剖分
在连接匹配的边界部分后,可能会在裂缝的交汇处留下小孔。这些孔洞被识别为新的边界多边形,并通过最小面积三角剖分技术进行填充。具体而言,算法通过动态规划方法找到一个三角剖分,使得所有三角形的面积之和最小。
6. 复杂度分析
算法的时间复杂度主要取决于输入的大小 ( k )(多面体的顶点数)和离散化后的边界点数 ( n )。主要步骤的时间复杂度如下:
- 数据获取:( O(k) )
- 投票和匹配选择:( O(n) )
- 连接匹配的边界部分:( O(n) )
- 孔洞三角剖分:在最坏情况下为 ( O(n^3) ),但在实际应用中通常为 ( O(n) )
总体而言,算法在实际应用中的平均时间复杂度为 ( O(k + n) ),在最坏情况下为 ( O(k + n^3) )。
7. 实验结果
作者在多种CAD模型上测试了该算法,包括由不同CAD系统生成的模型。实验结果表明,算法在大多数情况下都能成功修复边界缝隙。参数调整较为鲁棒,但在某些情况下,投票阈值 ( \epsilon ) 的选择对结果影响较大。如果 ( \epsilon ) 过小,可能会丢失匹配;如果过大,可能会引入过多噪声。
8. 结论
本文提出了一种用于修复多面体边界缝隙的算法,结合了部分曲线匹配和最小面积三角剖分技术。该方法在实际应用中表现出色,能够有效解决CAD模型中常见的边界问题。