细分曲面建模技术01-总览和介绍
总览
细分曲面是一种常见的建模原语,在过去的几十年中已在动画和视觉效果中获得广泛应用。
顾名思义,细分曲面基本上是曲面。
更具体地说,细分曲面是在任意拓扑的网格上定义的分段参数化曲面-这两个概念将在以下各节中进行介绍。
细分既是可以应用于多边形网格以对其进行细化的操作,又是一种数学工具,它定义了网格的重复细分收敛到的基础光滑表面。显式细分易于应用多次以提供更平滑的网格,并且从历史上看,这种简化导致许多工具可以用这种方式来表示形状。相反,获得最终定义形状的光滑表面(即“极限表面”)要复杂得多,但可以提供更高的准确性和灵活性。这些差异导致某些工具如何暴露细分表面的混乱。
最终目标是使所有工具都将细分曲面用作真实的曲面图元。因此,这里的重点是减少细分,而更多地关注细分所产生的表面性质。除了提供一致的细分实现(其中包括许多广泛使用的功能扩展)之外,OpenSubdiv的重要价值还在于它使限制曲面更易于访问。
自推出以来,OpenSubdiv受到了具有各种技能,兴趣和背景的用户和开发人员的兴趣。本文档旨在从有助于使用OpenSubdiv的角度介绍细分曲面。它的目的之一是为那些对细分算法或数学经验不足的人提供高层次的概述。另一个是概述OpenSubdiv可用的功能集,并使用OpenSubdiv所使用的术语(因为其中很多已超载)来介绍这些功能。
分段参数曲面
分段参数曲面可以说是工业设计,娱乐和许多其他领域中使用最广泛的几何表示形式。我们每天处理的许多对象(汽车,手机,笔记本电脑)都首先被设计和可视化为分段参数化表面,然后才批准并继续进行这些设计。
分段参数化表面最终只是称为贴片的更简单建模图元的集合。斑块构成较大表面的“块”,与面或多边形构成多边形网格的块几乎相同。
参数补丁
修补程序是分段光滑表面的构建块,并且已经开发出许多不同种类的修补程序来满足几何建模的需求。以下是两个更有效和常见的补丁程序:
单三次B样条补丁 |
单个双三次Bezier补丁 |
补丁由影响矩形平滑表面的点或顶点组成(也存在三角形补丁)。该矩形在两个方向上被“参数化”,将一个简单的2D矩形转换为3D曲面:
(u,v)补丁的2D域 |
从(u,v)映射到(x,y,z) |
控制曲面形状的点通常称为控制点或控制顶点,整个集合的集合将一个面片定义为控制网格,控制外壳,控制笼,或简称为外壳,笼,为了简洁起见,我们会经常使用“笼”一词,稍后会更广泛地为我们服务。
因此,一个面块基本上由两个实体组成:其控制点和受其影响的表面。
控制点影响表面的方式使不同类型的贴片具有独特性。即使由相同数量的点定义的面块也可能具有不同的行为。请注意,与类似的Bezier色块相比,上面的B样条色块的所有16个点都远离它们定义的表面。该示例中的两个面片实际上代表了完全相同的表面-每个面都有一组对它有不同影响的控制点。用数学术语来说,每个控制点都有一个与之关联的“基本函数”,当仅移动该控制点时,它会以特定的方式影响表面:
双三次B样条基函数 |
双三次贝塞尔曲线基函数 |
这些基础功能通常会引起不同补丁程序的名称。
贴片控制点的这些不同属性各有利弊,当我们将贴片组装成分段表面时,这些点变得更加明显。
分段曲面
分段参数化曲面是面片的集合。
对于矩形面片,构造集合的最简单方法之一是使用矩形的控制点网格定义一组面片:
分段B样条曲面 |
分段贝塞尔曲面 |
注意,我们可以重叠相邻的B样条斑块的点。这种重叠意味着移动一个控制点会影响多个补丁程序-但同时也确保了这些补丁程序始终能够顺利满足(这是设计意图,而对于其他补丁程序类型而言并非如此)。相邻的Bezier色块仅在其边界处共享点,并且可以协调跨越这些边界的点以保持表面平滑,但是很尴尬。这使得B样条曲线更适合交互式建模,但Bezier面片具有许多其他有用的用途。
更复杂的B样条曲面:
更复杂的B样条曲面的一部分 |
正如补丁由笼子和表面组成一样,现在该集合也是如此。设计师设计了控制笼,并显示了每个补丁的表面,以便他们评估其效果。
任意拓扑
到目前为止讨论的分段表面已经限于在控制点的规则网格上的补丁集合。矩形参数曲面具有一定的吸引力,但具有一定的简单性,但是支持任意拓扑的曲面表示还有许多其他优点。
矩形参数曲面尽管具有拓扑限制,但仍得到广泛采用,并且在某些地区,其流行度一直持续到今天。复杂的对象通常需要许多这样的表面来表示它们,并且已经发展出多种技术来有效地组装它们,包括将多个表面“缝合”在一起或在其中切孔(“修剪”)。这些是复杂的技术,尽管在某些情况下(例如工业设计)有效,但在其他情况下(例如动画和视觉效果)却变得繁琐。
单个多边形网格可以代表比单个矩形分段表面复杂得多的形状,但是其多面性质最终成为问题。
细分曲面将多边形网格的拓扑灵活性与分段参数化曲面的基本平滑度结合在一起。正如矩形分段参数化曲面具有控制点(其笼形存储为网格)和基础表面的集合一样,细分曲面也具有控制点(其笼形存储为网格)的集合和基础表面(通常称为其“极限面”)。
规则与不规则特征
网格包含形成底层表面笼的顶点和面,并且该网格的拓扑可以任意复杂。
在连接网格的面和顶点以形成矩形网格的区域中,限制表面成为前面提到的矩形分段参数化表面之一。网格的这些区域被称为“规则”区域:它们提供的行为类似于使用类似的矩形曲面,并且其边界曲面相对较容易处理。所有其他区域都被认为是“不规则的”:它们提供所需的拓扑灵活性,因此不那么熟悉(在某些情况下更难以预测),并且其极限曲面可能更加复杂。
不规则特征有多种形式。最为广泛使用的是一个非凡顶点,即,在像Catmull-Clark这样的四分细分方案中,它没有四个入射面的顶点。
顶点和入射面不规则 |
表面的规则和不规则区域 |
这些不规则特征的存在使围绕它们的极限表面同样不规则,即,不能象规则区域那样简单地表示它。
值得注意的是,随着细分的应用,不规则区域的大小会缩小并变得更加“孤立”。围绕着很多非凡顶点的面会形成非常复杂的表面,而隔离这些特征是一种有助于处理这种复杂性的方法:
附近有两个价5顶点 |
隔离细分一次 |
隔离度细分为两次 |
通常有必要在这些区域中执行某种局部细分,以将这些表层分解为更小,更易于管理的部分,并且近年来,“功能自适应细分”一词在描述此过程时变得越来越流行。无论是在全局还是局部地进行显式或隐式处理,最重要的是每个面都有一个下限的极限面(尽管在不规则特征处可能存在复杂的极限面),其评估方式几乎相同作为矩形的分段曲面。
常规区域的补丁 |
不规则区域的补丁 |
虽然在这些不规则区域中支撑光滑表面是细分表面的主要优点,但所得表面的复杂性及其质量都是谨慎使用它们的原因。当拓扑在很大程度上不规则时,与其表面相关联的成本较高,因此最小化不规则性是有利的。在某些情况下,不规则表面的表面质量(即感觉到的光滑度)可能会导致不良的伪影。
无论多边形网格的外观如何,任意多边形网格通常都不能构成一个好的细分笼。
与矩形分段参数化曲面一样,保持架的形状应能影响其打算表示的基础表面。有关相关建议,请参见 建模技巧。
非流形拓扑
由于细分曲面的笼子存储在网格中,并且通常在与多边形网格相同的上下文中进行操作,因此流形与非流形拓扑的主题值得引起关注。
关于将歧管网格与不区分歧管网格有很多定义或描述。这些范围从简洁但抽象的数学定义到显示流形和非流形网格的示例集-都具有其价值和适当的受众。以下不是严格的定义,但可以很好地说明导致网格非流形的大多数局部拓扑配置。
考虑“站立”在网格面上,然后依次“绕行”每个顶点。假设面的缠绕顺序为右手,则以正法线方向站在面的一侧。并且在行走时,以逆时针方向越过每个入射边缘到达下一个入射面。
对于内部顶点:
从任何入射面的拐角处开始
在每个入射边缘处绕顶点走到下一个未访问的面孔;重复
如果返回起点,并且未访问任何入射面或边缘,则网格是非流形的
同样,对于边界顶点:
从包含前沿边界边的角开始
在每个入射边缘处绕顶点走到下一个未访问的面孔;重复
如果到达另一个边界边并且未访问任何入射面或边,则网格是非流形的
如果您可以以这种方式绕过所有顶点并且不遇到任何非流形特征,则网格可能是多方面的。
显然,如果一个顶点没有面,就没有东西可走,并且该测试无法成功,因此它再次是非流形的。顶点周围的所有面也应处于相同方向,否则两个相邻面的法线方向相反,则网格将被视为非流形,因此,当逐步移动到下一个面时,我们应该真正包括该约束以使其更接近严格。
考虑绕过以下非流形网格的指示顶点:
具有2个以上入射面的边 |
面共享一个顶点但没有边 |
如前所述,许多工具不支持非流形网格,在某些情况下,例如3D打印,应严格避免使用它们。有时可能需要一个流形网格并将其作为最终结果,但由于建模操作的特定顺序,网格可能会暂时变得无歧管。
OpenSubdiv不会支持或提倡使用非流形网格,而是在存在非流形功能的情况下努力保持健壮性,以简化其客户端的使用-避免他们需要进行拓扑分析以确定OpenSubdiv何时可以或不可以用过的。尽管在网格不多的区域中细分规则还没有很好地标准化,但是OpenSubdiv在大多数情况下提供简单的规则和合理的极限曲面。
边缘> 2个入射面的曲面 |
面共享顶点但无边的面 |
与规则特征与不规则特征一样,由于每个面都有一个与之相关的对应表面(无论是否局部流形),因此术语“任意拓扑”可以说是包括非流形拓扑。
细分与细分
前面的部分将细分表面说明为任意拓扑的分段参数化表面。作为分段参数化曲面,它们由一个框架和该框架定义的下表面组成。
用于显示细分曲面的两种技术是细分和细分。两者都有其合法用途,但它们之间有重要区别:
细分在笼子上运行并生产精制笼子
细分在表面上进行操作并产生该表面的离散化
细分算法的存在和相对简单性使得可以轻松地重复应用它来近似曲面的形状,但是结果是一个精炼的笼子,这种近似并不总是很精确。与精制到不同水平的笼子或使用直接在极限表面上评估的点的镶嵌进行比较时,差异可能会造成混淆。
细分
细分是为“细分曲面”命名的过程,但并不是唯一的。作为分段参数化曲面,让我们首先在包含它们的更简单参数化面片的上下文中查看细分。
细分是改进的一种特殊情况,这是某些使用最广泛的参数补丁及其聚合曲面成功的关键。当存在算法时,可以“精炼”表面,以便可以引入更多控制点, 同时保持表面的形状完全相同。出于交互和设计目的,这允许设计人员引入更高的分辨率以进行更精细的控制,而不会在形状中引入不良副作用。为了更多的分析目的,它允许将表面通常自适应地破碎成碎片,同时忠实于原始形状。
B样条和Bezier面片之所以如此广泛使用的原因之一是,它们都可以被完善。统一细分-沿其一个或两个方向拆分每个补丁的过程-是改进的一种特殊情况,这两种补丁类型都支持:
B样条曲面及其笼 |
笼子细分1x |
笼子细分为2x |
在上述B样条曲线的情况下,均匀精制的保持架产生与原始保持架相同的极限表面(分批提供)。因此可以说,均匀的B样条曲线和Bezier曲面都是细分曲面。
极限曲面与更多的控制点保持不变(细分的每次迭代大约为4倍),并且这些点更接近(但不在曲面上)。可能会尝试使用这些新的控制点来表示表面,但是使用在表面上相应均匀间隔的参数位置处评估的相同数量的点通常更简单,更有效。
还要注意的是,笼子的点通常没有任何与它们关联的法线向量,尽管我们可以像对位置一样对表面上的任意位置显式地评估法线。因此,如果将笼子显示为带阴影的表面,则必须在每个控制点处构造法线向量。因此,精制笼子上的点的位置和法线都是近似值。
对于更一般的细分曲面,也是如此。细分将细化任意拓扑的网格,但是结果点将不会位于极限曲面上,并且从这些点构造并与之关联的任何法向矢量都只会近似于极限曲面。
镶嵌
当可以直接计算参数曲面(即可以将其细分)时,几乎不需要使用细分来近似它。我们可以在曲面上的任意位置进行评估,然后将结果点连接起来以形成细分(即极限曲面的离散化),这比通过均匀细分获得的结果要灵活得多:
B样条曲面的均匀(3x3)细分 |
B样条曲面的曲率自适应镶嵌 |
对于简单的参数曲面,对极限曲面的直接求值也很简单,但是对于任意拓扑的更复杂的细分曲面,情况则更少。一直以来,对限制表面和保持架之间的关系缺乏清晰的了解,导致许多应用避免镶嵌。
值得一提的是,即使无法使用极限面进行直接评估,细分也可以用于生成细分。细分的递归性质确实产生了一些公式,这些公式允许计算极限面上的一个点,该点对应于笼子的每个点。该过程通常被称为“捕捉”或“推挤”保持架的点到极限表面上。
细分1x并捕捉到极限表面 |
细分2x并捕捉到极限表面 |
由于最终结果是极限面上的一组相连点,因此这形成了极限曲面的细分,我们认为这是细分的单独过程(尽管确实使用了细分)。可以通过细分来实现这种细分的事实与最终结果是无法区分的-通过沿每个边缘均匀地评估2x,4x,8x等的保持架的极限面片,可以很容易地生成相同的细分。
使用哪个?
在创建更精细的笼子来操纵表面时,细分无疑是有用的,但是当补丁可用于直接评估时,镶嵌细分是首选用于显示表面。曾经有一段时间在全球范围内进行细化,以此作为沿着等参线快速评估参数曲面的一种方法,但通常采用斑块评估(即细分)。
由于在最终用户应用程序中显示形状时采用和展示了这两种技术的方式引起了相当大的困惑。可以辩称,如果应用程序显示的表面表示满足其用途,则不必给用户增加其他术语和选择的负担。但是,当两个应用程序对同一表面的两种表示形式有很大不同时,缺少任何解释或控制都会导致混淆。
只要应用程序在显示表面的方式上做出不同的选择,我们就会在简单性和控制性之间寻求平衡。由于细分点不在极限面上,因此在使用细分而不是细分时必须向用户清楚一点很重要。在保持架和表面以相同样式显示的应用中尤其如此,因为用户没有视觉提示来区分。
网格数据和拓扑
细分曲面支持任意拓扑的能力导致使用网格存储笼的拓扑和与其控制点(即其顶点)关联的数据值。网格的形状或由此产生的细分表面是网格拓扑和与顶点相关联的位置数据的组合。
处理网格时,将拓扑结构与数据分离是有优势的,在处理细分曲面时,这一点尤为重要。上面提到的“形状”不仅是网孔的形状(在这种情况下是笼子),还可以是精制的笼子或极限表面的形状。通过观察数据和拓扑在诸如细分和评估之类的操作中所扮演的角色,可以通过相应地管理数据,拓扑和关联的计算来获得显着的优势。
尽管细分曲面的主要目的是使用与顶点关联的位置数据来定义平滑连续的极限曲面,但在许多情况下,非位置数据与网格关联。该数据通常可以像位置一样平滑地插值,但是通常最好线性地插值,甚至使其沿着网格的边缘不连续。纹理坐标和颜色是此处的常见示例。
除了分配给顶点并与之关联的位置之外,对于如何或应该如何关联或插值任意数据没有任何限制。例如,可以指定纹理坐标来创建一个完全平滑的极限表面(如位置),在各个面之间进行线性插值,甚至使它们之间不连续。但是,在数据管理和性能方面都存在要考虑的后果,下面将对这些后果进行描述,因为定义了用于实现每种目的的术语和技术。
将数据与拓扑分离
尽管用于存储细分曲面的网格的拓扑结构是任意复杂且可变的,但构成其极限曲面的参数补丁的拓扑结构却是简单且固定的。双三次B样条曲线和Bezier面片均由一个简单的4x4控制点网格和每个点的一组基本函数共同定义,这些点共同构成了结果曲面。
对于这样的补丁,给定参数位置处的位置是与其控制点关联的位置数据与相应基本函数的权重(权重是在参数位置处评估的基本函数的值)的组合的结果。拓扑和基本函数保持不变,因此我们可以独立于数据使用权重。如果控制点的位置发生变化,我们可以简单地将新的位置数据与我们刚刚使用的权重重新组合,并应用相同的组合。
参数补丁的固定拓扑和由两组位置产生的两种形状。 |
类似地,对于分段曲面,给定参数位置处的位置是包含该参数位置的单个面片在给定位置处评估的结果。涉及的控制点是与该特定补丁程序关联的控制点的子集。如果表面的拓扑是固定的,则组成该表面的贴片集合的拓扑也将固定。如果这些控制点的位置发生变化,我们可以为与补丁相关联的点的子集以相同的权重重新组合新的位置数据。
由两组位置产生的表面和两种形状的更复杂但固定的拓扑。 |
这适用于任意拓扑的分段表面。无论拓扑多么复杂,只要拓扑保持固定(即顶点,边和面之间的关系不变(或影响细分规则的任何其他设置)),都可以应用相同的技术。
这只是将涉及拓扑的计算与涉及数据的计算分开的价值的一个示例。细分和评估都可以分为涉及拓扑(计算权重)和分别组合数据的步骤。
由固定拓扑网格的三组位置产生的三个形状。 |
拓扑固定后,通过预先计算与拓扑关联的信息并以可以与之有效组合的方式组织与控制点关联的数据,可以节省大量资金。这是理解用于处理细分曲面的某些技术的关键。
对于任意拓扑的网格,下表面的控制点是顶点,并且与它们关联的位置数据是最熟悉的。但是没有什么要求补丁的控制点必须表示位置-不管涉及的数据类型如何,都可以应用相同的技术。
顶点和变化数据
最典型和最基本的操作是评估曲面上的位置,即使用网格顶点处的(x,y,z)位置评估极限曲面的基础面片。给定一个这样的面片上的参数(u,v)位置,与数据无关的评估方法首先计算权重,然后组合(x,y,z)顶点位置,从而在该位置处获得(x,y,z)位置地点。但是权重及其组合可以应用于顶点上的任何数据,例如颜色,纹理坐标或其他任何东西。
与这种方式插值的顶点关联的数据(包括位置)被称为“顶点”数据或具有“顶点”插值。将其他数据指定为“顶点”数据将导致它以与位置完全相同的方式(使用完全相同的权重)平滑插值。因此,要捕获表面的简单2D投影以获取纹理坐标,将使用与位置的(x,y)匹配的2D值。
相反,如果希望对与顶点相关联的数据进行线性插值,则可以说该数据是“变化的”数据或具有“变化的”插值。在此,忽略定义平滑极限曲面的面片的非线性评估,并使用简单线性插值的权重。这是纹理坐标的常见选择,因为不需要双三次面片的纹理评估在计算上更便宜。线性插值无法捕获顶点之间真实投影所需的平滑度,但是顶点插值和变化插值都有其用途。
从顶点数据平滑插值投影纹理 |
从变化的数据线性插值投影的纹理 |
由于顶点和变化的数据都与顶点(分配给每个顶点的唯一值)相关联,因此生成的曲面将是连续的-在顶点数据的情况下为分段平滑,在变化的情况下为分段线性。
随面数据和拓扑
为了支持表面数据的不连续性,与顶点和变化数据不同的是,必须存在与顶点,边和/或面关联的多个值,以便存在不连续性。
通过为面的角分配值来实现间断,这与在定义网格拓扑时将顶点分配给面的角的方式类似。回顾顶点到面的分配:
作为网格构造的一部分,顶点索引被分配给每个面的所有角,通常被称为单个面或网格的面顶点。共享相同顶点索引的所有面顶点将由该顶点连接,并共享与之关联的相同顶点数据。
通过为面顶点分配不同的索引集-索引不指向顶点,而是与每个面的角相关联的一组数据-共享相同顶点的角不再需要共享相同数据值,可以使面之间的数据不连续:
据说这种将数据值与网格的面顶点相关联的方法是为“面变”插值分配“面变”数据。插值将在一个面(即与该面关联的极限曲面的面片)内连续变化,但不一定跨越与相邻面共享的边缘或顶点。
应用于极限表面的不连续的面部变化UV区域 |
不将数据值与顶点(控制点)相关联,而将面角与数据相关联,以及由此产生的与数据相关的不连续性,使之成为比顶点或变化复杂得多的方法。单独增加的数据复杂性是仅在必要时(即,当需要并存在不连续性时)使用它的原因。
处理变脸数据和插值的部分复杂性是可以定义插值行为的方式。如果数据是连续的,则可以将插值指定为与顶点数据的基本极限面一样平滑,或者简单地定义为线性(如变化的数据所实现)。数据不连续的地方-横跨内部边缘和顶点周围-不连续之处为数据创建边界,并将下层表面划分为不相交的区域。沿这些边界的插值还可以通过多种方式(其中许多具有历史基础)指定为平滑或线性。
稍后将提供有关具有变脸数据和插值的不同线性插值选项的更完整描述。这些选项使将数据视为顶点或变化数据成为可能,但是增加了不连续性。
变脸插值要记住的重要一点是,每个数据集都可以自由拥有自己的不连续性-这导致每个数据集都具有唯一的拓扑和大小。
为收集各种变化的数据而指定的拓扑称为 通道并且是变脸插值所特有的。与顶点和可变插值(它们都将数据值与顶点关联)不同,在变脸通道中值的数量并不由顶点或面的数量固定。对于所有通道,分配给面部角的索引数将相同,但这些索引所引用的唯一值的数目可能不同。我们可以在数据连续的区域中利用公共网格拓扑,但是会丢失不连续性周围的一些优势。与顶点或变化的数据相比,这会导致面部更改通道的复杂性和成本更高。但是,如果通道的拓扑是固定的,则可以将类似技术应用于与该拓扑有关的因子计算,以便可以有效处理数据更改。