Mesh is Art(4):网格细分

本文介绍了网格细分技术在游戏、动画和建筑设计中的应用,特别是Loop细分和Catmull-Clark细分算法的工作原理及C#实现。通过细分,可以将粗糙的网格模型转化为更精细、平滑的曲面,有效减少计算资源的消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Subdivision

前言

上文我们介绍了半边网格的底层架构,介绍了点、半边和面所携带的信息。本文我们来探讨一个半边网格的应用——网格细分。网格细分是一种高效地表达几何的方法。

网格细分简述

Mesh is Art(1) 中,我们讲解了网格数据大多数由三角形或四边形组成。网格细分技术为分割曲面提供了解决方案。这种技术的核心是关注如何通过细分算法(Subdivision)计算来用大量的较小的网格面来替代原来的曲面,从而细分并优化输入的基础网格面。并且由此产生的精密网格还可以使用相同的算法来产生更精密的网格,如此可以反复迭代。随着迭代步的增加,网格的数量也不断地翻倍,从而更加逼近于精确、光滑的初始曲面。

网格细分技术已经被广泛地应用于游戏和动画产业当中,在项目中常采用非常粗糙的基础网格来表达一个物体(大概只需要几百个多边形),因此存储时所占用的计算机资源非常少。我们知道动画和游戏中常常需要渲染模型,对于模型的渲染时,并不是所有模型都要达到几十万网格面级别再去渲染,这样不仅增加了模型场景中的负担,还浪费了许多时间。在一个场景中,通常只有距离摄像机近、需要突出表达细节的模型才会被渲染地非常清晰,其他背景、场景往往不需要那么高精度的表达。因此,网格细分技术变得十分重要,设计师只需要建立一些粗糙网格模型,当该模型需要被表达时,将其细分,不需要表达细节时,就保持不变。

在这里插入图片描述

Figure 1:随着网格细分迭代次数增加,网格模型逐渐变得精细(从右至左)
图片来源:Pixie3D | Animation Software

在这里插入图片描述

Figure 2:随着网格细分迭代次数增加,网格模型逐渐变得精细(从左至右)
图片来源:《Subdivision for Modeling and Animation》

在建筑设计中,许多建筑在设计阶段是由NURBS曲面这样的光滑连续曲面建模技术来设计的。然而,这些模型在几何学方面很容易操作(很容易在计算机中建模),但它们很难被精确地制造出来,由于加工尺度问题,在实际项目中不可避免地要将它们分割成小构件,从而制作出能安装在结构上的表面嵌板(如图3)。在建造中,即使最后完成时是一个单体结构,通常也需要采用离散单元来拼合的传统方法。因此,这些项目在建模时经常使用离散网格来表示曲面(如图4、5),来代替一张参数化连续的NURBS曲面(至少在工程和制造阶段上是这样)。在 Mesh is Art(2) 中,也简述了一个由细分算法主导的建筑设计实例。
在这里插入图片描述

Figure 3:细分网格在建筑中的应用
图片来源:Design and Panelization of Architectural Freeform-Surfaces by Planar Quadrilateral Meshes

在这里插入图片描述

Figure 4:用细分网格表达光滑曲面(一):从左至右依次为:初始光滑曲面、手动创建的初始网格、通过投影算法匹配到初始光滑曲面后的网格、细分之后的网格。
图片来源:Design and Panelization of Architectural Freeform-Surfaces by Planar Quadrilateral Meshes

在这里插入图片描述

Figure 5:用细分网格表达光滑曲面(二):初始网格(左)和细分后的网格(右)
图片来源:Design and Panelization of Architectural Freeform-Surfaces by Planar Quadrilateral Meshes
网格细分除了在建造上表达曲面的优势外,还常被用于分析和优化。

在幕墙优化中,细分曲面常用来控制嵌板的尺寸以及辅助其他优化算法。比如当设计师设计了一张曲面,需要将该曲面铺上嵌板,设计师可以使用细分算法对该曲面不断地迭代细分,直至嵌板的尺寸符合可加工的尺寸,接着可进行更进一步地平板优化和规格优化,当然这两个问题先放到后面了。

在对于需要执行多目标优化的曲面来说,网格细分同样非常有用。在设计和施工的过程中,通常要对建筑曲面进行优化来提高其性能。结构优化通常要求在最大限度节省材料的前提下尽可能小地改变形状,优化的实现可以通过将结构构件仅放置在所需要的地方来尽可能减少结构构件的数量,或者通过调整结构构件以便有效地将载荷传递到支撑来减少结构构件的大小。改变建筑物的形状可以减小风和雪带来的荷载,当然也可以通过考虑热环境、通风和采光来优化建筑的场地、形状和遮阳,从而提高建筑的环境性能。

这些优化目标都需要对建筑模型采用一种特殊表式方法来分析其性能。这些分析需要大量离散的类似网格的表示方法,并且所需要的网格的密度会取决于正在执行的分析类型。例如有限元结构分析可能会要求网格的离散方式能够反映给出的支撑结构,计算风流分析可能需要更精密的分析网格,而太阳能生成计算会相对精确,可能只需要比较粗糙的网格来表示即可。连续壳体的有限元结构分析需要形状函数来在两节点间插入几何结构,而细分曲面也可用于此。

网格细分可以看作是一种圆滑的过程,细分得到的网格子顶点坐标是由周围相邻父顶点的平滑平均值产生。用这种方式,网格的坐标被圆滑,形成更接近初始的近似曲面。这一点已经被证明(Zorin et al.,2000),这种生成的近似曲面在非边界和非奇异顶点处都是C2连续的,这意味着形态表面(没有缝隙)、表面切线(没有折痕)以及切线的变化率(在视觉反射中没有变形)都没有突变(这三点分别是C0,C1和C2连续性的判断标准)。这也是细分网格看上去特别美观的原因。

圆滑过程的另一个优点是,细分不仅能可以圆滑顶点坐标,任何一组与顶点关联的数据都会被圆滑,如果一个初始的粗糙网格中每一个顶点附带着一个颜色的信息,所有连续细分的网格都能够自动匹配圆滑曲面上的颜色。可以类似地应用于更多实际的参数,例如顶点携带的贴图信息、应力值、立面渗透率或透明度值,百叶窗角度或者覆层的偏移距离。在基础网格上,这些数据可以被定义在所需要的顶点上,细分网格后,这些信息将完全以与顶点位置相同的C2连续的方式均匀地分布在整个曲面上。

细分算法原理

实现网格细分有多种方案,有基于三角形网格的,基于四边形网格,也有基于高阶多边形及混合网格的。细分算法的基本过程首先是从一张网格面开始,用某种方式在网格上添加点,并对拓扑结构进行优化。本文中着重讨论两个细分算法的原理及C#实现。

Loop细分算法

原理

Loop细分算法(Loop,1992)是一种应用在三角形网格的算法,如图6所示,这是从一个球形网格中提取的一张网格面,蓝色顶点为父顶点,即网格面原有的顶点,红色顶点为新创建的子顶点,每个三角形上的每条边都被新引入的子顶点分割成了两段,然后每一个三角形都被四个新的小三角形代替。
在这里插入图片描述

Figure 6:Loop细分算法的实现步骤:(a)基础网格;(b)拓扑划分;(c)圆滑子顶点;(d)圆滑父顶点
图片来源:《Shell Structures for Architecture: Form Finding and Optimization》

这里有很多人可能看不懂图6中的(c)和(d)在做什么,我做进一步地解释:第一步是输入的初始球形网格中的一张网格面,第二步在初始网格中的各个边缘的中点处插入了子顶点,并互相连接。但是如果仅仅执行到这一步就结束了的话,无法起到逼近原始曲面的圆滑效果,因为三角形是平面图形,在三角形内部无论如何划分,得到的图形都依然是平面的,所以需要对各点进行挪动。第三步是将子顶点的位置挪动到一个新的位置,挪动的方向和距离取决于与它相邻的点及权重值,第四步是挪动父顶点,挪动的方向和距离同子顶点一样取决于相邻点。

由此可以看出,关键是点的权重,那么这个权重值是如何定义的呢?
处理的方法分为两部分,对于位于网格内部的顶点,如图7-a所示,公共边两端的顶点的权重值按照 3 8 \frac{3}{8} 83 来计算,面上其他的顶点的权重值按照 1 8 \frac{1}{8} 81 来计算,就这样将子顶点放在了一个加权平均的位置。这种近似方案还将父顶点移动到新的位置,如图7-b所示,在这个例子中父顶点旧的位置的权重值为 5 8 \frac{5}{8} 85 ,周围顶点的平均位置的权重值为 3 8 \frac{3}{8} 83
在这里插入图片描述

Figure 7:内部顶点的权重值
图片来源:《Shell Structures for Architecture: Form Finding and Optimization》

内部子顶点:设内部边的两端点 v 0 v_0 v0 v 1 v_1 v1,其相对的两个顶点为 v 2 v_2 v2 v 3 v_3 v3,要创建的子顶点为 v n e w v_{new} vnew,则
v n e w = 3 8 ( v 0 + v 1 ) + 1 8 ( v 2 + v 3 ) v_{new} = \frac{3}{8}(v_0+v_1)+\frac{1}{8}(v_2+v_3) vnew=83(v0+v1)+81(v2+v3)

内部父顶点:设内部父顶点 v 0 v_0 v0的相邻点为 v 1 v_1 v1 v 2 v_2 v2,…, v n v_n vn,更新后的父顶点为 v n e w v_{new} vnew,w为权重值, n n n为顶点的价(该顶点的相邻点的数量),则
w = 1 n ( 5 8 − ( 3 8 + 1 4 c o s 2 π n ) 2 ) w=\frac{1}{n}(\frac{5}{8}-(\frac{3}{8}+\frac{1}{4}cos\frac{2\pi}{n})^2) w=n1(85(83+

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值