1.5 NURBS曲面的构成
前面讨论的是NURBS曲线的构成,很自然地,如果把NURBS曲线扩展到两个方向,就能够得到NURBS曲面。
1.5.1 张量积曲面
可以认为NURBS曲面是一条NURBS曲面在空间运动时划过的轨迹,那么这个NURBS曲面的构成就要考虑两个方向的参数,一个是这条NURBS曲线本身的参数,另一个是它运动的轨迹线的参数。所以,通常用两条NURBS曲线的张量积来表示曲面。
什么是张量积呢?张量是一个数学上的概念,前面论述的矢量就是一种张量,但张量概念比矢量概念更宽泛(矢量是张量的一种特例)。例如,有两个矢量[a b]和[c d],它们都是张量,它们的张量积等于[ab ac bc cd]。
曲面的一般方程为(不考虑权值):
下面举例说明NURBS曲面的构成。
例1.4 如图1.40所示为由两个方向的2阶曲线生成的NURBS曲面,这两条曲线分别是Q(u)和Q(v),它们分别有3个控制点,则由它们生成的曲面的控制点网格由3×3=9个控制点组成,这9个控制点分别是P0,0、P0,1、P0,2…P3,3,用Ni,2(u)表示u向曲线的基函数,用Ri,2(v)表示v向曲线的基函数,u向和v向的阶数均为2,则此曲面的方程为(先不考虑权值):
图1.40 由两条2阶曲线生成的平面
由式(1.17)可看出,这个曲面方程由9个子项(9个控制点乘以各自的系数)组成,这些系数是u向和v向的基函数的乘积。这个式子的几何意义可以理解为,曲面上每一个点都等于9个控制点矢量乘以各自的系数以后相加所得的和,控制点系数由u向和v向的基函数的乘积决定,当u和v取不同的值,基函数的值也随之变化,造成曲面上每一个点的起伏变化。
因此,NURBS曲线的构成原理就是NURBS曲线构成原理在两个方向上的推广,曲面的特征也就类似于曲线的特征,曲面u向和v向的阶数可以不同,u向和v向可以由多段组成,相邻曲面段之间的连续性为(阶数-1)。
如图1.41所示曲面,在u向是3阶,由3段组成,有3个跨距区间,v向是1阶单跨距,v向的定义域为[0,1)。当v取固定值0.75时,曲面方程随参数u变化画出一条曲线ef,这条曲线上所有点的v参数值都等于0.75,我们把它叫做等参数线(Isoparametric Curve)。Rhino中为了便于观察曲面形态,在曲面表面画了一些结构线,它们都是u、v等于节点值时的等参数线,如图中的ab和cd,图中的v向只有一个跨距,没有内节点,在这种情况下为了把曲面表达清楚,Rhino在单一跨距中v=0.5的地方也画出一条等参数线作为结构线,如图中的曲线gh。建模的过程中使用(抽离结构线)指令可以计算并复制曲面上任意参数的等参数线。
图1.41 3阶×1阶曲面
1.5.2 Rhino中NURBS曲面的本质是四边面
由式(1.16)可知,Rhino的曲面由u、v两个方向张量的积来表示,这就决定了它在数据结构上是一个具有4个边的曲面,而且它在u向或者v向的参数一定是相等的,如图1.42所示,我们在曲面上抽离出几条等参数线1、2、3、4、5,这几条曲线的阶数和节点矢量以及控制点个数一定是相同的,如果我们用几条不同阶数和节点的曲线放样产生曲面,程序一定要先把它们的阶数和节点矢量变得相同,然后再构建曲面。如果Rhino发现一个面只有3个边,那么它的本质还是四边面,有两种情况让它表现出三边形的外观。
图1.42 曲面等参数线
第一种情况是剪切曲面,四边面剪切掉一半,剩下的曲面呈现三边曲面的外观,但是它的数据结构仍然是四边面,只不过程序把剪切掉的部分隐藏起来了。如果我们观察它的结构线走向,或者把它的控制点阵打开,就能够清楚地理解它的结构,如图1.43所示。剪切过的曲面在编辑时会受到很多限制,如(衔接曲面)指令不能把修剪过的边缘衔接到其他曲面边缘。如果想在曲面剪切过后改变曲面数据结构,使剪切后的边变成曲面真正的边缘,可以使用(缩回已修剪曲面至边缘)指令最大限度地改变曲面结构,把曲面边缘缩回到修剪边界。同样,由于曲面的张量积曲面本质,只有用曲面结构线(等参数线)剪切过的曲面,才能通过(缩回已修剪曲面至边缘)指令把剪切边变成曲面结构上的边缘,如图1.44所示,从曲面抽离出结构线,然后用这个结构线剪切曲面后,因为剪切边缘与曲面u向具有相同阶数和节点矢量,所以可以把曲面的边缘缩回到剪切边,从而改变曲面数据结构把剪切边作为新的曲面边缘。除此之外,像图1.43和图1.44那样的剪切方式,因为剪切边的参数与曲面u向和v向的参数均不相同,无法把曲面边缘缩回到剪切边,所以只能是尽量缩回,如图1.45所示。
图1.43 剪切过的曲面
图1.44 缩回已修剪曲面至边缘(1)
图1.45 缩回已修剪曲面至边缘(2)
第二种情况是控制点重合导致曲面呈现三边形。如图1.46所示,一个曲面,由于一条边上的控制点a、b、c、d重合,而使曲面的这条边退化成一个点,曲面外形变成三角形。在这种情况下,曲面的边并没有消失,它在数据结构上的阶数和节点矢量没有改变,改变的只是控制点的空间位置,控制点重合以后原来的边缘ad变成了长度为0的边缘。Rhino中,把这个长度为0的边缘叫做汇集点边缘。这种情况的曲面与剪切曲面不同,要注意分清楚它们之间的区别。如图1.47所示,两个曲面的外形是一样的,但是左边的是剪切过的曲面,右边是未剪切曲面,从它们的结构线的走向上也可以看出不同。从参数上看,左边剪切曲面上部边缘的定义域与下部边缘不同,而右边未剪切曲面上下边缘的定义域相同。
图1.46 控制点重合形成三角形面
图1.47 相同的外形,不同的参数
1.5.3 u向和v向
在建立曲面时,经常要分辨曲面的参数方向。前面提到,张量积曲面有两个参数变量,在Rhino中用字母u、v来代表它们。相应地,把与u、v对应的曲面方向分别叫做u向和v向。当参数u在定义域内变化时,曲面在u向相应地变化;当v在定义域内变化时,曲面在v向相应地变化。如图1.48所示,定义域内的参数值与曲面上的点一一对应,当v等于一个确定的值va时,随着u的不断变化,在曲面上绘出一条等参数线ab,当u等于一个确定的值ua时,随着v的不断变化,在曲面上绘出一条等参数线cd。我们要注意,定义域和曲面属于两个不同的空间,定义域只是参数的取值范围,没有明显的几何意义,而曲面位于三维世界坐标系空间,具有三维几何特性。所以,不要把曲面的u、v坐标和它的三维x,y,z坐标相混淆。x,y,z坐标是相互垂直的关系,而曲面的u、v方向并不一定是垂直的。u、v方向在曲面上面没有特定的空间几何关系,如图1.49所示,同样的定义域对应着一个圆柱曲面,因此同样的定义域可能对应的曲面造型千变万化。同时应注意,u、v只是两个符号,代表特定的数学变量,在数学上用其他字母例如s、t来表示也可以,在其他的CAD软件中就可能用不同的字母来代表曲面的不同参数方向,不过我们已经习惯了用u、v来代表曲面方向了。另一方面,曲面的u向和v向并不是固定不变的,可以互换,例如把u换成v向,把v换成u向。在Rhino中为了表达方便,在用户建立曲面时程序会对曲面的u、v方向有如下默认的规定。
图1.48 u向和v向(1)
图1.49 u向和v向(2)
(以二、三或四个边缘曲线建立曲面):用这个指令建立曲面,如果输入4个边,则默认1、3边是v向,2、4边是u向。
(放样):系统默认放样曲面截面曲线方向是v向,放样的方向是u向。
(直线挤出):默认挤出方向是v向。
(从网线建立曲面):网线中A、C是u向,B、D是v向。
(单轨扫掠):默认断面曲线是v向,路径曲线方向是u向。
(双轨扫掠):默认断面曲线是v向,路径曲线方向是u向。
(旋转成形):旋转母线是v向,圆周是u向。
总而言之,可以把曲面想象成一块织物,曲面的u向和v向就是组成这块织物的经线和纬线,织物可以改变成不同的形状,经线和纬线也会相应地改变形状。想一想,衣服在穿在身上、丢在洗衣机里、叠在柜子里等不同情况下形态会千变万化,它的经线和纬线的形状也会任意弯曲、缠绕,但经线和纬线之间的相互关系在编制时就已经固定不会改变:经线和纬线必须相互交叉,每一条经线必须与所有的纬线分别有一个交叉点,每一条纬线必须与所有的经线分别有一个交叉点,经线和经线、纬线和纬线之间按照顺序排列,不会相互跨越或重叠。从一定程度上说,我们在程序中所建的曲面就是一块织物,我们用它来做衣服,衣服是否漂亮取决于设计师的设计,当然,也取决于织物本身是否漂亮。
1.5.4 NURBS曲面的剪切
Rhino建模过程很多都涉及曲面剪切,例如布尔运算、剪切、分割、倒角等操作。曲面剪切时先进行曲面求交的计算,首先计算出用来剪切的物体和被剪切曲面的交线,然后再把交线一侧的要剪切掉的部分隐藏起来,但是曲面本身的原始参数结构没有发生变化,如图1.50(a)是原始曲面及其控制点结构;图1.50(b)是剪切过后的曲面,被剪掉的部分已经隐藏起来了,但是曲面的控制点结构与原始曲面相同;图1.50(c)是用曲面本身的结构线分割曲面,分割过后曲面控制点结构发生变化,用来分割的结构线变成曲面的新的边缘,这是因为用结构线分割曲面实际上相当于在结构线的位置连续插入控制点,从而使结构线的位置变成曲面新的边缘。
图1.50 剪切曲面
图1.50(b)所示的剪切曲面,由于其维持原始的参数结构,所以其剪切边缘在Rhino中的计算会受到许多限制,例如(衔接)、(合并)、(延伸)等指令都无法针对剪切边执行。同样,剪切过的曲面可以通过(取消修剪)指令恢复到原始未剪切的状态。
曲面剪切是建模过程中必要的操作,但大量的曲面剪切可能会带来一些文件传输过程中的问题。因为剪切操作要计算曲面之间的相交线,计算方法有很多种(曲面求交算法参考3.3.1节),各种CAD软件之间可能使用不同的数学方法来定义交线,因此在Rhino中所建的模型传输到其他的软件中,有可能得不到正确的结果。
1.5.5 牢记NURBS曲面的数据结构
NURBS曲面由u、v两个方向参数构成,因此其本质是有4个边的矩形曲面。掌握住这个本质有助于高效建构模型。
通过图1.51(a)所示网格建立一个图1.51(b)所示曲面,在对曲线应用(从网线建立曲面)指令时,用不同的方法组织曲线,可得到不同的曲面结构。
图1.51 网格织面(1)
如图1.52所示,用点a把u向曲线分割为1、2、3、4四段,曲线5代表v向曲线,则执行指令可得到右侧曲面。注意观察曲面的结构线,a点所在的位置形成极点,它是曲面的另外一个v边缘缩聚成的一个点。
图1.52 网格织面(2)
如图1.53所示,按照左图方式组织曲线,1、2两段是u向曲线,3、4两条是v向曲线,则执行指令可得到右侧曲面,a、b点所在的位置形成极点。
图1.53 网格织面(3)
如图1.54所示,按照左图方式组织曲线,1、2两段是u向曲线,3、4两条是v向曲线,则执行指令可得到右侧曲面,a、b点所在的位置形成极点。
图1.54 网格织面(4)
总而言之,用NURBS方法建立的曲面的本质是四边面,其原始形状是一个矩形,可以通过控制点的移动、重合等操作使曲面呈现出各种不同的外观形态。但不管如何变形,其矩形面的拓扑结构不会发生变化,在建模过程中要时刻牢记这一点。这将会有助于我们更高效地确立建模方法和途径,更高质量地建立模型。