大多数真实世界的模型是由共享顶点的三角形组成的复合体。这些通常被称为三角网格(triangular meshes)、三角形网格(triangle meshes)或三角形不规则网络(trian-gular irregular networks,TINs),有效地处理它们对许多图形程序的性能至关重要。取决于不同的应用,这种类型的效率至关重要。网格存储在磁盘上和内存中,我们希望尽量减少存储的消耗。当网格通过网络传输或从CPU传输到图形系统时,它们会消耗带宽,而带宽通常比存储更宝贵。在对网格执行操作的应用程序中,除了简单地存储和绘制它们之外——例如细分、网格编辑、网格压缩或其他操作——对邻接信息的有效访问是至关重要的。

三角形网格通常用于表示曲面,因此网格不仅仅是不相关三角形的集合,而是通过共享的顶点和边相互连接以形成单个连续曲面的三角形网络。这是关于网格的一个关键见解:一个网格可以更有效地处理,相较于相同数量的不相关三角形的集合。

三角形网格所需的最小信息是一组三角形(顶点的三元组)及其顶点的位置(在三维空间中)。但是许多程序要求能够在顶点、边或面存储额外的数据,以支持纹理映射、着色、动画和其他操作。顶点数据是最常见的:每个顶点可以有材质参数,纹理坐标和辐照度,这些参数的值在表面上改变。然后,这些参数在每个三角形上线性插值,在网格的整个表面上定义一个连续函数。然而,能够在每条边或每面存储数据有时也很重要。

12.1.1 Mesh Topology 网格拓扑学

曲面形状的网格可以形式化为网格拓扑的约束——三角形连接在一起的方式,而不考虑顶点位置。许多算法只能在具有可预测连接的网格上工作、或更容易实现。网格拓扑最简单和最具限制性的要求是曲面是流形(manifold)。流形网格是“水密的”——它没有缝隙,将表面内部的空间与外部的空间分开。它在网格上看起来也像一个表面。

”流形“(manifold)这个术语来自拓扑学的数学领域:粗略地说,流形(特别是二维流形,或2-流形)是 一种表面,其中任何一点周围的一个小的邻域都可以被平滑成一个小的平面。这个想法可以通过反例得到最清楚的解释:如果网格上的一条边有三个三角形连接到它,那么边缘上一个点的邻域与其中一个三角形内部一个点的邻域是不同的,因为它有一个额外的“鳍”伸出来(图12.1)。如果边缘上恰好有两个三角形,边缘上的点就像内部的点一样有邻域,只是中间有一条折痕。类似地,如果共享一个顶点的三角形处于图12.2中左侧的配置,则邻域就像在中心粘在一起的两块表面,如果不将其绕过,就不能将其压平。右边所示的具有简单邻域的顶点就可以了。

截屏2023-03-07 下午2.09.51.png

截屏2023-03-07 下午2.09.59.png

许多算法假设网格是流形的,如果你输入一个畸形的网格,验证这个属性可以防止崩溃或无限循环。这个属性验证可以归结为检查所有的边都是流形的,并通过验证以下条件检查所有的顶点都是流形的:

图12.1说明了一条边如何因为三角形太多而无法通过第一次测试,图12.2说明了一个顶点如何因为附加了两个独立的三角形循环而无法通过第二次测试。

流形网格很方便,但有时,允许网格有边缘或边界是必要的。这样的网格不是流形——边界上的一个点的领域在一侧被切断。它们不一定是“水密”的。然而,我们可以将流形网格的要求放宽到有边界流形的要求,而不会对大多数网格处理算法造成问题。放宽的条件是:

图12.3说明了这些条件:从左到右,有一条边在一个三角形上;一个顶点其相邻三角形集边相连通;以及一个带有两个不连通三角形集的顶点。

截屏2023-03-07 下午2.34.37.png

最后,在许多应用中,能够区分表面的“正面”、“反面”或“外部”与“内部”是很重要的——这就是表面的方向。对于单个三角形,我们根据顶点列出的顺序定义方向:正面是三角形的三个顶点按逆时针顺序排列的一侧。一个连通的网格,如果它的三角形都一致认为哪边是正面,这是正确的,当且仅当每一对相邻三角形的方向一致。

在一个方向一致的三角形对中,两个共享顶点以相反的顺序出现在两个三角形的顶点列表中(图12.4)。重要的是方向的一致性——一些系统使用顺时针而不是逆时针的顺序来定义正面。

截屏2023-03-07 下午2.48.47.png

任何具有非流形边的网格都不能一致地定向。但也有可能一个网格是一个有效的有边界的流形(甚至是一个流形),但没有一致的方法来定位三角形方向——即它们不是可定向的曲面。图12.5所示的Möbius带就是一个例子。然而,在实践中这类问题很少见。