经过笔画预处理后,得到的是由一些有序的、分布较均匀的顶点,然后这些顶点首尾相连组成一条多边形。而曲面膨胀算法就是对该多边形进行操作,其大致流程为:1)对该2D多边形进行Delaunay三角剖分;2)根据文献[18]所介绍的玄齿轴的方法确定该多边形的嵴线;3)所有的处于该嵴线上的顶点在该多边形法矢方向上抬升,抬升的距离为该嵴线顶点到该多边形距离的倍数;4)最终生成一个包裹该嵴线和该多边形的多边形网格,该多边形网格的截面是由椭圆形的一部分组合而成的。
在执行该算法之前,首先必须要保证该二维多边形不能自交,否则该算法终止或者必须要对这些草绘画笔进行修改。如图1.1所示为初始的2D多边形。
接着对该多边形进行Delaunay三角剖分,这是因为Delaunay三角剖分具有最大化最小角特性,可以尽量减少狭长三角形的发生。Delaunay三角剖分过程可以采用Lawson算法,该算法实际上是一个逐点插入算法[19],该算法思路简单,编程易于实现;其基本原理为:首先建立一个大的三角形或多边形,把所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外接圆检测,同时用Lawson设计的局部优化过程LOP进行优化,即通过交换对角线的方法来保证所形成的三角网为Delaunay三角网。
但是本文还是推荐使用另外一个Delaunay三角剖分算法“Bowyer-Waston算法”,因为即使上述基于散点的构网算法理论严密、唯一性好,网格满足空圆特性,较为理想。由其逐点插入的构网过程可知,遇到非Delaunay边时,通过删除调整,可以构造形成新的Delaunay边。在完成构网后,增加新点时,无需对所有的点进行重新构网,只需对新点的影响三角形范围进行局部联网,且局部联网的方法简单易行。同样,点的删除、移动也可快速动态地进行。但在实际应用当中,这种构网算法当点集较大时构网速度也较慢,如果点集范围是非凸区域或者存在内环,则会产生非法三角形。如图1.2所示,当离散点集构成圆环时,Lawson算法产生的非法三角形。
而Bowyer-Waston算法并不存在这种情况,该算法执行过程中需要保证两个优化准则:空圆特性和最大化最小角特性。空圆特性指的是,Delaunay三角网是唯一的(任意四点不能共圆),在Delaunay三角形网中任一三角形的外接圆范围内不会有其它点存在,如图1.3a所示。最大化最小角特性指的是,在散点集可能形成的三角剖分中,Delaunay三角剖分所形成的三角形的最小角最大。从这个意义上讲,Delaunay三角网是“最接近于规则化的“的三角网。具体的说是指在两个相邻的三角形构成凸四边形的对角线,在相互交换后,六个内角的最小角不再增大,如图2.8b所示。
概算法的基本流程为:
1) 构造一个超级三角形,包含所有散点,放入三角形链表。
2) 将点集中的散点依次插入,在三角形链表中找出外接圆包含插入点的三角形(称为该点的影响三角形),删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来,完成一个点在Delaunay三角形链表中的插入。
3) 根据优化准则对局部新形成的三角形优化。将形成的三角形放入Delaunay三角形链表。
4) 循环执行上述第2)步,直到所有散点插入完毕。
这一算法的关键就是其第二步,如图1.4所示。
最终对初始的2D多边形Delaunay三角剖分后的结果如图1.5所示。
对2D多边形Delaunay三角剖分后,将Delaunay边分为外部边和内部边两种,该初始的2D多边形的边被称为外部边,经过Delaunay三角剖分新添加的边被称为内部边。同时根据拥有外部边的边数,将Delaunay三角面片分为三类:T类三角面片(terminal triangle)、S类三角面片(sleeve triangle)、J类三角面片(junction triangle)。T类三角面片只拥有两个外部边,S类三角面片只拥有一个外部边,J类三角面片全为内部边,它们的分类情况如图1.5所示。将所有Delaunay三角剖分得到内部边的中点按照三角形相邻顺序连接起来,就得到玄齿轴,如图1.6所示。但是,如果不对T类三角形进行修剪的话,最终的网格模型会出现很多狭长的三角面片以及褶皱。所以需要对那些无关紧要的面片(T类三角形)进行修剪。
为了对那些无关紧要的面片进行修剪,首先对所有的T类三角面片进行访问,比如X是一个T类三角形,它有两条外部边和一条内部边;然后以该内部边为直径画一个半圆,该半圆与该三角形X在该内部边的同一侧,如图1.7a。判断三角形X的所有顶点是否都位于该半圆上或者半圆内,如果都是的话就删除掉该内部边,并且将该三角形X与该内部边相邻的另一个三角形融合。
如果将要被融合的三角形为S类三角形,那么X经过融合之后就会有三条外部边和一条新的内部边,如图1.7b所示,然后在该内部边上与多边形X的一侧建立以该内部边为直径的半圆,判断该多边形X中所有的顶点是否都位于该半圆上或者半圆内。如果多边形X中有顶点处于该半圆外,或者将要被融合的三角形为J类三角形,那么扩散条件终止。对于第一种情况,如图1.7d所示,以该内部边的中点为中心,将多边形X扇结构化,并且在扇结构化过程中新添加的三角形边标记为覆盖边(Cover edge)。对于第二种情况,如图1.7e-f所示,以该内边相邻的J类三角形的中心为扇形中心,将多边形X扇结构化,并且在扇结构化过程中新添加的三角形边标记为覆盖边。
扇形结构化后,得到的草图剖分结果如图1.8a所示。然后将其余S类三角形和J类三角形的内部边中点连接起来,构成了一条嵴线,如图1.8b所示。因为生成嵴线之后,嵴线将S类三角形和J类三角形剖分成了一个四边形和一到两个三角形,所以接下来要对S类三角形和J类三角形进行细三角化分。划分准则为:1)对于每个三角形必须保证至少有一个顶点处于笔画上,2)必须满足最大化最小角准则。最终得到一个完整的2D三角网格,如图1.8c所示。
曲面膨胀算法最终使得3D模型宽的地方胖,窄的地方瘦,而模型的宽与窄是由二维草图轮廓线的截面长度所决定的,而3D模型的胖瘦程度是由一个叫做“膨胀率”的常数来控制的。为了提高算法效率,可以用嵴线上顶点的相邻边长的平均值来表征该位置截面的长度;而膨胀率控制了嵴线上顶点在二维草绘平面上抬升的高度,一般要求膨胀率越小,嵴线顶点的抬升高度越低,反之,膨胀率越大,嵴线顶点抬升高度越高。因此可以认为嵴线顶点抬升高度与膨胀率之间存在着一定的比例关系,而将截面长度联系起来,可以得到嵴线抬升高度的计算公式为:
|
|
( 2‑1) |
式中, 为嵴线顶点抬高的高度, 为整个3D模型的膨胀率, 为与嵴线顶点相连的笔画点数, 为笔画点。
最终抬升之后的嵴线,如图1.9所示。
接下来需要将内部边相对应的嵴线顶点与2D三角网格外部顶点用四分之一的椭圆弧连接过度,进而完成边的抬升,如图1.10a所示。然后用三角面片缝纫这些抬升边,如图1.10b所示。
但是完成了边的抬升之后,需要在四分之一的椭圆弧上等角度的插值顶点。方法是将直角平分成几个夹角,如图1.11所示, 为笔画顶点, 为被抬升的顶点, 为椭圆弧上等角插值的顶点。那么,各插值的顶点坐标可用下式计算:
|
|
( 2‑2) |
由于采用网格曲面膨胀算法构造模型存在不少缺点,如网格曲面难以编辑、表面出现一些不太合理的凸起和凹痕,显得不够光顺等,许多研究者对上述算法进行了改善。
Igarashi等[20]在SmoothTeddy系统中对其原先构造出来的不规则的网格曲面进行了改进,先使用Skin算法[17]对由轮廓线构造出的多边形网格进行美化,使之具有接近相等的多边形网格曲面片,然后利用细化算法光滑插值网格,以便生成一个稠密的多边形网格.Cuno等[21]采用变分曲面对草绘出的封闭轮廓笔画进行处理,依据Igarashi原理构造出三维曲面模型.该系统支持同一场景下多个模型的创建,克服了Teddy只建编辑单个模型的缺陷.Alexe等[22]到采用了一种球状隐式曲面代替多边形网格曲面用于自由外形物体的设计,不仅使得构造出的模型具有更自然、更光顺的外观,而且使得曲面的编辑和修改更加容易.Owada等[23]则根据Teddy的模型构造原理,采用一种体式结构模型以支持具有任意内部结构的三维自由形状物体的创建.Karpenko等[24]和Araujo等[25]采用变分隐式曲面将草绘轮廓线构造成三维模型,以克服Teddy中采用多边形网格曲面的一些不足之处,使得构造出的曲面光顺性更好;同时允许添加一些新的模型编辑操作,如对象融合、曲面局部修改、轮廓线重画等.Araujo等[26]引采用MPU(multi—level partition Of unity implicits)技术,使得用户可以在曲面上创建和修改一些急剧变化的特征,如折痕、凹谷等.同时使用一个快速适应性增量多边化算法,允许重新对曲面进行局部多边化,从而避免了每革绘一条笔画都要对整个曲面进行处理的弊端。
使用网格曲面对草绘轮廓线进行蒙皮构造的方法很好地解决了大多数具有自由外观形状三维物体的创建工作,为基于草绘的三维建模提供了一个新的设计思路.遗憾的是,它们无法构建具有规则几何外形的物体,不支持像机械零件、建筑结构等刚性物体的草绘设计,这无疑缩小它们的应用范围。