曲线 C ( u ) C(u) C(u)是单参数的矢值函数,它是由直线段到三维欧几里得空间的映射(变形)。曲面是关于两个参数 u u u和 v v v的矢值函数,它表示由 u v uv uv平面上的二维区域 R R R到三维欧几里得空间的映射。因此,它可以表示为 S ( u , v ) = ( x ( u , v ) , y ( u , v ) , z ( u , v ) ) , ( u , v ) ∈ R \textbf{S}(u,v)=\left(x(u,v),y(u,v),z(u,v)\right),(u,v)\in R S(u,v)=(x(u,v),y(u,v),z(u,v)),(u,v)∈R的形式。有很多表示曲面的形式,它们的区别在于所采用的坐标函数或区域 R R R的类型不同。或许最简单,也是在几何造型中应用最广泛的一种形式是张量积曲面。
张量积方法基本上是在两个方向上均采用曲线的处理方式。它也采用基函数和对应的几何系数的乘积之和的形式表示曲面。基函数是 u u u和 v v v的二元函数,它由关于 u u u的一元基函数和关于 v v v的一元基函数的乘积来构造。几何系数(在拓扑上)被安排成两个方向的 n × m n\times m n×m的网格。因此,张量积曲面具有如下形式:
S ( u , v ) = ( x ( u , v ) , y ( u , v ) , z ( u , v ) ) = ∑ i = 0 n ∑ j = 0 m f i ( u ) g j ( v ) b i , j ( 1.20 ) \mathbf{S}(u,v)=(x(u,v),y(u,v),z(u,v))=\sum\limits_{i=0}^n\sum\limits_{j=0}^{m}f_i(u)g_j(v)\mathbf{b}_{i,j}\quad(1.20) S(u,v)=(x(u,v),y(u,v),z(u,v))=i=0∑nj=0∑mfi(u)gj(v)bi,j(1.20)
其中
{ b i , j = ( x i , j , y i , j , z i , j ) 0 ⩽ u , v ⩽ 1 \begin{cases}\mathbf{b}_{i,j}=(x_{i,j},y_{i,j},z_{i,j})\\ \\ 0\leqslant u,v\leqslant1\end{cases} ⎩ ⎨ ⎧bi,j=(xi,j,yi,j,zi,j)0⩽u,v⩽1
注意在张量积曲面的映射中, ( u , v ) (u,v) (u,v)平面上的区域是正方形(更一般的是矩形)。另外还可以注意到 S ( u , v ) S(u,v) S(u,v)具有如下的矩阵形式:
S ( u , v ) = [ f i ( u ) ] T [ b i , j ] [ g j ( v ) ] \mathbf{S}(u,v)=\Big[f_i(u)\Big]^{\text{T}}\Big[\mathbf{b}_{i,j}\Big]\Big[g_j(v)\Big] S(u,v)=[fi(u)]T[bi,j][gj(v)]
其中, [ f i ( u ) ] T \Big[f_i(u)\Big]^{\text{T}} [fi(u)]T是 1 × ( n + 1 ) 1\times(n+1) 1×(n+1)行向量, ] [ g j ( v ) ] \Big]\Big[g_j(v)\Big] ][gj(v)]是 ( m + 1 ) × 1 (m+1)\times1 (m+1)×1列向量, [ b i , j ] \Big[\mathbf{b}_{i,j}\Big] [bi,j]是由三维空间中的点组成的 ( n + 1 ) × ( m + 1 ) (n+1)\times(m+1) (n+1)×(m+1)矩阵。
作为一个例子,我们来考虑幂基曲面
S ( u , v ) = ∑ i = 0 n ∑ j = 0 m a i , j u i v j = [ u i ] T [ a i , j ] [ v j ] { a i j = ( x i , j , y i , j , z i , j ) 0 ⩽ u , v ⩽ 1 ( 1.21 ) \mathbf{S}(u,v)=\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{m}\mathbf{a}_{i,j}u^iv^j=\left[\mathbf{u}^i\right]^{T}\left[\mathbf{a}_{i,j}\right]\left[\mathbf{v}^j\right]\left\{\begin{matrix}\mathbf{a}_{ij}=(\mathbf{x}_{i,j},\mathbf{y}_{i,j},\mathbf{z}_{i,j})\\ 0\leqslant\mathbf{u},\mathbf{v}\leqslant1\end{matrix}\right.\quad(1.21) S(u,v)=i=0∑nj=0∑mai,juivj=[ui]T[ai,j][vj]{aij=(xi,j,yi,j,zi,j)0⩽u,v⩽1(1.21)
这里,我们有 f i ( u ) = u i , g j ( v ) = v j f_{i}(u)=u^{i},g_{j}(v)=v^{j} fi(u)=ui,gj(v)=vj,曲面的基函数是它们的乘积 { u i v j } \{u^iv^j\} {uivj}。如果固定 u = u 0 u=u_0 u=u0,那么
C u 0 ( v ) = S ( u 0 , v ) = ∑ j = 0 m ( ∑ i = 0 n a i , j u 0 i ) v j = ∑ j = 0 m b j ( u 0 ) v j ( 1.22 ) \mathbf{C}_{u_0}\left(\begin{matrix}v\end{matrix}\right)=\mathbf{S}(\mathbf{u}_0,v)=\sum\limits_{j=0}^m\Biggl(\sum\limits_{i=0}^n\mathbf{a}_{i,j}u^i_0\Biggr)v^j=\sum\limits_{j=0}^m\mathbf{b}_j(u_0)v^j\quad(1.22) Cu0(v)=S(u0,v)=j=0∑m(i=0∑nai,ju0i)vj=j=0∑mbj(u0)vj(1.22)
是位于曲面 S ( u , v ) S(u,v) S(u,v)上的幂基曲线,其中
b j ( u 0 ) = ∑ i = 0 n a i , j u 0 i \mathbf{b}_j(u_0)=\sum\limits_{i=0}^n\mathbf{a}_{i,j}u_0^i bj(u0)=i=0∑nai,ju0i
类似地, C v 0 ( u ) \mathbf{C}_{v_0}\left(\begin{matrix}u\end{matrix}\right) Cv0(u)也是曲面 S ( u , v ) S(u,v) S(u,v)上的幂基曲线;曲线 C u 0 ( v ) \mathbf{C}_{u_0}\left(\begin{matrix}v\end{matrix}\right) Cu0(v)和 C v 0 ( u ) \mathbf{C}_{v_0}\left(\begin{matrix}u\end{matrix}\right) Cv0(u)交于曲面上的点 S ( u 0 , v 0 ) S(u_0,v_0) S(u0,v0)。这些曲线称为等参数线(isoparametric curve 或 isocurve), C u 0 ( v ) \mathbf{C}_{u_0}\left(\begin{matrix}v\end{matrix}\right) Cu0(v)称为 v v v方向的等参数线(或 v v v参数线), C v 0 ( u ) \mathbf{C}_{v_0}\left(\begin{matrix}u\end{matrix}\right) Cv0(u)称为 u u u方向的等参数线(或 u u u参数线)。
(1.21)式可以写成如下形式
S ( u , v ) = { a 0 , 0 + a 0 , 1 v + a 0 , 2 v 2 + ⋯ + a 0 , m v m } ⏟ b 0 + u { a 1 , 0 + a 1 , 1 v + a 1 , 2 v 2 + ⋯ + a 1 , m v m } ⏟ b 1 + u 2 { a 2 , 0 + a 2 , 1 v + a 2 , 2 v 2 + ⋯ + a 2 , m v m } ⏟ b 2 + u n { a n , 0 + a n , 1 v + a n , 2 v 2 + ⋯ + a n , m v m } ⏟ p n = b 0 + b 1 u + b 2 u 2 + ⋯ + b n u n \begin{aligned}\mathbf{S}(u,v)& =\underbrace{\{\mathbf{a}_{0,0}+\mathbf{a}_{0,1}v+\mathbf{a}_{0,2}v^{2}+\cdots+\mathbf{a}{0,m}v^{m}\}}_{b_{0}} \\&+u\underbrace{\{\mathbf{a}_{1,0}+\mathbf{a}_{1,1}v+\mathbf{a}_{1,2}v^2+\cdots+\mathbf{a}_{1,m}v^m\}}_{\mathbf{b}_1} \\&+u^2\underbrace{\{\mathbf{a}_{2,0}+\mathbf{a}_{2,1}v+\mathbf{a}_{2,2}v^2+\cdots+\mathbf{a}_{2,m}v^m\}}_{\mathbf{b}_2} \\& \\&+u^n\underbrace{\{\mathbf{a}_{n,0}+\mathbf{a}_{n,1}v+\mathbf{a}_{n,2}v^2+\cdots+\mathbf{a}_{n,m}v^m\}}_{p_n} \\&=\textbf{b}_0+\textbf{b}_1u+\textbf{b}_2u^2+\cdots+\textbf{b}_n u^n\end{aligned} S(u,v)=b0 {a0,0+a0,1v+a0,2v2+⋯+a0,mvm}+ub1 {a1,0+a1,1v+a1,2v2+⋯+a1,mvm}+u2b2 {a2,0+a2,1v+a2,2v2+⋯+a2,mvm}+unpn {an,0+an,1v+an,2v2+⋯+an,mvm}=b0+b1u+b2u2+⋯+bnun
上式中大括号内的项是简单的多项式,可以通过Horner算法来计算,得到 b 0 , b 1 , … , b n b_0,b_1,\dots,b_n b0,b1,…,bn。再次对 b 0 , b 1 , … , b n b_0,b_1,\dots,b_n b0,b1,…,bn应用Horner算法,就可以得到曲面上的点。
张量积曲面的典型算法通常可由曲线的算法推广而来,其一般过程是:先沿着一个方向运用曲线的算法对张量积曲面系数的每一行(或列)(将其看作曲线的系数)进行处理,然后再沿着另一个方向对所得结果的每一列(或行)进行处理。
对(1.21)式求偏导,得
S u ( u , v ) = ∑ i = 1 n ∑ j = 0 m i a i , j u i − 1 v j \mathbf{S}_{u}\left(\begin{matrix}u,v\end{matrix}\right)=\sum\limits_{i=1}^{n}\sum\limits_{j=0}^{m}i\mathbf{a}_{i,j}u^{i-1}v^j Su(u,v)=i=1∑nj=0∑miai,jui−1vj, S v ( u , v ) = ∑ i = 0 n ∑ j = 1 m j a i , j u i v j − 1 \mathbf{S}_v(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=1}^m j\mathbf{a}_{i,j}u^i v^{j-1} Sv(u,v)=i=0∑nj=1∑mjai,juivj−1
注意:对于固定的 ( u 0 , v 0 ) (u_0,v_0) (u0,v0), S u ( u 0 , v 0 ) = C v 0 ′ ( u 0 ) \mathbf{S}_{u}\left(\begin{matrix}u_{0},v_{0}\end{matrix}\right)=\mathbf{C}_{v_{0}}^{\prime}\left(\begin{matrix}u_{0}\end{matrix}\right) Su(u0,v0)=Cv0′(u0), S v ( u 0 , v 0 ) = C u 0 ′ ( v 0 ) \mathbf{S}_{v}\left(\begin{matrix}u_{0},v_{0}\end{matrix}\right)=\mathbf{C}_{u_{0}}^{\prime}\left(\begin{matrix}v_{0}\end{matrix}\right) Sv(u0,v0)=Cu0′(v0),单位法矢 N N N可由 N = S u × S v ∣ S u × S v ∣ {N}={\frac{\mathbf{S}_{u}\times\mathbf{S}_{v}}{\mid\mathbf{S}_{u}\times\mathbf{S}_{v}\mid}} N=∣Su×Sv∣Su×Sv式计算。
非有理Bezier曲面可由两个方向的控制点网格和一元Bernstein多项式的乘积定义
S ( u , v ) = ∑ i = 0 n ∑ j = 0 m B i , n ( u ) B j , m ( v ) P i , j , 0 ⩽ u , v ⩽ 1 ( 1.23 ) \begin{aligned}\mathbf{S}(u,v)=\sum_{i=0}^n\sum_{j=0}^mB_{i,n}(u)B_{j,m}(v)\mathbf{P}_{i,j},\quad0\leqslant u,v\leqslant1\quad(1.23)\end{aligned} S(u,v)=i=0∑nj=0∑mBi,n(u)Bj,m(v)Pi,j,0⩽u,v⩽1(1.23)
对于固定的 u = u 0 u=u_0 u=u0,有
C u 0 ( v ) = S ( u 0 , v ) = ∑ i = 0 n ∑ j = 0 m B i , n ( u 0 ) B j , m ( v ) P i , j = ∑ j = 0 m B j , m ( v ) ( ∑ i = 0 n B i , n ( u 0 ) P i , j ) = ∑ j = 0 m B j , m ( v ) Q j ( u 0 ) ( 1.24 ) \begin{aligned}\boldsymbol{C}_{u_{0}}\left(v\right)& =\mathbf{S}(\boldsymbol{u}_{0},v)=\sum_{i=0}^{n}\sum_{j=0}^{m}B_{i,n}(\boldsymbol{u}_{0})B_{j,m}(v)\mathbf{P}_{i,j} \\&=\sum\limits_{j=0}^{m}B_{j,m}(v)\Big(\sum\limits_{i=0}^{n}B_{i,n}(u_0)\textbf{P}_{i,j}\Big)=\sum\limits_{j=0}^{m}B_{j,m}(v)\textbf{Q}_j(u_0)& (1.24) \end{aligned} Cu0(v)=S(u0,v)=i=0∑nj=0∑mBi,n(u0)Bj,m(v)Pi,j=j=0∑mBj,m(v)(i=0∑nBi,n(u0)Pi,j)=j=0∑mBj,m(v)Qj(u0)(1.24)
是一条位于曲面 S ( u , v ) S(u,v) S(u,v)上的Bezier曲线(曲面 v v v方向的等参数线),其中, Q i ( u 0 ) = ∑ i = 0 n B i , n ( u 0 ) P i , j , j = 0 , 1 , ⋯ , m Q_i(u_0)=\sum\limits_{i=0}^n B_{i,n}(u_0)\mathbf{P}_{i,j},j=0,1,\cdots,m Qi(u0)=i=0∑nBi,n(u0)Pi,j,j=0,1,⋯,m。类似地, C v 0 ( u ) = S ( u , v 0 ) = ∑ i = 0 n B i , n ( u ) Q i ( v 0 ) \mathbf{C}_{v_{0}}\left(\begin{matrix}{u}\\ \end{matrix}\right)=\mathbf{S}(u,v_{0})=\sum_{i=0}^{n}B_{i,n}(u)\mathbf{Q}_{i}(v_{0}) Cv0(u)=S(u,v0)=∑i=0nBi,n(u)Qi(v0)是曲面 u u u方向的等参数线(也是Bezier曲线)。
和曲线的情形类似,由于Bezier曲面具有很多优良的性质,因而和幂基曲面相比更适合于几何造型中的应用。尤其是,Bezier曲面及其基函数具有一下性质:
很容易将deCastcljau算法推广用来计算Bezier曲面上的点。令 ( u 0 , v 0 ) (u_0,v_0) (u0,v0)固定,对于固定的 j 0 j_0 j0, Q j 0 = ∑ i = 0 n B i , n ( u 0 ) P i , j 0 Q_{j_0}=\sum_{i=0}^{n}B_{i,n}(u_0)\mathbf{P}_{i,j_0} Qj0=∑i=0nBi,n(u0)Pi,j0可通过对第 j 0 j_0 j0行控制点 { P i , j 0 } \{P_{i,j_0}\} {Pi,j0}, i = 0 , 1 , … , n i=0,1,\dots,n i=0,1,…,n,应用deCasteljau算法得到。因而,应用deCasteljau算法 m + 1 m+1 m+1次即可得到 C u 0 ( v 0 ) = S ( u 0 , v 0 ) C_{u_0}(v_0)=S(u_0,v_0) Cu0(v0)=S(u0,v0)。这个过程需要执行 n ( n + 1 ) ( m + 1 ) 2 + m ( m + 1 ) 2 ( 1.25 ) \frac{n(n+1)(m+1)}{2}+\frac{m(m+1)}{2}\quad(1.25) 2n(n+1)(m+1)+2m(m+1)(1.25)次线性插值运算。当然,我们也可以先计算 C v 0 ( u ) C_{v_0}(u) Cv0(u);(应用deCasteljau算法 n + 1 n+1 n+1次)然后再计算 C v 0 ( u 0 ) = S ( u 0 , v 0 ) \mathbf{C}_{v_0}\left(\begin{matrix}u_0\end{matrix}\right)\mathrm{=}\mathbf{S}(u_0,v_0) Cv0(u0)=S(u0,v0),这需要执行 n ( m + 1 ) ( n + 1 ) 2 + n ( n + 1 ) 2 ( 1.26 ) \frac{n(m+1)(n+1)}{2}+\frac{n(n+1)}{2}\quad(1.26) 2n(m+1)(n+1)+2n(n+1)(1.26)次线性插值运算。因此,当 n > m n>m n>m时,先计算 C v 0 ( u ) C_{v_{0}}(u) Cv0(u)在计算 C v 0 ( u 0 ) C_{v_{0}}(u_0) Cv0(u0);否则,先计算 C u 0 ( v ) C_{u_{0}}(v) Cu0(v),再计算 C u 0 ( v 0 ) C_{u_{0}}(v_0) Cu0(v0)。
定义有理Bezier曲面为四维多项式Bezier曲面
S w ( u , v ) = ∑ i = 0 n ∑ j = 0 m B i , n ( u ) B j , m ( v ) P i , j w ( 1.27 ) \begin{aligned}\mathbf{S}^w(u,v)=\sum\limits_{i=0}^n\sum\limits_{j=0}^mB_{i,n}(u)B_{j,m}(v)\mathbf{P}_{i,j}^w& \quad(1.27) \end{aligned} Sw(u,v)=i=0∑nj=0∑mBi,n(u)Bj,m(v)Pi,jw(1.27)的透视投影,即
S ( u , v ) = H { S w ( u , v ) } = ∑ i = 0 n ∑ j = 0 m B i , n ( u ) B j , m ( v ) w i , j P i , j ∑ i = 0 n ∑ j = 0 m B i , n ( u ) B j , m ( v ) w i , j = ∑ i = 0 n ∑ j = 0 m R i , j ( u , v ) P i , j ( 1.28 ) \begin{aligned}\textbf{S}(u,v )=H\{\mathbf{S}^{w}(\boldsymbol{u},\boldsymbol{v})\}=\frac{\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{m}B_{i,n}(\boldsymbol{u})B_{j,m}(\boldsymbol{v})w_{i,j}\mathbf{P}_{i,j}}{\sum\limits_{i=0}^{n}\sum\limits_{j=0}^{m}B_{i,n}(\boldsymbol{u})B_{j,m}(\boldsymbol{v})w_{i,j}}=\sum_{i=0}^{n}\sum_{j=0}^{m}R_{i,j}(\boldsymbol{u},\boldsymbol{v})\mathbf{P}_{i,j}\end{aligned} \quad (1.28) S(u,v)=H{Sw(u,v)}=i=0∑nj=0∑mBi,n(u)Bj,m(v)wi,ji=0∑nj=0∑mBi,n(u)Bj,m(v)wi,jPi,j=i=0∑nj=0∑mRi,j(u,v)Pi,j(1.28)
其中
R i , j ( u , v ) = B i , n ( u ) B j , m ( v ) w i , j ∑ r = 0 n ∑ s = 0 m B r , n ( u ) B s , m ( v ) w r , s R_{i,j}(u,v)=\frac{B_{i,n}(u)B_{j,m}(v)w_{i,j}}{\sum\limits_{r=0}^{n}\sum\limits_{s=0}^{m}B_{r,n}(u)B_{s,m}(v)w_{r,s}} Ri,j(u,v)=r=0∑ns=0∑mBr,n(u)Bs,m(v)wr,sBi,n(u)Bj,m(v)wi,j
注意 R i , j ( u , v ) R_{i,j}(u,v) Ri,j(u,v)是有理函数,但它们不是关于 u u u和 v v v的基函数的乘积。因此, S ( u , v ) S(u,v) S(u,v)不是张量积曲面,但 S w ( u , v ) S^w(u,v) Sw(u,v)是张量积曲面。和曲线类似,一般利用(1.27)式进行计算,通过投影得到最后的结果。
假定对所有的 i , j i,j i,j有 w i , j > 0 w_{i,j}>0 wi,j>0,则前面所列的非有理Bezier曲面(及其基函数 B i , n ( u ) B j , m ( v ) B_{i,n}(u)B_{j,m}(v) Bi,n(u)Bj,m(v))的性质可以自然地推广到有理Bezier曲面。而且,当 w i , j = 1 w_{i,j}=1 wi,j=1对所有的 i , j i,j i,j成立时,有 R i , j ( u , v ) = B i , n ( u ) B j , m ( v ) R_{i,j}(u,v)=B_{i,n}(u)B_{j,m}(v) Ri,j(u,v)=Bi,n(u)Bj,m(v),这时对应的曲面为非有理的Bezier曲面。