双三次 Bezier 曲面的定义
Bezier 曲面是由 Bezier 曲线扩展得到,它是两组正交的 Bezier 曲线控制点构造空间网格生成的曲面
p ( u , v ) = ∑ i = 0 3 ∑ j = 0 3 P i , j B i , 3 ( u ) B j , 3 ( v ) , ( u , v ) ∈ [ 0 , 1 ] × [ 0 , 1 ] \begin{equation} \bm{p}(u, v) = \sum_{i=0}^{3}\sum_{j=0}^{3} P_{i,j}B_{i, 3}(u)B_{j,3}(v), (u, v) \in [0, 1] \times [0, 1] \end{equation} p(u,v)=i=0∑3j=0∑3Pi,jBi,3(u)Bj,3(v),(u,v)∈[0,1]×[0,1]
其中, P i j P_{ij} Pij 是 16 个控制点, B i , 3 ( u ) B_{i, 3}(u) Bi,3(u) 和 B j , 3 ( v ) B_{j, 3}(v) Bj,3(v) 是 Bernstein 基函数。
对 (1) 式展开,有
p ( u , v ) = [ B 0 , 3 ( u ) B 1 , 3 ( u ) B 2 , 3 ( u ) B 3 , 3 ( u ) ] [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] [ B 0 , 3 ( v ) B 1 , 3 ( v ) B 2 , 3 ( v ) B 3 , 3 ( v ) ] \begin{equation} \bm{p}(u, v) = \begin{bmatrix} B_{0, 3}(u) & B_{1, 3}(u) & B_{2, 3}(u) & B_{3, 3}(u) \end{bmatrix} \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} \begin{bmatrix} B_{0, 3}(v) \\ B_{1, 3}(v) \\ B_{2, 3}(v) \\ B_{3, 3}(v) \end{bmatrix} \end{equation} p(u,v)=[B0,3(u)B1,3(u)B2,3(u)B3,3(u)] P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3 B0,3(v)B1,3(v)B2,3(v)B3,3(v)
B 0 , 3 ( u ) , B 1 , 3 ( u ) , B 2 , 3 ( u ) , B 3 , 3 ( u ) , B 0 , 3 ( v ) , B 1 , 3 ( v ) , B 2 , 3 ( v ) , B 3 , 3 ( v ) B_{0, 3}(u),B_{1, 3}(u),B_{2, 3}(u),B_{3, 3}(u), B_{0, 3}(v), B_{1, 3}(v), B_{2, 3}(v), B_{3, 3}(v) B0,3(u),B1,3(u),B2,3(u),B3,3(u),B0,3(v),B1,3(v),B2,3(v),B3,3(v)是三次 Bernstein 基函数,
{ B 0 , 3 ( u ) = − u 3 + 3 u 2 − 3 u + 1 B 1 , 3 ( u ) = 3 u 2 − 6 u 2 + 3 u B 2 , 3 ( u ) = − 3 u 3 + 3 u 2 B 3 , 3 ( u ) = u 3 \begin{equation} \begin{cases} B_{0, 3}(u) = -u^3 + 3u^2 -3u +1 \\ B_{1, 3}(u) = 3u^2 -6u^2+3u \\ B_{2, 3}(u) = -3u^3 + 3u^2 \\ B_{3, 3}(u) = u^3 \end{cases} \end{equation} ⎩ ⎨ ⎧B0,3(u)=−u3+3u2−3u+1B1,3(u)=3u2−6u2+3uB2,3(u)=−3u3+3u2B3,3(u)=u3
{ B 0 , 3 ( v ) = − v 3 + 3 v 2 − 3 v + 1 B 1 , 3 ( v ) = 3 v 2 − 6 v 2 + 3 v B 2 , 3 ( v ) = − 3 v 3 + 3 v 2 B 3 , 3 ( v ) = v 3 \begin{equation} \begin{cases} B_{0, 3}(v) = -v^3 + 3v^2 -3v +1 \\ B_{1, 3}(v) = 3v^2 -6v^2+3v \\ B_{2, 3}(v) = -3v^3 + 3v^2 \\ B_{3, 3}(v) = v^3 \end{cases} \end{equation} ⎩ ⎨ ⎧B0,3(v)=−v3+3v2−3v+1B1,3(v)=3v2−6v2+3vB2,3(v)=−3v3+3v2B3,3(v)=v3
p ( u , v ) = [ u 3 u 2 u 1 ] [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] [ v 3 v 2 v 1 ] \begin{equation} p(u, v) = \begin{bmatrix} u^3 & u^2 & u & 1 \end{bmatrix} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} \begin{bmatrix} v^3 \\ v^2 \\ v \\ 1 \end{bmatrix} \end{equation} p(u,v)=[u3u2u1] −13−313−630−33001000 P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3 −13−313−630−33001000 v3v2v1
令
U = [ u 3 u 2 u 1 ] , V = [ v 3 v 2 v 1 ] \bm{U} = \begin{bmatrix} u^3 & u^2 & u & 1 \end{bmatrix} , \bm{V} = \begin{bmatrix} v^3 & v^2 & v & 1 \end{bmatrix} U=[u3u2u1],V=[v3v2v1]
M = [ − 1 3 − 3 1 3 − 6 3 0 − 3 3 0 0 1 0 0 0 ] , P = [ P 0 , 0 P 0 , 1 P 0 , 2 P 0 , 3 P 1 , 0 P 1 , 1 P 1 , 2 P 1 , 3 P 2 , 0 P 2 , 1 P 2 , 2 P 2 , 3 P 3 , 0 P 3 , 1 P 3 , 2 P 3 , 3 ] \bm{M} = \begin{bmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} , \bm{P} = \begin{bmatrix} P_{0, 0} & P_{0, 1} & P_{0, 2} & P_{0, 3} \\ P_{1, 0} & P_{1, 1} & P_{1, 2} & P_{1, 3} \\ P_{2, 0} & P_{2, 1} & P_{2, 2} & P_{2, 3} \\ P_{3, 0} & P_{3, 1} & P_{3, 2} & P_{3, 3} \\ \end{bmatrix} M= −13−313−630−33001000 ,P= P0,0P1,0P2,0P3,0P0,1P1,1P2,1P3,1P0,2P1,2P2,2P3,2P0,3P1,3P2,3P3,3
p ( u , v ) = U M P M T V T \begin{equation} \bm{p}(u, v) = \bm{U}\bm{M}\bm{P}\bm{M}^{T}\bm{V}^{T} \end{equation} p(u,v)=UMPMTVT
M \bm{M} M 是对称矩阵,即 M T = M M^T = M MT=M.
生成曲面时,可以先固定 u 变化 v 得到一簇 Bezier 曲线,然后固定 v,变化 u 得到另一簇 Bezier 曲线,两卒曲线交织生成双三次 Bezier 曲面。
这里的程序算法的示意说明
// 读取控制点void ReadControlPoint(Point3 P[4][4]) {double M[4][4];M[0][0] = -1;M[0][1] = 3;M[0][2] = -3;M[0][3] = 1;M[1][0] = 3;M[1][1] = -6;M[1][2] = 3;M[1][3] = 0;M[2][0] = -3;M[2][1] = 3;M[2][2] = 0;M[2][3] = 0;M[3][0] = 1;M[3][1] = 0;M[3][2] = 0;M[3][3] = 0;Point3 mControlPoint[4][4];for (int i=0; i<4; i++) {for (int j=0; j<4; j++) {mControlPoint[i][j] = P[i][j] }}// 数字矩阵左乘 三维点矩阵 M * mControlPoint// 计算转置矩阵 M^T// 数字矩阵右乘 三维点矩阵 mControlPoint * Mdouble setp = 0.1;double u3, u2, u1, u0, v3, v2, v1, v0;// 定义 Point Pt;for (double u=0; u<=1; u+=step) {for (double v=0; v<=1; v+=step) {u3 = u*u*u; v3 = v*v*v;u2 = u*u; v2 = v*v;u1 = u; v1 = v;u0 = 1; v0 = 1;Pt = ....// 根据公式计算出 pt// 斜二投影//if (v == 0) 特殊处理// 绘制点}}for (double v=0; v<=1; v+=step) {for (double u=0; u<=1; u+=step) {u3 = u*u*u; v3 = v*v*v;u2 = u*u; v2 = v*v;u1 = u; v1 = v;u0 = 1; v0 = 1;Pt = ....// 根据公式计算出 pt// 斜二投影//if (u == 0) 特殊处理// 绘制点}}}
// 计算斜二投影Point2 ObliqueProjection(Point3 P3) {Ponit2 P2;P2.x = P3.x - P3.z * sqrt(2.0) / 2.0;P2.y = P3.y - P3.z * sqrt(2.0) / 2.0;return P2;
}
参考 《计算几何算法与实现》孔令德