目录
1.1.1 如何画出贝塞尔曲线——de Casteljau算法
(2)起始点和结束点的切线的系数都可以计算出来,如果是四个控制点的话,切线的系数为3。
(3)仿射变换前后的几个控制点,所形成的贝塞尔曲线一致。这条性质仅限定为放射变换,投影变换并不满足这个性质
1.2 逐段贝塞尔曲线(Piecewise Bézier Curves)
1 曲线(Curves)
利用曲线可以实现相机的移动轨迹
利用曲线还可以用模型沿着轨迹移动
利用曲线定义字体
1.1 贝塞尔曲线(Bézier Curves)
贝塞尔曲线属于显式表示法。
用一系列的控制点来定义一条曲线。
比如下面这个例子,定义了曲线的起始点为P0,终点为P3,并且沿着P0到P1、P2到P3的切线方向走。
1.1.1 如何画出贝塞尔曲线——de Casteljau算法
给定3个点,生成的就叫做二次贝塞尔曲线
假设:曲线的开始点在时间0,结束点在时间1。
问题:求任意时间t的时候,这个点的位置。把画线的问题转化成了画点的问题。
解:
从b0-b1线段中找到 t 的位置 b01
从b1-b2线段中找到 t 的位置 b11
连接b01和b11
从b01-b11线段中找到 t 的位置 b02
(下标表示出发点;上标表示第几次操作,在三个点构成的原始线上的操作就是第1次,在新生成的线上的操作就是第二次,以此类推。)
如果我们研究的是输入为4个点的情况,那么,贝塞尔曲线的绘制过程是:
从b0-b1线段中找到t的位置b01
从b1-b2线段中找到t的位置b11
从b2-b3线段中找到t的位置b21
将上述这三个点连接起来
从b01- b11线段中找到t的位置b02
从b11- b21线段中找到t的位置b12
将上述这两个点连接起来
从b02- b12线段中找到t的位置b03
那么这个b03 点就是贝塞尔曲线上的点。
这里给出了一个动画演示
以上是贝塞尔曲线的直观解释。
1.1.2 贝塞尔曲线——代数公式
接下来,从代数层面解析这个绘制贝塞尔曲线的de Casteljau算法。
贝塞尔曲线绘制的思路就是:在相邻点之间进行多次的线性插值,然后重复这个过程,最终得到一个值。
每个插值得到新点,都可以表示为关于t、已知点的一个函数。
这个函数形式的结论也符合我们对整个绘制过程的理解:这条曲线必然是受b0\b1\b2这些已知点的控制的。
1.1.3 贝塞尔曲线——一般代数公式
这门课介绍贝塞尔曲线是先介绍了它的几何,然后才介绍了代数定义。与常规课程不同,为的是方便大家理解。
已知n+1个控制点,我们可以得到一个n阶的贝塞尔曲线。
这个曲线在任意时间t,都是已知点的线性组合,系数就是一个关于时间的多项式(二项分布/伯恩斯坦多项式)。
举个例子
如果是在三维空间中绘制贝塞尔曲线,那么就输入三维空间内的坐标点即可:
这里为什么任何一个横坐标上的值的和都为1?
答案:
这个式子的系数就是(1 - t + t)的平方的展开,即1本身的展开
即,任何T时刻的伯恩斯坦多项式系数的和就是1.(竖着画一条红色线)
还有,上图是一个对称图形,可以理解为组合数学中的C(n,i)=C(n,n-i)。
1.1.4 贝塞尔曲线的性质
(1)曲线一定过起点和终点
(2)起始点和结束点的切线的系数都可以计算出来,如果是四个控制点的话,切线的系数为3。
(3)仿射变换前后的几个控制点,所形成的贝塞尔曲线一致。这条性质仅限定为放射变换,投影变换并不满足这个性质
(4)贝塞尔曲线在控制点形成的凸包内。
凸包长这样:
小问题:如果控制点都是在一条直线上,那么画出来的贝塞尔曲线是什么样的?
答:是这条线自己。因为它不能超过凸包的范围。
1.2 逐段贝塞尔曲线(Piecewise Bézier Curves)
如果用10个控制点,那么得到的曲线就不太满足要求,所以人们逐段定义。
一般每4个控制点控制一条曲线,然后将每一条曲线都拼起来。
那么如何保证衔接的地方光滑?
前者切线和后者切线,方向相同、大小相同。即,衔接点处导数连续。
1.2.1 不同程度的连续性
(1)C0连续:两个点相等即可
(2)C1连续:点相等,切线一致,一阶导连续
(3)C2连续:二阶导数连续
1.3 其他样条曲线
样条曲线(splines):由控制点控制,且能满足一定的连续性。
简单来说,样条就是一个可控的曲线。
B样条曲线(B-splines):基函数样条、更容易控制,有局部性。
B样条曲线很复杂,不说了,下图给了进一步学习的链接
清华胡老师的课
其中,NURBS是B样条的延伸。
2 曲面(Surfaces)
2.1 贝塞尔曲面(Bézier Surfaces)
多块曲面拼接形成的大象、一块曲面定义的茶壶。
2.1.1 如何用贝塞尔曲线得到贝塞尔曲面?
直观理解:4*4个控制点把一个平面拉上去
在两个方向上分别利用贝塞尔曲线
这里有一个动画演示,我文字描述一下:
1.先用横向每一行的控制点生成4条贝塞尔曲线(灰色线)
2.然后在纵向上,在不同时刻t,在上述4条贝塞尔曲线上取t时刻的值,然后得到四个点,再通过这四个控制点绘制贝塞尔曲线。(蓝色线)
感觉这个过程有点像古代织布的过程,先定经纱,再缝纫纬纱。
问题:不同的贝塞尔曲面怎么平滑拼接?
课程上没有多说
2.2 网格(Mesh)
网格操作:几何处理(Mesh Operations: Geometry Processing)
·网格细分(Mesh subdivision)
·网格简化(Mesh simplification)
·网格正规化(Mesh regularization)