12.7 B样条曲面的反算
一般情况下,我们把由控制顶点确定的B样条曲面称之为B样条曲面的正算。所谓B样条曲面的反算,指的是要构造一张次B样条曲面,使其插值于给定的呈矩形拓扑结构的数据点集,也就是要求定义B样条曲面的控制顶点及其节点矢量。
为了使次B样条曲面通过给定的数据点,其反算过程使曲面的四角点分别与数据点一致,使曲面的分片角点分别依次与相应的内数据点一致。因此,数据点将依次与B样条曲面定义域内的节点一一对应,即点有节点值。这样,该B样条曲面将由个控制顶点定义,相应的节点矢量分别是、。
设所求的次B样条插值曲面的方程是:
(12.7.1)
根据插值条件,有:
(12.7.2)
方程组(12.7.2)往往过于庞大,给求解及在计算机上的实现带来困难。因而,一般的解法是将曲面的反算问题化解为两步的曲线反算问题。为此,我们将曲面方程(12.7.1)改写如下:
(12.7.3)
其中,。
对于给定的参数,便得到上述条曲线上个点,以其作为控制顶点便定义了曲面上一条以为参数的等参数曲线。当参数遍历参数区间时,等参数曲线便描述了整张曲面。这无数条向等参数曲线中,有条必然查值于给定的数据点,其中每一条插值于数据点中的一列数据点。这条向等参数曲线称之为截面曲线(section curves)。由此,便得到反算B样条曲面的基本原理。
12.7.1 B样条曲面反算的基本原理
Step1. 由给定的数据点,反算出条次B样条曲线:
(12.7.4)
使得
(12.7.5)
Step2. 以Step 1中所求的条次B样条曲线编号相同的控制顶点为数据点,沿向反算出条次B样条曲线:
(12.7.6)
使得
(12.7.7)
点列即为所求插值B样条曲面的控制顶点,即:
证明 给定参数,有:
12.7.2 B样条曲面反算的求解
为了求解曲面的反算,根据前面的讨论,我们必须确定定义B样条曲面的节点矢量、。此外,由于数据点共有,而插值曲面的控制顶点有个。因此,为了保证解的存在惟一性,还需提供个约束方程。
- 节点矢量的确定
节点矢量的确定方法很多,比如均匀参数化、累加弦长参数化、向心参数化以及修正弦长参数化等,我们这里采用向心参数化方法确定节点矢量。
- 向节点矢量的确定:
for (q=0; q<=n; q++ ){
; ;
for (r=1; r<=m; r++)
}
; ;
for (r=1; r<=m; r++)
那么,向节点矢量如下:
(12.7.8)
其中。
- 向节点矢量的确定:
for (r=0; r<=m; r++ ){
; ;
for (q=1; q<=n; q++)
}
; ;
for (q=1; q<=n; q++)
那么,向节点矢量如下:
(12.7.9)
其中。
- 约束方程的确定
约束方程通过边界条件给出,即在向提供个边界条件,在向则提供边界条件。
- 反算B样条曲面的控制顶点
3.1 求解个方程组
(12.7.10)
求出控制顶点。
3.2 求解个方程组
(12.7.11)
求出控制顶点。
12.7.3 双三次B样条曲面的反算
实际工程中较多地采用双三次B样条曲面进行插值曲面的构造。对此,,其节点矢量可按12.7.2中所给方法确定如下:
(12.7.12)
(12.7.13)
确定约束方程的边界条件为:
(1). 给定数据点处的向偏导矢:
(12.7.14)
(2). 给定数据点处的向偏导矢:
(12.7.15)
(3). 在数据点处给定曲面的混合偏导矢:
(12.7.16)
以为数据点,为向切矢,反算一三次B样条曲线:
以为数据点,为向切矢,反算另一三次B样条曲线:
由此可求出个控制顶点。这样,双三次B样条曲面的反算如下:
Step1. 以,为数据点,为边界切矢,求解个方程组:
; (12.7.17)
即:
(12.7.18)
其中:
,,
解之,即可求出未知控制顶点。
Step2. 以,为数据点,为边界切矢,求解两个方程组:
; (12.7.19)
即:
(12.7.20)
其中:
解之,即可求出未知控制顶点。
Step3. 以,为数据点,为边界切矢,求解个方程组:
; (12.7.21)
即:
(12.7.22)
其中:
,,
解之,即可求出全部的控制顶点。
12.7.4 反算B样条曲面的其他方法
上述反算B样条曲面的方法之特点是,以节点矢量中的内节点作为插值点之参数,虽然方便,但给用户却带来了不便,求用户给顶边界条件。为了避免这一缺陷,我们可选择其他的节点矢量,以使插值B样条曲面的控制顶点数与已知数据点数相同。为此,我们选择如下的节点矢量:
(12.7.23)
其中,。
(12.7.24)
其中,。
而插值点处的参数选择为。
做了如上的节点矢量和插值点处的参数选择后,其所求的次B样条插值曲面便是:
(12.7.25)
根据插值条件,有下述方程组:
(12.7.26)
该方程组共有个方程,个未知量,可惟一求出控制顶点。方程组的求解也可分两步进行:
Step1. 固定下标,解方程组:
(12.7.27)
此时,共有个方程组,每一个方程组中有个方程,个未知量。解之,即可求出控制顶点:
(12.7.28)
这相当于求向等参数线的控制顶点。
Step2. 固定下标,解方程组:
(12.7.29)
此时,共有个方程组,每一个方程组中有个方程,个未知量。解之,即可求出控制顶点:
(12.7.30)
那么,以为控制顶点,节点矢量为和的两组B样条基函数所定义的次B样条曲面几为所求的插值曲面。
证明 给定参数,有:
12.8 蒙皮曲面设计技术
12.8.1 蒙皮曲面的构造
在CAGD中,参数曲面描述被广泛地分成形状表示与形状设计两类。对于形状表示,已存在一个模型的原型和描述它的数据信息,相应的计算机系统只是在合适的容差内对其自动处理。而形状设计从概念上讲,则接受设计者的模型(或许只是粗略的轮廓),其设计过程以交互方式在计算机和设计者之间进行,直至获得满意的结果。
在形状设计里一个特别重要的问题是如何降使低曲面定义与交互的维数从三维的物体空间降到二维的屏幕显示平面,以便设计者更好地控制形状。这个维数问题对于某些二维半设计应用类别例如旋转面是容易解决的。对于一般的三维曲面,这个问题的解决伴随着合适的交互技术。
与上一节介绍的B样条插值曲面反算不同的另一类插值问题,就是蒙皮(skinning)法生成曲面。在这里插值曲面不再是通过给定的数据点阵,而是直接按顺序通过一族曲线。这个方法传统上称为放样(lofting),为早期造船与飞机工业所普遍采用以生成曲面。蒙皮的任务就是拟合一张曲面(即"皮")通过一组有许的称为截面曲线的空间曲线。可形象地看成为给一族截面曲线构成的骨架蒙上一张光滑的皮,所生成的曲面就称为蒙皮曲面。蒙皮这一术语现在已经用在更多的场合。蒙皮法通常被考虑为最适合于交互CAD应用的,目前市场上每个CAD系统实际上都采用类似的曲面定义。
为了使蒙皮法成为交互CAD应用里一种有效的曲面生成方法,就面临怎样解决在三维空间里截面曲线的交互问题。幸好,许多CAD应用允许截面曲线恰恰采用平面曲线,用于初始模型描述。因而,可以在同一显示平面上完成所有截面曲线的设计。然后,用一条所谓脊线(spine curve)引导截面曲线交换到三维空间,接着生成插值这些截面曲线的曲面。这是在当今曲面造型实践中广泛采用的技术。
用蒙皮法生成B样条曲面可分为以下几步:
Step1. 设计截面曲线
由于所有截面曲线都是平面曲线,因此可以在设计平面内选择一局部坐标系(设计坐标系)。假设共有条截面曲线,其B样条表示为:
其中定义次B样条基函数的节点矢量为:
Step2. 统一截面曲线的次数和节点矢量
由于截面曲线的设计非常灵活,既可以是一个设计者在不同的时间内完成,也可能是许多设计者各自对立完成,并且每一截面曲线的初始数据点数目亦可能不同。因此,最终用于曲面设计的每一条截面曲线都可能具有不同的次数、不同的定义基函数的节点矢量、不同的参数区间。所以,需要将所有曲线用统一的参数区间、统一的次数和统一的表示式来描述,以便进行曲面设计。为此需进行以下操作:
① 统一次数。使所有具有较低次数的截面曲线都升阶到其中的最高次数;
② 参数变换。使所有截面曲线具有统一的定义区间,为此需进行参数变换:
③ 合并节点矢量。将每一截面曲线的节点矢量中的节点插入到其他截面曲线的节点矢量之中。此处的节点插入只对相异节点进行。插入节点的结果使得所有截面曲线都具有统一的节点矢量。
经过以上三步,便得到了具有统一次数与统一节点矢量的条截面曲线:
其中统一的节点矢量为
Step3. 设计脊线
脊线可以是平面曲线,也可以是在全局坐标系里的空间B样条曲线,它是作为一条插值B样条曲线来设计的,其插值点就是截面曲线的设计平面的原点在坐标系中的位置─目标点。脊线的形状反映曲面沿纵向的形状,同时脊线的次数和节点矢量即为曲面向的次数和节点矢量。
Step4. 截面曲线在空间的定位
设脊线为
节点矢量为
目标点为.那么,截面曲线的空间定位分为三步完成:
① 平移:将设计平面平移到目标点;
② 旋转:将设计平面旋转使其垂直于目标点处的切矢;
③ 绕目标点处的切矢旋转至所需位置。
Step5. 以沿纵向的各截面曲线的控制顶点为插值点,以为插值点处的参数,构造插值B样条曲线
求解方程组
即可求出其相应的控制顶点。所有的控制顶点便构成了曲面的控制顶点阵列。
经过以上五步,构造的B样条曲面插值于所有的截面曲线。所求的曲面表达式是:
证明 将代入曲面表达式,则有:
12.8.2 蒙皮方法存在的问题
尽管蒙皮法在曲面设计中非常重要、应用广泛,但是存在以下严重问题:
1. 如果截面曲线的数目很多且每一截面曲线都有不同的节点矢量(此种情况易于发生,因为每一截面曲线都是独立设计的),那么统一后的节点矢量将非常庞大。这将使曲面的存储空间大大增加,因为每插入一新的节点,都意味着增加许多新的控制顶点,因而其数据是海量的。如何压缩是有待进一步研究的问题。
2. 如果合并后的节点矢量中有非常接近的节点,那么将产生非常窄的曲面条,从而带来数值计算上的困难以及曲面加工的困难。若将值非常接近的节点作为同一节点,则蒙皮曲面不插值原来的截面曲线。这是因为曲线的形状因节点矢量的修改而改变。
3. 截面曲线的连续,不能保证蒙皮曲面的连续。
导致这些问题的根本原因,不是蒙皮法本身,而是蒙皮曲面的表示式。我们由于选择用张量积形式来表示蒙皮曲面,所以才引出了这些问题。如果改用其他的表示形式,比如采用过程性定义方法来描述蒙皮曲面,便能解决上述的问题1和问题2。但是过程性定义方法又使得曲面的几何处理极为不便,因为过程性定义方法不能提供曲面的代数表示式。虽然工程应用中在一定的容差范围内采取了折中的方案,但这一问题的根本解决还没有完成,它们仍是阻碍CAD/CAM系统迈上新台阶的关键技术。
有两种蒙皮法生成曲面的特殊情况,如果在整个蒙皮操作中,截面曲线恒有固定的形状,一旦脊线与截面曲线给定,截面曲线就能平移到脊线的预定目标点上,并完成必要的旋转以在三维空间定位,然后就可生成曲面。蒙皮法的这种特殊情形称为扫掠(sweeping),生成的曲面也称为扫掠曲面(swept surface)
同样地,用于扫掠的目标点被选为脊线的端点与分段连接点。如果截面曲线上的对应点变换到与位于脊线上的目标点相匹配,则由B样条插值曲线的惟一性,生成的扫掠曲面也将插值脊线。脊线本身将成为扫掠的一条纵向等参数线。曲面沿纵向的节点矢量与脊线一致。
扫掠结果依赖于脊线的参数化。B样条扫掠不能保证除位于脊线目标点的截面曲线以外的其他横截面曲线都具有相同的形状。如果将脊线细分,则生成曲面的其他横截面曲线能更接近给定的截面曲线的形状。
回转法(swing)是扫掠法的扩展,或者可看作常规的旋转扫掠的推广。设有所谓轮廓线:
被定义在右(左)平面内,是它的B样条控制顶点。又设有轨道曲线
围绕原点,位于平面内,具有控制顶点。使轮廓线绕空间坐标系的轴旋转,并连续地根据轨道曲线进行沿轴与轴两个方向的比例缩放,则生成回转曲面:
其中,是一个根据需要选取的比例因子。表示的分量,其他带上标记号类似。可见,与旋转一样,轮廓线在回转中其坐标保持不变。同样地,回转曲面中与两个分量涉及到比例变换。根据仿射不变性,仅需对轮廓线与轨道线的B样条控制顶点的相应分量作相应的变换即可。由此,可相应得到回转曲面的控制顶点:
回转曲面的两个参数与和节点矢量分别与轮廓线、轨道曲线的相同。
特殊地,如果轨道曲线为一圆心在原点的整圆,回转就成了旋转扫掠,从而生成旋转面。然而,应该指出的是,B样条曲线不能精确表示圆,当然也就得不到精确的旋转面。欲精确表示圆与旋转面,就需要采用NURBS方法。