购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 多边形网格建模

多边形网格建模是计算机图形学中最常见、最基础的三维建模技术。它通过连接多个顶点来形成多边形,进而构建复杂的三维模型。这种建模方法通过定义顶点、边和面之间的拓扑关系,可以精确地表示物体的几何形状,并为后续的渲染和动画过程提供必要的数据支持。

3.2.1 基本概念

在深入学习多边形网格建模技术之前,首先需要理解构成多边形的基础元素,这些元素包括顶点、边、面和网格。这些元素共同构成了三维模型的基础结构,使复杂的三维形状可以通过计算机进行创建和操作。

1.顶点

顶点(Vertex)是多边形网格建模中最基本的元素,它代表三维空间中的一个位置点。每个顶点都可以由三维坐标( x y z )来表示,这个三元数组精确地标定了顶点在三维世界中的位置。

2.边

边(Edge)是一维几何元素,是连接两个顶点的线段,也是物体相邻面的交界。在多边形网格中,边不仅定义了顶点之间的关系,还会对模型的拓扑结构产生影响。边的长度、方向和数量都可以根据建模的需要进行调整,从而创建出更加精细和复杂的模型结构。

3.面

面(Face)是由至少三个顶点按顺序连接形成的封闭图形,它是二维几何元素,定义了多边形网格的表面。面是构成三维模型表面的基本单元,具有方向性,一般用某个面的外法向量作为该面的正向。

在三维建模中,最常见的面是三角形和四边形,因为它们可以无歧义地定义表面的法线,这对于光照和渲染非常重要。面可以是简单的平面,也可以是复杂的曲面,通过调整面的形状和大小,就可以创造出平滑圆润或棱角分明的三维物体。

4.网格

网格(Mesh)是由顶点、边和面组成的整体结构,它构成了三维模型的完整表示。网格是一个连续且闭合的几何体,任何物体都可以通过网格来精确地表示。网格可以是静态的,也可以是动态的,并且支持动画和形变。网格的拓扑结构对于模型的质量和性能有着重要影响。一个良好的网格应该具有清晰的拓扑结构,顶点和面的布局应尽可能均匀,以避免在渲染时产生不自然的视觉效果。网格的质量和复杂度都直接影响模型的外观细节和计算效率,因此,在建模过程中,应根据实际需求来选择合适的网格密度和复杂度。

3.2.2 多边形网格

多边形网格是顶点、边以及面的集合。这种网格可以用于创建各种三维模型,从简单的几何形状到复杂的有机结构。图3-1展示了斯坦福兔子模型的多边形网格。可以用一个多元组( V C )来定义网格 M ,即 M =( V C ),其中 V ={ V 1 V 2 ,…, V n }表示网格的顶点集合,其中 V i 是三维空间中的一个点, n 是顶点总数; C 代表点与点之间的连接关系,即顶点与顶点间连接成线,再连接成面。

图3-1 斯坦福兔子的多边形网格

多边形网格可以根据不同的属性和应用场景进行分类,选取不同类型的多边形网格可以满足不同的建模需求,优化模型结构。

1.凸多边形和凹多边形

在计算机图形学和几何学中,一个多边形可以根据其形状特性分为凸多边形和凹多边形。

凸多边形是指所有内角都小于180°的多边形,任意凸多边形的外角和为360°。在凸多边形中,任意两个顶点之间的线段都位于多边形的内部或边界上。凸多边形的边界可以简单地用顶点的列表来表示,不需要额外信息。在计算几何中,凸多边形通常更容易处理,例如在碰撞检测和光线投射的场景中。在三维建模中,凸多边形常用于创建简单的几何体和规则的结构。

凹多边形是指至少有一个内角大于180°的多边形。这意味着在凹多边形中,存在一个或多个“凹进”的部分,这使得多边形的边界更加复杂,因此凹多边形的表示和处理通常比凸多边形更复杂。在计算几何中,凹多边形往往需要使用更复杂的算法来处理。不过,凹多边形也有更多样的表现形式,在三维建模和动画中,凹多边形能够创建更加丰富和复杂的形状,更适合复杂的场景和角色设计。

在实际应用中,凸多边形常用于建筑建模、游戏环境设计等场景,因为它们的简单性质使得渲染和碰撞检测更加高效。凹多边形则适用于创建更加复杂的自然景观、角色服装或其他不规则形状的物体。凸多边形和凹多边形的处理方法和算法有所不同,因此在设计和实现相关功能时,需要根据多边形的类型来选择合适的技术方案。

2.三角形网格和四边形网格

根据面的形状,网格可以分为三角形网格和四边形网格。三角形网格和四边形网格是两种常见、重要的多边形网格类型。

三角形网格是一种由三角形面组成的多边形网格。在这种网格中,每个面都是一个三角形,每个顶点连接三条边。由于三角形是最稳定的多边形,在三维空间中可以无歧义地定义一个平面,因此这种网格在处理和渲染时非常可靠,尤其适合应用于动态场景和实时渲染任务。此外,三角形网格具有简单的拓扑结构和优良的几何特性,使得光照和纹理映射更加直接高效。在许多三维图形应用中,三角形网格被广泛用作表面表示的基础。

四边形网格是由四边形面片组成的网格结构。每个四边形面片由四个顶点和四条边构成,从而形成一个矩形或梯形等形状。四边形网格可以简化纹理映射过程,使得纹理图像能够更自然地贴合到物体表面上。

在实际应用中,三角形网格更加常见。三角形网格具有更强的灵活性和适应性,能够处理各种复杂的形状和拓扑结构。在后续内容中,我们将详细介绍三角形网格。

3.流形网格和非流形网格

在三维几何建模中,多边形网格的拓扑结构决定了顶点、边和面的连接方式,这对于模型的数学表示和后续的处理具有重要的影响。根据拓扑结构的不同,多边形网格可以分为流形网格和非流形网格两类。

流形网格是一种具有良好拓扑结构的多边形网格。在流形网格中,每一条边都恰好被两个面共享,而每个顶点的相邻面则构成一个连续的环。这种网格的局部欧几里得特性使得它易于理解和处理。流形网格的应用非常广泛,特别是在需要精确几何表示的领域,如三维打印、计算机辅助设计(Computer Aided Design,CAD)和物理模拟。流形网格的优势在于能够有效避免拓扑错误和几何奇异性,确保模型的质量和一致性。此外,在计算机图形学的许多算法中,如网格简化、平滑和细分,流形网格都表现出了良好的性能。

与流形网格相对应的是非流形网格,这种网格的拓扑结构不满足流形的定义。非流形网格包含多种拓扑问题,例如T形顶点(一个顶点连接多个面)、悬挂边(边的一端没有连接到任何面)或自相交面(面与自身相交)。这些问题导致顶点连接多个不连续的环,或者边无法形成封闭的循环。虽然非流形网格在处理上较为复杂,但它们在某些情况下能够提供更大的灵活性,从而表示一些特殊的几何形状,例如折纸、复杂的雕塑或其他非标准的设计。在处理非流形网格时,通常需要特殊的算法和技术来解决拓扑问题,以确保模型的正确性和可用性。

在实际应用中,选择流形还是非流形网格主要取决于具体的建模需求和应用目标。对于大多数工程和科学应用来说,流形网格因其稳定性更好和易于处理而常被采用。在艺术创作和某些设计领域中,非流形网格能提供更多的创造空间。

4.网格简化和网格细分

在三维建模与计算机图形学领域中,根据网格的复杂性,可以对多边形网格进行网格简化和网格细分(如图3-2所示)。

图3-2 网格简化和网格细分

网格简化的目标是通过减少模型的几何复杂度来优化渲染性能和减少内存占用。网格简化通过算法对原始模型进行降阶处理,移除那些对视觉影响不大的顶点和面,从而降低模型的详细程度。尽管细节有所减少,但简化后的网格仍能够保持足够的视觉质量,以满足特定应用的需求。网格简化特别适用于对性能要求较高的实时渲染场景,如移动平台游戏、虚拟现实应用以及包含大量模型元素的大规模场景渲染。在这些应用中,网格简化能够有效提高渲染速度、减少延迟,同时保持可接受的视觉输出。

网格细分旨在创建具有高几何细节的模型。这类网格通过丰富的顶点和面来精确地表示模型的表面特征,从而提供高度逼真的视觉效果。网格细分适用于对视觉质量有极高要求的应用领域,例如电影和电视的视觉效果制作、高端游戏的开发以及其他需要高度真实感的场景再现。在这些应用中,网格细分能够展现出复杂的表面纹理、精细的光影变化和精确的几何形状,从而增强观众的视觉体验。不过,网格细分对计算资源和存储空间的要求较高,通常需要有强大的硬件支持并使用更精细的渲染技术。

在实际应用中,选择简化网格还是网格细分需根据项目的具体需求、目标平台的性能限制以及预期的视觉效果来决定。在性能受限的环境中,应用网格简化是实现实时渲染的有效途径;而在追求视觉质量的场合,应用网格细化则能够提供更高水平的视觉表现。此外,还可以采用多细节层次(Level of Detail,LOD)的技术,根据观察距离和渲染需求来动态切换不同复杂度的网格,以平衡性能和视觉效果。

3.2.3 三角形网格

三角形网格(Triangle Mesh)是计算机图形学中用于表示三维模型表面的一种基本数据结构。它由一系列三角形组成,每个三角形由三个顶点定义,并通过共享的顶点和边来相互连接。多边形网格由多边形集合组成,三角形网格则是由三角形组成的多边形网格,并且任意多边形网格都能转换成三角形网格。相对于一般的多边形网格,许多操作对三角形网格来说更容易。

为了优化存储和渲染效率,三角形网格可以采用特殊的数据结构,比如三角形带和三角形扇。

如图3-3所示,三角形带是一种连续的三角形序列,其中每个新三角形都与前一个三角形共享一条边,它可以无歧义地通过枚举顶点来表示一组三角形。记 V ={ V 1 V 2 ,…, V n }( n ≥3)是一个顶点集合,则三角形带 S 可以表示为由这些顶点按照特定顺序构成的一系列三角形的集合,定义为 S ={( V 1 V 2 V 3 ),( V 2 V 3 V 4 ),…,( V n -2 V n -1 V n )},其中,每个三角形( V i V i +1 V i +2 )与前一个三角形( V i -1 V i V i +1 )共享一条边( V i V i +1 )。这里,顶点 V 1 可以被视为三角形带的起始顶点, V n 为结束顶点。

图3-3 三角形带

三角形带可以减少顶点数据的重复,从而提高渲染效率。然而,这种结构不适合表示具有复杂拓扑结构的模型,因为它们需要额外的转换步骤。

共享一个顶点的一组相邻三角形称为三角形扇(Triangle Fan)。三角形扇从一个公共顶点开始,每个后续的三角形都与这个公共顶点和前一个三角形共享一条边。记 V ={ V 1 V 2 ,…, V n }( n ≥2)是一个顶点集合, V 1 为公共顶点。三角形扇 F 是由这些顶点按照特定顺序构成的一系列三角形的集合,定义为 F ={( V 1 V 2 V 3 ),( V 1 V 3 V 4 ),…,( V 1 V n -1 V n )},其中,每个三角形( V 1 V i V i +1 )与前一个三角形( V 1 V i -1 V i )共享边( V 1 V i )。在三角形扇中,顶点 V 0 是所有三角形共享的公共顶点,而 V 1 ,…, V n 是围绕 V 0 顶点的其他顶点,如图3-4所示。

图3-4 三角形扇

与三角形带类似,三角形扇也可以减少顶点数据的重复,但它们在表示模型时提供了更多的灵活性,因为它们可以围绕一个中心构建多边形。

这些特殊的格式通过减少顶点的重复来优化数据传输,但在某些情况下可能不适用或需要转换为标准的三角形网格。

3.2.4 网格化算法

网格化算法是三维计算机图形学的核心问题之一。网格化算法主要用于生成、优化和转换多边形网格,以实现对三维模型的有效表示和处理。常用的网格化算法包括网格简化算法、网格细分算法和Delaunay三角剖分算法。

1.网格简化算法

网格简化算法旨在减少三维模型中的顶点数、边数和面数,从而降低三维模型的几何复杂度,以便进行更快的渲染和处理。在网格简化时,应尽可能保持原始模型的几何特征和视觉质量。网格简化算法的基本流程如下所示(以三角形网格为例说明):

1) 选择简化元素 :算法识别并选择网格中的顶点、边或面作为简化的目标元素。

2) 确定简化准则 :根据一定的简化准则(例如基于几何误差的最小化或保持视觉显著性)来确定这些元素简化的顺序和方式。这些准则旨在确保简化操作能够最大程度地保留模型的关键特征。

3) 执行简化操作 :在确定了简化元素和简化准则之后,算法将执行具体的简化操作。这些操作包括合并相近的顶点、删除不重要的边或面,或者采用几何逼近方法来近似表示原始网格的复杂结构。

4) 迭代与终止 :算法重复上述步骤,不断迭代简化过程,直到达到预定的简化程度(例如达到设定的顶点数量、边数量或面数量限制),或满足特定的终止条件(例如简化后的模型质量下降到一定阈值以下)为止。

上述算法流程可以转化为如下代码:

网格简化的算法大致可以分为以下几类:顶点聚类算法、自适应细分算法、重采样算法和去除算法。算法细节这里不再详述,读者可查阅相关书籍和资料进行学习。

2.网格细分算法

网格细分算法是一种用于提高三维模型细节和精度的技术,它通过增加顶点和面来提高网格的分辨率,从而增加模型的细节和精度(如图3-5所示)。该算法能够生成更加平滑和细腻的表面,适用于需要高质量渲染或者物理模拟的应用场景。

图3-5 网格细分算法

网格细分算法的基本流程如下:

1) 选择细分元素 :根据细分规则,选择网格中的边或面作为待细分的元素。

2) 计算新顶点的位置 :对于每个待细分的元素,根据所选的细分规则(如Catmull-Clark细分规则、Loop细分规则等),计算新顶点的位置。

3) 插入新顶点并更新拓扑结构 :在网格中插入计算出的新顶点,根据细分规则,连接新顶点与现有顶点,形成新的边和面。然后,更新网格的拓扑结构,包括顶点、边和面的索引和连接关系。

4) 迭代与终止 :重复上述步骤,直到达到预定的细分级别或满足设定的终止条件为止。

上述算法流程可以用代码表示如下:

网格细分算法包括Catmull-Clark细分、Loop细分等算法。这些算法的细节不再详述,读者可阅读相关书籍或资料进行学习。

3.Delaunay三角剖分算法

三角剖分是指将平面对象细分为三角形。Delaunay三角剖分算法是一种广泛使用的网格生成算法,它根据一组点生成一个三角网格,使所有三角形的最小角尽可能大,从而避免生成细长和尖锐的三角形,从而生成高质量的三角网格。

Delaunay三角剖分算法的基本流程如下:

1)输入一组离散的点集。

2)初始化一个空的三角网格。

3)逐个插入点集中的点,对于每个新插入的点 V ,执行以下步骤:

①定位三角形,即找到包含点 V 的三角形。

②执行Lawson算法,通过交换边和插入新三角形来更新网格,使其满足Delaunay条件。

4)重复步骤3,直到所有点都被插入到网格中为止。

上述算法流程对应的代码如下:

3.2.5 多边形网格的数据结构

多边形网格由顶点、边和面等元素组成,它们相互连接,形成一个封闭的网格,从而共同定义了三维模型的几何形态。多边形网格的数据结构有多种不同的组织方式,下面介绍三种常见的方式。

1.顶点-顶点结构

顶点-顶点(Vertex-Vertex,VV)结构是最直观的多边形网格数据结构,也是最简单的多边形网格表示方法。顶点-顶点结构只有一张顶点邻接信息表,其中每个顶点仅存储自身在三维空间中的位置信息(通常为 x y z 坐标)。这种数据结构比较简单,需要的存储空间较小,能够有效支持形状变化。但这种结构因为隐藏了边和面的信息,在渲染时需要消耗较多时间计算、查找边和面的信息,同时不能有效地支持动态操作边和面。

2.面-顶点结构

面-顶点(Face-Vertex)结构是一种更为直观的表示方法,它将每个面作为数据结构的基本单元,每个面存储与它相关的顶点信息。面-顶点结构会构造两张数据表,分别是面邻接信息表和顶点邻接信息表。通过面邻接信息表,可以迅速通过索引查找关联的顶点数据;通过顶点邻接信息表,则可以查找到关联的面数据。这种数据结构对渲染是很有利的,能够迅速建立索引。但是,这种数据结构不支持直接的边操作,因为边的信息是隐式的。

3.翼边结构

翼边(Winged-Edge)结构是一种基于边的多边形网格表示方法,特别适合表示具有复杂拓扑结构的模型。翼边的数据结构假设网格是二维流形的,即每一条边被两个面共享。在这种结构中,每个边都有两个方向,称为“翼”,每个翼都指向一个相邻的面。

翼边数据结构存储边的邻接信息,它有三张邻接信息表。其中,最重要的是边邻接信息表,该表主要存储边的两端的顶点、边的左右两面,以及分别与两个端顶点衔接的四条边。

另外两张邻接表比较简单,如点邻接关系表用于存储与该点关联的一条边;面邻接关系表则存储与该面关联的一条边界边。点与面都可能关联多条边,所以选择不同的关联边,会得到不同的点和面邻接关系表。

翼边结构也存在一些缺点:在存储和处理大量数据时会占用较多的内存和计算资源。此外,当需要查询关于多边形及其边数的信息时,翼边结构并不能直接提供这些信息,需要通过循环遍历相关元素得出结果,导致处理效率比较低。

4.半边结构

为了克服翼边结构的缺点,提出了半边(Half-Edge)结构。半边也是一种基于边的数据结构,它在简化翼边结构的同时保留了其灵活性。半边结构存储两条反向的方向边,每个方向边属于不同的环。

每一个方向边邻接表只存储半边的起始(或者结束)点、关联面、反向的邻接半边,以及前后两个邻接半边。

与翼边结构相比,半边结构在遍历查询时不需要进行方向判断,减少了不必要的开销。需要注意的是,半边结构不支持非流形网格。

3.2.6 多边形网格建模的优势和劣势

多边形网格建模作为一种三维建模技术,核心优势在于为用户提供了一种直观且灵活的创作手段。通过直接对模型的顶点、边和面进行操作,用户能够轻松塑造出各种形状和细节。此外,多边形网格建模得到了广泛的软件支持,几乎所有三维建模软件均内置了相应的工具和功能,因此有丰富的学习资源和全面的社区支持。这种建模方法适应性强,无论是高度详细的角色建模还是简单的环境构建,均能胜任。同时,多边形网格模型可以通过减少顶点数量进行优化,以满足不同渲染和实时显示的需求,这一点对于游戏开发和实时应用尤为重要。

当然,多边形网格建模也存在一些局限性。在精度要求较高的工业级应用中,多边形网格可能无法提供足够的精确度(尤其是与参数化建模相比)。随着模型复杂性的提升,管理和维护大量的顶点和面的工作尤为艰巨,特别是在处理大型场景时。此外,多边形网格建模可能会遇到拓扑问题,如孔洞和重叠面,这需要进行额外的修复工作。在捕捉细微的曲面变化方面,多边形网格可能不如NURBS曲面建模那样精确。最后,在进行渲染之前,多边形网格模型可能需要进行额外的准备工作,如细分、平滑和优化,以确保最终渲染效果的质量。因此,在选择建模方法时,应根据项目的具体需求和目标来决定使用多边形网格建模还是其他建模技术。 6009bo5PtvFb72rm3yRZcxalazoKKDrLVsvTpynF79U3N/+B8m3iomKgh2reAgj4

点击中间区域
呼出菜单
上一章
目录
下一章
×