1、介绍
参数化曲面相当于找到一个从合适的域到曲面的单射映射。一个好的映射是在某种意义上最小化角度失真(保角参数化)或面积失真(等面积参数化)的映射。在这个包中,我们专注于参数化与圆盘或球体同胚的三角化曲面,以及平面域上的分段线性映射。
尽管第一个参数化方法的主要动机是应用于纹理映射,但现在它经常用于映射更复杂的调制信号(如法线、透明度、反射或光调制图),拟合散乱数据,重新参数化样条曲面,修复CAD模型,近似曲面和重网格化。
这个包实现了表面参数化方法,如尽可能刚性的参数化、Tutte重心映射、离散真实参数化、离散共形映射、最小二乘共形映射、浮动均值坐标或Orbifold Tutte Embeddings。这些方法主要通过它们最小化的变形(角度与面积)、平面域上的约束边界(凸多边形与自由边界)以及映射的双射性保证来区分。
该软件包为 FaceGraph 概念的任何模型提供了一个接口,例如 Surface_mesh、Polyhedron_3、Seam_mesh 类或 OpenMesh 的网格类。
备注:
Seam_mesh类可用于虚拟切割网格,允许在符合磁盘或球体拓扑要求的子域中转换输入网格。
由于参数化网格需要高效的稀疏矩阵表示和高效的迭代或直接线性求解器,我们为线性求解器提供了统一的接口.
请注意,线性解算器通常使用双精度浮点数。因此,此包旨在与具有双精度的CGAL笛卡尔核一起使用。
通过最小二乘保形贴图参数化进行纹理贴图。顶部:原始网格和纹理。底部:参数化网格(左侧:参数空间,右侧:纹理网格)。
2、基础
2.1、默认曲面参数化
从用户的角度来看,此包最简单的入口点是以下函数:
template <typename TriangleMesh, typename VertexUVMap>
Error_code parameterize(TriangleMesh & mesh,
boost::graph_traits<TriangleMesh>::halfedge_descriptor bhd,
VertexUVMap uvm);
函数parameterize()将默认曲面参数化方法,即浮点均值坐标(见浮点均值坐标部分),应用于具有半边bhd给定边界的三角形网格类型的网格的连通分量。该边界采用弧长圆形边界参数化进行参数化。使用Eigen库的稀疏线性求解器。
三角形网格类型的网格必须是 FaceGraph 概念的模型,并且必须另外进行三角剖分、2-流形、定向并且与圆盘同胚(可能带有孔)。最后一个要求并不难,我们稍后将展示如何参数化一个不是拓扑圆盘的网格(切割网格一节)。结果存储在网格顶点的属性映射中(其类型在这里是 VertexUVMap)。
CGAL::Surface_mesh_parameterization 是CGAL(Computational Geometry Algorithms Library)库中的一个模块,用于对三角网格进行参数化。参数化是将一个形状映射到一个平面区域的过程,以便进一步处理或可视化。
CGAL::Surface_mesh_parameterization 提供了一组算法和工具,用于将三角网格的表面映射到二维参数域。这可以用于各种应用,如纹理映射、网格修复、曲面重建等。
该模块支持多种参数化方法,包括但不限于:
保角参数化:通过保持角度信息来映射网格顶点到参数域中的点。
等面积参数化:通过最小化面积变形来映射网格顶点到参数域中的点。
刚性参数化:通过保持网格的几何形状和拓扑结构来映射网格顶点到参数域中的点。
使用CGAL::Surface_mesh_parameterization,您可以对三角网格进行高效且高质量的参数化。您可以根据具体需求选择适当的参数化方法,并使用CGAL提供的工具和算法来处理和优化参数化结果。
输入(左)、参数空间(中)和纹理网格(右)。
CGAL::Surface_mesh_parameterization::parameterize 是CGAL库中用于对三角网格进行参数化的函数。它的参数可能因不同的实现和版本而有所不同,但通常包括以下参数:
输入网格(Input Mesh)要参数化的三角网格。
输出参数域(Output Parameter Domain):用于存储参数化结果的参数域。
参数化方法(Parameterization Method):选择要使用的参数化方法,例如保角参数化、等面积参数化或刚性参数化等。
约束边界(Boundary Constraints):如果存在需要保持不变的边界区域,可以提供约束边界的参数。
此外,可能还有其他可选参数,如设置权重因子、指定目标参数域的形状等。具体的参数列表和用法可能会根据CGAL库的版本和实现有所不同,因此建议查阅相应的文档或参考示例代码以获取准确的信息。
2.2、选择参数化算法
此包提供了第二个parameterize()入口点,用户可以在其中指定参数化方法:
template <typename TriangleMesh, typename Parameterizer_3, typename VertexUVMap>
Error_code parameterize(TriangleMesh& mesh,
Parameterizer_3 parameterizer,
boost::graph_traits<TriangleMesh>::halfedge_descriptor bhd,
VertexUVMap uvm);
它计算从三维三角形曲面网格到简单二维域的一对一映射。映射在三角形网格上是分段线性的。结果是输入网格的每个顶点的一对(u,v)参数坐标。根据Parameterizer_3算法的选择,可以保证一对一映射,也可以不保证。
3、曲面参数化的方法
这个CGAL包实现了表面参数化方法,如尽可能刚性、图特重心、离散保角参数化、离散保形映射、最小二乘保形映射、浮动均值坐标或orbifold Tutte嵌入。这些方法作为Parameterizer_3概念的模型提供。
根据所需的边界参数化类型,不同的参数化方法可分为三类:固定边界、自由边界和无边界。
不同方法的插图都是用相同的输入模型,即手模型获得的,如下图所示。手是一个拓扑球体,使用Seam_mesh将其切割成拓扑圆盘。在下图中,接缝被标记为红色,用于Orbifold Tutte参数化的四个锥体(Orbifold Tutte Embeddings部分)被标记为绿点。
本节中不同方法插图中使用的基础网格。接缝用红色描绘。用绿点标记的顶点是圆锥体。
3.1、固定边界曲面参数化
固定边界曲面参数化的特征是在参数空间中具有受约束的边界:沿边界的每个顶点有两个(u,v)坐标。这种边界参数化方法有不同的选择,如“固定方法的边界参数化”一节所述。
3.1.1、所有重心映射
Surface_mesh_parameterization::Barycentric_mapping_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
Tutte Barycentric映射参数化(蓝线表示切割图)。最右边:参数空间。
Tutte引入了重心映射参数化方法。在参数空间中,每个顶点都放置在其邻居的重心上,以达到所谓的凸组合条件。该算法相当于为每组参数坐标求解一个稀疏线性系统,其中有一个#vertices x #vertices稀疏对称正定矩阵(如果线性系统消除了边界顶点)。对于连接顶点vi和vj的边,矩阵的系数(i,j)设置为1,对于对角元素,减去顶点vi的度数,对于任何其他矩阵条目,设置为0。虽然当边界是凸形时,保证双射映射,但这种方法既不能最小化角度,也不能最小化面积失真。
3.1.2、离散Authalic参数化
Surface_mesh_parameterization::Discrete_authalic_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
Desbrun等人引入了离散逼真参数化方法。它对应于保面积方法的弱形式,本质上局部最小化面积失真。只有满足凸组合条件并且边界是凸的,才保证了一对一的映射。这种方法求解了两个#vertices x #vertices稀疏线性系统。矩阵(两个系统都相同)是不对称的。
离散Authalic参数化(蓝线表示切割图)。最右边:参数空间。
3.1.3、离散共形映射
Surface_mesh_parameterization::Discrete_conformal_map_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
Eck等人将离散共形映射参数化引入到图形社区。它试图通过最小化Pinkall和Polthier导出的离散形式的狄利克雷能量来降低角度变形。只有满足以下两个条件时,才能保证一对一映射:重心映射条件(参数空间中的每个顶点都是其相邻顶点的凸组合),以及边界是凸的。这种方法解决了两个#vertices x #vertices稀疏线性系统。矩阵(两个系统都是一样的)是稀疏的、对称的正定矩阵(如果线性系统消除了边界顶点,并且网格中没有孔),因此可以使用专用线性求解器有效地求解。
离散保形映射。最右边:参数空间。
3.1.4、浮动平均值坐标
Surface_mesh_parameterization::Mean_value_coordinates_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
Floater 引入了均值坐标参数化方法。参数空间中的每个顶点都被优化为其相邻顶点的凸组合。这种方法本质上是对离散共形映射的近似,当边界是凸的时,保证了一对一的映射。这种方法解决了两个#vertices x #vertices稀疏线性系统。矩阵(两个系统都是一样的)是不对称的。
浮动平均值坐标。最右边:参数空间。
3.1.5、迭代Authalic参数化
Surface_mesh_parameterization::Iterative_authalic_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
迭代真实参数化方法由 Jain 等人引入。这种参数化是一种固定的边界参数化,是真实参数化家族的一部分,这意味着它的目标是最大限度地减少输入曲面网格和参数化输出之间的面积失真。更准确地说,该参数化器使用的方法是在网格上迭代地重新分配 L2 拉伸——如 Sander 等人所定义的。
迭代Authalic参数化(蓝线表示切割图)。最右边:参数空间。
尽管这是一种固定边界参数化方法,但它不能保证一对一的映射。然而,在实践中,它将以比其他自参数化方法更小的失真产生有效的结果。
3.1.6、固定方法的边界参数化
边界的参数化方法被用作修改 Parameterizer_3 模型行为的特征类。它们也被作为 Parameterizer_3 概念的模型提供。固定边界曲面参数化的边界参数化是一系列定义一组约束的方法,即沿边界的每个顶点有两个 u,v 坐标。
在为固定边界方法选择边界参数化时,用户可以选择不同的选项:
用户可以在两种常用方法中选择边界参数化:均匀参数化或弧长参数化。
用法:均匀边界参数化更稳定,但视觉效果较差。默认使用弧长边界参数化。
由两个标准形状中的一个形状指定的凸形:圆形或方形。
用法:默认情况下使用圆形边界参数化,因为它对应于最简单的凸形。方形边界参数化通常用于纹理映射。
左:Julius Cesar面具参数化与Authalic/圆形边界。右图:朱利叶斯·塞萨尔面具上的浮动/方形边框。
均匀/弧长和圆形/方形的所有组合由以下类别提供:
Surface_mesh_parameterization::Circular_border_arc_length_parameterizer_3<TriangleMesh>
Surface_mesh_parameterization::Circular_border_uniform_parameterizer_3<TriangleMesh>
Surface_mesh_parameterization::Square_border_arc_length_parameterizer_3<TriangleMesh>
Surface_mesh_parameterization::Square_border_uniform_parameterizer_3<TriangleMesh>
CGAL::Surface_mesh_parameterization::Square_border_uniform_parameterizer_3 是一个类模板,用于将三维曲面网格的边界参数化为均匀的矩形边界。
这个类模板提供了将曲面网格的边界映射到矩形区域的方法,使得边界上的每个顶点都映射到矩形边界上的相应位置。这对于一些需要将三维曲面网格转换为二维矩形网格的应用场景非常有用,例如计算机图形学、计算机视觉和数值分析等领域。
3.2、自由边界曲面参数化
对于自由边界参数化方法,边界的顶点可以自由移动。
3.2.1、最小二乘保形映射
Surface_mesh_parameterization::LSCM_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
XXX等人引入了最小二乘保角映射(LSCM)参数化方法。它对应于具有自由边界的保角方法(至少两个顶点必须受到约束以获得唯一解),这允许进一步降低角度失真。这种方法不能保证一对一映射。它在最小二乘意义下求解一个(2×#三角形)×#顶点的稀疏线性系统,这意味着求解一个对称矩阵。
最小二乘保形映射。最右边:参数空间。
3.2.2、尽可能刚性的参数化
Surface_mesh_parameterization::ARAP_parameterizer_3
<TriangleMesh, BorderParameterizer, SolverTraits>
刘等人引入了一种尽可能刚性的参数化方法。这是一种基于迭代能量最小化过程的形状保持方法。每一步都交替使用局部优化技术来寻找最佳的局部映射,以及与线性系统分辨率相当的全局拼接技术,以确保参数化网格是三角形的。
局部优化公式的推广引入了一个标量系数λ,允许用户平衡角度和形状失真:λ越接近0,越重视角度失真的最小化;相反,当λ增大时,参数化器越来越重视形状失真的最小化。
“尽可能刚性”参数化(蓝线表示剪切图)。最右边:参数空间。
3.2.3、自由方法的边界参数化
边界的参数化方法被用作修改 Parameterizer_3 模型行为的特征类。它们也被作为 Parameterizer_3 概念的模型提供。与自由边界曲面参数化方法相关的边界参数化仅定义了两个约束:固定顶点。
Surface_mesh_parameterization::Two_vertices_parameterizer_3<TriangleMesh>
用法:Surface_mesh_parameterization::Two_vertices_parameterizer_3<TriangleMesh>是默认的自由边界参数化,也是此软件包当前版本中唯一可用的参数化。
3.3、 无边界曲面参数化
无边界参数化方法不需要与圆盘同胚的网格作为输入。
3.3.1、Orbifold Tutte Embeddings
Surface_mesh_parameterization::Orbifold_Tutte_parameterizer_3
<SeamMesh, SolverTraits>
Orbifold-Tutte平面嵌入由Aigerman和Lipman引入,是Tutte嵌入到其他拓扑的推广,特别是球面,我们在这里考虑。Orbifold-Tutte嵌入将原始曲面(要求是拓扑球面)双射到称为欧几里得orbifold的规范、拓扑等价的二维平面。有17个欧几里得orbifold,其中只有4个球面orbifold目前在CGAL的GIMP中实现。
orbifold-Tutte嵌入产生了一种无缝的、全局双射的参数化,与经典的Tutte嵌入类似,只需要求解一个稀疏的线性系统来进行计算。
该算法要求用户选择输入网格的一组顶点并将其标记为锥体,这些锥体将是展开的奇点。在内部,该过程需要使用锥体之间的(虚拟)接缝,但这些接缝的选择不影响结果。 Seam_mesh结构(另见切割网格一节)用于此目的。
(四个)基础圆锥体显示为绿色,虚拟切割显示为蓝色。最右边:参数空间。
4、剪切网格
该包中提出的曲面参数化方法仅处理与圆盘同胚(拓扑等效)的网格。然而,只要用户指定了定义拓扑盘边界的割图(一组边),就可以对具有任意拓扑和连接组件数量的网格进行参数化。这些边可以通过Seam_mesh结构与网格一起传递。
剪切图
5、复杂度和保证
固定边界:
一对一映射;图特定理保证了一对一的映射,前提是权重都是正的,边界是凸的。图特重心映射和浮点均值坐标就是这种情况。离散共形映射(余切)、离散真圆和迭代真圆参数化并不总是这样。
矩阵的非奇异性:如果矩阵是对角线占优的,则Geshorgin定理保证了求解器的收敛性。权重为正的情况就是这样(Tutte重心映射和浮动均值坐标)。
自由边界:
一对一映射;LSCM或ARAP参数化(可能出现全局重叠和三角形翻转)均不提供保证。
矩阵的非奇异性:对于LSCM,系统的矩阵是具有最大秩的矩阵的Gram矩阵,因此是非奇异的(Gram定理)。
无边界:
一对一映射;Orbifold-Tutte嵌入是保证存在的,并且可以通过稀疏线性系统进行计算。
6、其他
orbifold Tutte嵌入是一种参数化方法,它对Tutte的嵌入进行了泛化,使其适用于其他曲面拓扑,尤其是球面曲面的常见但未经处理的情况。
在参数化过程中,orbifold Tutte嵌入强制执行某些边界条件,以实现欧几里得双峰结构。与经典的Tutte嵌入类似,它只需要求解稀疏线性系统即可进行计算。如果使用了余切权重,orbifold Tutte嵌入将全局Dirichlet能量最小化,并显示为近似保形和四点拟保形映射。
orbifold Tutte嵌入还可以用于生成具有三个或四个地标和球型对称图案的双射表面间映射。
图特重心的曲面参数化是一种参数化方法,它基于图特重心坐标的概念对曲面进行参数化。
在参数化过程中,图特重心坐标被用于定义曲面上每个点的位置。通过计算每个点在邻域内的重心,可以获得一组参数,这些参数可以表示曲面上每个点的位置。
图特重心坐标具有一些重要的性质,例如它们是保形的,即保持曲面的形状不变。此外,图特重心坐标还可以有效地处理复杂的曲面几何形状。
在实现图特重心的曲面参数化时,通常需要使用数值方法来计算重心坐标。这可能涉及到求解线性方程组或使用其他数值方法来求解重心坐标。
需要注意的是,图特重心的曲面参数化可能不适用于所有类型的曲面。对于一些复杂的曲面几何形状,可能需要采用其他参数化方法。
Orbifold Tutte Embeddings是一种曲面参数化的方法,其基本思想是在参数化过程中强制执行某些边界条件,以实现欧几里得双峰结构。该方法是无缝的全局双射参数化,与经典的Tutte嵌入类似,只需要求解稀疏线性系统即可进行计算。如果使用了余切权重,Orbifold Tutte嵌入将全局Dirichlet能量最小化,并显示为近似保形和四点拟保形映射。它是第一个对保形映射产生双射近似的全线性方法。
除了参数化,Orbifold Tutte Embeddings还可以用于生成具有三个或四个地标和球型对称图案的双射表面间映射。这种方法适用于各种曲面拓扑,尤其是球面曲面的常见但未经处理的情况。
CGAL::Seam_mesh是一个用于处理缝纫网格(Seammesh)的类。缝纫网格是一种特殊的网格类型,用于表示和处理三维模型的缝合部分。它主要用于三维模型的缝合和重构,以及计算机图形学和计算机视觉中的其他相关任务。
CGAL::Seam_mesh类提供了用于创建、操作和查询缝纫网格的功能。它支持对缝纫网格的顶点、边和面进行操作,包括添加、删除、修改等操作。此外,它还提供了一些函数和算法,用于执行缝纫网格的合并、修剪、重构等操作。
使用CGAL::Seam_mesh类,您可以方便地处理三维模型的缝合部分,并对其进行各种操作和查询。这对于计算机图形学、计算机视觉和三维建模等领域的应用非常有用。
CGAL 5.6 - Planar Parameterization of Triangulated Surface Meshes: User Manual