这里回顾GAMES101 Lecture 11,这一讲介绍了曲线与曲面。

课程主页:

课程作业:

课程视频:

本讲内容

这一讲介绍的内容:

  • 显式表示
  • 曲线
    • 贝塞尔曲线
    • De Casteljau算法
    • B样条等
  • 曲面
    • 贝塞尔曲面
    • 三角形和四边形
    • 细分、简化、正则化

计算机图形学中的显式表示

点云

  • 点云是最简单的表示方法:点列表$(x,y,z)$;
  • 轻松表示任何类型的几何图形;
  • 适用于大型数据集(>>1 点/像素);
  • 经常转换成多边形网格;
  • 难以在采样不足的区域中绘制;

多边形网格

  • 存储顶点和多边形(通常是三角形或四边形);
  • 更容易进行处理/模拟,自适应采样;
  • 更复杂的数据结构;
  • 也许是图形学中最常见的表示;

曲线

曲线主要讨论的是如何找到一条光滑曲线经过多个点,我们首先来回顾贝塞尔曲线。

贝塞尔曲线

经过四个点的贝塞尔曲线如下:

在$\mathbf p_0$处的切线为$3(\mathbf p_1 -\mathbf p_0)$,在$\mathbf p_3$处的切线为$3(\mathbf p_3-\mathbf p_2)$,具体如何构造见后续讨论,这里先假设贝塞尔曲线可以描述为$\mathbf x(t), t\in [0, 1]$。

de Casteljau算法

de Casteljau算法是一个递归算法,以4个点为例,首先对$(\mathbf b_0, \mathbf b_1)$按比例$t$进行插值,然后同样对$(\mathbf b_1,\mathbf b_2),(\mathbf b_2, \mathbf b_3)$按比例$t$进行插值,这样会得到三个点,然后继续应用该算法即可,可视化的结果如下:

熟悉二项式定理话不难推出对于$n$个点的计算公式为:

其中:

  • $\mathbf b^n(t)$为$n$阶贝塞尔曲线;

  • $\mathbf b_j$为贝塞尔控制点;

  • $ B_j^n(t)$为Bernstein 多项式,计算公式为:

贝塞尔曲线的性质

这里总结贝塞尔曲线的性质:

  • 是对端点的插值

    • 对于三次贝塞尔曲线:$\mathbf{b}(0)=\mathbf{b}_0 ,\mathbf{b}(1)=\mathbf{b}_3$;
  • 与结束段相切

    • 三次情形:$\mathbf{b}^{\prime}(0)=3\left(\mathbf{b}_1-\mathbf{b}_0\right), \mathbf{b}^{\prime}(1)=3\left(\mathbf{b}_3-\mathbf{b}_2\right)$;
  • 仿射变换性质

    • 对曲线的仿射变换等价于对控制点的仿射变换;
  • 凸包属性

    • 曲线在控制点的凸包内;

    • 凸包示意图:

分段贝塞尔曲线

如果控制点太多,那么曲线很难控制:

相反,更好的方式是连接许多低阶贝塞尔曲线,分段三次贝塞尔曲线是最常用的技术:

这里比较重要的问题是如何保证连起来的曲线的连续性,假设有两个贝塞尔曲线:

那么$C^0$连续是指:$\mathbf a_n =\mathbf b_0$(端点相同):

$C^1$连续是指:$\mathbf{a}_n=\mathbf{b}_0=\frac{1}{2}\left(\mathbf{a}_{n-1}+\mathbf{b}_1\right)$(端点切线相同):

其他曲线

样条

  • 通过一组给定的点并且$C^i$连续的曲线;
  • 简而言之,一条受控制的曲线;

B-样条

  • Basic-样条的缩写;
  • 需要比贝塞尔曲线更多的信息;
  • 满足贝塞尔曲线的所有重要属性(即超集);
    • 比贝塞尔曲线更容易控制;

其他

曲面

贝塞尔曲面

将贝塞尔曲线推广到曲面:

具体为:

  • 对于双三次Bezier曲面patch,
    • 输入:4x4个控制点;
    • 输出是由$[0,1]^2$中的$(u,v)$参数化的2D表面;

算法

  • 目标:计算$(u,v)$对应的表面位置;
  • 对$(u,v)$维度分别应用de Casteljau算法;
    • 对每个$u$,计算4条贝塞尔曲线上的点,此时有4个点;
    • 对每个$v$,根据之前的4个点计算输出;

后续内容

网格操作:几何处理

  • 网格细分;
  • 网格简化;
  • 网格正则化;