MIT 6.837:Curves & Surfaces 曲线和曲面

MIT 6.837:Curves & Surfaces 曲线和曲面

在对物体建模时,常用三角形或四边形网格来描述物体的形状,但受限于性能,这些面元的数量不能过多,这将造成在相邻面元处曲面产生不连续。尽管我们有办法将表面渲染得光滑,例如使用 Phong 法线插值或 Gouraud 渲染,这些方法仍然要求模型具有一定的精度。一种对光滑曲线/曲面建模的方法是利用样条,借助少许控制点快速生成指定形状的光滑曲线/曲面。

曲线

样条

样条是一种被一些控制点定义的光滑曲线,这种控制关系可能是要求曲线经过控制点,也可能是仅影响形状而不要求经过。常用的样条包括插值、贝赛尔曲线和 B 样条。样条曲线的 $t$ 参数方程可以表示为如下的形式:

$$ \boldsymbol{Q}(t) = \mathbf{GBT}(t) = \underset{\text{Geometry}}{\mathbf{G}} \cdot \underset{\text{Spline Basis}}{\mathbf{B}} \cdot \underset{\text{Power Basis}}{\mathbf{T}(t)} $$

插值曲线

20 - MIT 6.837:Curves & Surfaces 曲线和曲面

插值曲线中最简单的情况是在两个点之间线性插值,设两点坐标 $\boldsymbol{P}_0, \boldsymbol{P}_1$,则曲线上一点的参数方程为 $\boldsymbol{Q}(t)=(1-t) \boldsymbol{P}_0 + t \boldsymbol{P}_1$。两点权重随参数 $t$ 的变化规律为一次函数,如上图中右图所示。写成统一的参数方程的形式为

$$ \boldsymbol{Q}(t) =
\begin{pmatrix} (\boldsymbol{P}_0) & (\boldsymbol{P}_1) \end{pmatrix}
\begin{pmatrix} -1 & 1 \\ 1 & 0 \end{pmatrix}
\begin{pmatrix} t \\ 1 \end{pmatrix}
$$

两个控制点的线性插值会得到一条直线,而增加控制点的数量,如果两两进行线性插值,其生成的曲线只有 $C^0$ 的连续性(即曲线本身连续,但其导数不连续),我们可以增加插值函数的次数以得到光滑的 $C^k$ 曲线。

贝塞尔曲线

三次贝塞尔曲线由四个控制点定义,它经过首尾两个控制点,并与直线 $\boldsymbol{P}_0\boldsymbol{P}_1$ 和 $\boldsymbol{P}_3\boldsymbol{P}_4$ 相切。

21 - MIT 6.837:Curves & Surfaces 曲线和曲面

三次贝塞尔曲线可以通过 de Casteljau 算法生成,它包含三次迭代,每次迭代从上次迭代生成的点的线段插值得到。如上图所示,第 0 次迭代在四个控制点连出的三条线段上插值得到三个点 $\boldsymbol{P}_0^1, \boldsymbol{P}_1^1, \boldsymbol{P}_2^1$,这些点两两连成的线段上再次插值得到两个点,再次插值即可得到曲线上的点。

22 - MIT 6.837:Curves & Surfaces 曲线和曲面

展开 de Casteljau 算法迭代式,即可得到三次贝塞尔曲线的参数方程 $\boldsymbol{Q}(t) = (1-t)^3 \boldsymbol{P}_0 + 3t(1-t)^2 \boldsymbol{P}_1 + 3t^2(1-t) \boldsymbol{P}_2 + t^3 \boldsymbol{P}_3$,其中每个点的权重都是关于参数的三次函数,写成统一的参数方程形式为

$$ \boldsymbol{Q}(t) =
\begin{pmatrix} (\boldsymbol{P}_0) & (\boldsymbol{P}_1) & (\boldsymbol{P}_2) & (\boldsymbol{P}_3) \end{pmatrix}
\begin{pmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 3 & 0 \\ -3 & 3 & 0 & 0 \\ 1 & 0 & 0 & 0 \end{pmatrix}
\begin{pmatrix} t^3 \\ t^2 \\ t \\ 1 \end{pmatrix}
$$

23 - MIT 6.837:Curves & Surfaces 曲线和曲面

如果希望用贝塞尔曲线拼接形成光滑曲线,根据曲线与首尾控制点相切的原理,只需控制两直线斜率一致即可。

高次贝塞尔曲线由多个控制点定义,其基函数 $B_i^n(t) = \dfrac{n!}{i!(n-i)!} t^i(1-t)^{n-i}, 0\le i\le n$。通常很少使用次数太高的曲线,因为控制点数量增加后,利用控制点建模的难度增加。

B 样条

24 1024x380 - MIT 6.837:Curves & Surfaces 曲线和曲面

三次 B 样条也由四个控制点定义,但曲线不经过任何控制点。与贝塞尔曲线类似,B 样条各点的权值为三次函数,但取值并不从 0 开始取。其参数方程 $\boldsymbol{Q}(t) = \dfrac{(1-t)^3}{6} \boldsymbol{P}_0 + \dfrac{3t^3-6t^2+4}{6} \boldsymbol{P}_1 + \dfrac{-3t^3+3t^2+3t+1}{6} \boldsymbol{P}_2 + \dfrac{t^3}{6} \boldsymbol{P}_3$,表示为统一形式为

$$ \boldsymbol{Q}(t) =
\begin{pmatrix} (\boldsymbol{P}_0) & (\boldsymbol{P}_1) & (\boldsymbol{P}_2) & (\boldsymbol{P}_3) \end{pmatrix}
\frac16 \begin{pmatrix} -1 & 3 & -3 & 1 \\ 3 & -6 & 0 & 4 \\ -3 & 3 & 3 & 1 \\ 1 & 0 & 0 & 0 \end{pmatrix}
\begin{pmatrix} t^3 \\ t^2 \\ t \\ 1 \end{pmatrix}
$$

26 - MIT 6.837:Curves & Surfaces 曲线和曲面

B 样条的权重函数具有可以重复的特点,容易连接成光滑曲线,且其作用区域(不为 0 的区域)在一段区间中,易于调整。

贝塞尔曲线和 B 样条之间可以互相转换,只需要根据其基函数矩阵进行变换即可。

曲面

双线性插值面片

27 1024x289 - MIT 6.837:Curves & Surfaces 曲线和曲面

对两线性插值曲线上的点再次插值得到。记线性插值符号 $\mathbf{L}(\boldsymbol{P}_1, \boldsymbol{P}_2, \alpha)=(1-\alpha)\boldsymbol{P}_1 + \alpha \boldsymbol{P}_2$,则参数方程为

$$ \boldsymbol{Q}(s,t) = \mathbf{L}(\mathbf{L}(\boldsymbol{P}_1, \boldsymbol{P}_2, t), \mathbf{L}(\boldsymbol{P}_3, \boldsymbol{P}_4, t), s) $$

双三次贝塞尔面片

28 1024x251 - MIT 6.837:Curves & Surfaces 曲线和曲面

取四条三次贝塞尔曲线上的点作为控制点,从这些控制点定义的新贝塞尔曲线上得到曲面上的点。记贝塞尔曲线符号为 $\mathbf{CB}(\boldsymbol{P}_1, \boldsymbol{P}_2, \boldsymbol{P}_3, \boldsymbol{P}_4, \alpha)$,则参数方程为

$$
\begin{aligned}
\boldsymbol{Q}(s,t) = \mathbf{CB}( & \mathbf{CB}(\boldsymbol{P}_{00}, \boldsymbol{P}_{01}, \boldsymbol{P}_{02}, \boldsymbol{P}_{03}, t), \\
& \mathbf{CB}(\boldsymbol{P}_{10}, \boldsymbol{P}_{11}, \boldsymbol{P}_{12}, \boldsymbol{P}_{13}, t), \\
& \mathbf{CB}(\boldsymbol{P}_{20}, \boldsymbol{P}_{21}, \boldsymbol{P}_{22}, \boldsymbol{P}_{23}, t), \\
& \mathbf{CB}(\boldsymbol{P}_{30}, \boldsymbol{P}_{31}, \boldsymbol{P}_{32}, \boldsymbol{P}_{33}, t), \\
& s)
\end{aligned}
$$

曲面细分

Chaikin 算法

28 - MIT 6.837:Curves & Surfaces 曲线和曲面

基于割角原理,取每一段线段的 3/4 点和下一段的 1/4 点,增加一条新线段,迭代多次得到曲线。

Doo-Sabin 算法

29 - MIT 6.837:Curves & Surfaces 曲线和曲面

在每个面上按规则取新的点,将新的点连线得到细分后的结果,多次迭代得到曲面。



发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据