1 生成3D多边形网格模型
经过笔画预处理后,得到的是由一些有序的、分布较均匀的顶点,然后这些顶点首尾相连组成一条多边形。而曲面膨胀算法就是对该多边形进行操作,其大致流程为:1)对该2D多边形进行Delaunay三角剖分;2)根据文献[18]所介绍的玄齿轴的方法确定该多边形的嵴线;3)所有的处于该嵴线上的顶点在该多边形法矢方向上抬升,抬升的距离为该嵴线顶点到该多边形距离的倍数;4)最终生成一个包裹该嵴线和该多边形的多边形网格,该多边形网格的截面是由椭圆形的一部分组合而成的。
1.1 Delaunay三角剖分
在执行该算法之前,首先必须要保证该二维多边形不能自交,否则该算法终止或者必须要对这些草绘画笔进行修改。如图1.1所示为初始的2D多边形。
图1.1 初始的2D多边形
接着对该多边形进行Delaunay三角剖分,这是因为Delaunay三角剖分具有最大化最小角特性,可以尽量减少狭长三角形的发生。Delaunay三角剖分过程可以采用Lawson算法,该算法实际上是一个逐点插入算法[19],该算法思路简单,编程易于实现;其基本原理为:首先建立一个大的三角形或多边形,把所有数据点包围起来,向其中插入一点,该点与包含它的三角形三个顶点相连,形成三个新的三角形,然后逐个对它们进行空外接圆检测,同时用Lawson设计的局部优化过程LOP进行优化,即通过交换对角线的方法来保证所形成的三角网为Delaunay三角网。
但是本文还是推荐使用另外一个Delaunay三角剖分算法“Bowyer-Waston算法”,因为即使上述基于散点的构网算法理论严密、唯一性好,网格满足空圆特性,较为理想。由其逐点插入的构网过程可知,遇到非Delaunay边时,通过删除调整,可以构造形成新的Delaunay边。在完成构网后,增加新点时,无需对所有的点进行重新构网,只需对新点的影响三角形范围进行局部联网,且局部联网的方法简单易行。同样,点的删除、移动也可快速动态地进行。但在实际应用当中,这种构网算法当点集较大时构网速度也较慢,如果点集范围是非凸区域或者存在内环,则会产生非法三角形。如图1.2所示,当离散点集构成圆环时,Lawson算法产生的非法三角形。
(a)离散点集合 (b)Lawson产生的三角剖分 (c)合法的三角剖分
图 1.2当离散点集构成圆环时,Lawson算法产生的非法三角形
![对草绘建模曲面膨胀算法的理解 对草绘建模曲面膨胀算法的理解](https://i-blog.csdnimg.cn/blog_migrate/cbda6b5d0d6641084c6f2967c24c9897.gif)
![对草绘建模曲面膨胀算法的理解 对草绘建模曲面膨胀算法的理解](https://i-blog.csdnimg.cn/blog_migrate/e9011ca1f509823a943f7e55642f60c1.gif)
(a)空圆特性 (b)最大化最小角特性
图1.3Delaunay剖分的空圆特性和最大化最小角特性准则
概算法的基本流程为:
1)
2)
3)
4)
这一算法的关键就是其第二步,如图1.4所示。
图1.4 完成一个点在Delaunay链表中的插入
最终对初始的2D多边形Delaunay三角剖分后的结果如图1.5所示。
图1.5 Delaunay三角剖分结果
1.2 生成多边形嵴线
图1.6 玄齿轴
为了对那些无关紧要的面片进行修剪,首先对所有的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扇结构化,并且在扇结构化过程中新添加的三角形边标记为覆盖边。
(a)从T类三角形开始剪切 (b)区域扩散 (c)算法停止
(d)扇结构三角片面 (e)扩散到下一个为J类三角形 (f)扇结构化
图1.7 从T类三角形开始修剪
扇形结构化后,得到的草图剖分结果如图1.8a所示。然后将其余S类三角形和J类三角形的内部边中点连接起来,构成了一条嵴线,如图1.8b所示。因为生成嵴线之后,嵴线将S类三角形和J类三角形剖分成了一个四边形和一到两个三角形,所以接下来要对S类三角形和J类三角形进行细三角化分。划分准则为:1)对于每个三角形必须保证至少有一个顶点处于笔画上,2)必须满足最大化最小角准则。最终得到一个完整的2D三角网格,如图1.8c所示。
(a)扇形化之后的草图剖分 (b)最终嵴线 (c)最终的三角剖分
1.8 对S类三角形和J类三角形进行细分
1.3 抬升嵴线上的顶点
曲面膨胀算法最终使得3D模型宽的地方胖,窄的地方瘦,而模型的宽与窄是由二维草图轮廓线的截面长度所决定的,而3D模型的胖瘦程度是由一个叫做“膨胀率”的常数来控制的。为了提高算法效率,可以用嵴线上顶点的相邻边长的平均值来表征该位置截面的长度;而膨胀率控制了嵴线上顶点在二维草绘平面上抬升的高度,一般要求膨胀率越小,嵴线顶点的抬升高度越低,反之,膨胀率越大,嵴线顶点抬升高度越高。因此可以认为嵴线顶点抬升高度与膨胀率之间存在着一定的比例关系,而将截面长度联系起来,可以得到嵴线抬升高度的计算公式为:
![对草绘建模曲面膨胀算法的理解 对草绘建模曲面膨胀算法的理解](https://i-blog.csdnimg.cn/blog_migrate/cd56743d7c987e7d0c17067ab6219c53.gif)
|
| ( 2‑1) |
式中, 为嵴线顶点抬高的高度, 为整个3D模型的膨胀率, 为与嵴线顶点相连的笔画点数, 为笔画点。
最终抬升之后的嵴线,如图1.9所示。
(a)嵴线抬升之前 (b)嵴线抬升之后
图1.9 嵴线抬升示意图
1.4 生成3D多边形曲面网格
接下来需要将内部边相对应的嵴线顶点与2D三角网格外部顶点用四分之一的椭圆弧连接过度,进而完成边的抬升,如图1.10a所示。然后用三角面片缝纫这些抬升边,如图1.10b所示。
(a)抬升边 (b)缝纫抬升边
图1.10 生成3D多边形网格
但是完成了边的抬升之后,需要在四分之一的椭圆弧上等角度的插值顶点。方法是将直角平分成几个夹角,如图1.11所示, 为笔画顶点, 为被抬升的顶点, 为椭圆弧上等角插值的顶点。那么,各插值的顶点坐标可用下式计算:
|
| ( 2‑2) |
图1.11 各顶点抬升的高度
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)技术,使得用户可以在曲面上创建和修改一些急剧变化的特征,如折痕、凹谷等.同时使用一个快速适应性增量多边化算法,允许重新对曲面进行局部多边化,从而避免了每革绘一条笔画都要对整个曲面进行处理的弊端。
使用网格曲面对草绘轮廓线进行蒙皮构造的方法很好地解决了大多数具有自由外观形状三维物体的创建工作,为基于草绘的三维建模提供了一个新的设计思路.遗憾的是,它们无法构建具有规则几何外形的物体,不支持像机械零件、建筑结构等刚性物体的草绘设计,这无疑缩小它们的应用范围。