曲线和曲面
1.曲线(Curves)
1.1⻉塞尔曲线(Bézier Curves)
定义:只经过起止点,中间过程不一定要经过其他点。
如上图所示,一条贝塞尔曲线只经过了起点
P
0
P_0
P0和终点
P
3
P_3
P3,中间经过是否经过点我们不去管它,而中间点
P
1
和
P
2
P_1和P_2
P1和P2仅仅起到了控制曲线应该往哪个方向弯曲的作用。
1.1.1画法
贝塞尔曲线的具体画法:de Casteljau算法
从画一条曲线转变为了找一个点(时间
t
t
t时的点在曲线上的位置).
Step1:
以三个点为例,三个顶点连接成两条线段,每个点间距离为1,在
b
0
b
1
b_0b_1
b0b1线段上找到任意一点
b
0
1
b_0^1
b01(假设为距起点
b
0
为
时
间
t
b_0为时间t
b0为时间t),在
b
1
b
2
b_1b_2
b1b2线段上也找到同样距离的点
b
1
1
b_1^1
b11;
Step2:
将这两点连接起来获得新的线段,该线段长度也假设为1,同样取距起点
b
0
1
b_0^1
b01为
t
t
t的点
b
0
2
b_0^2
b02;
Step3:
这样可以判定最终的贝赛尔曲线一定经过
b
0
,
b
0
2
,
b
2
b_0,b_0^2,b_2
b0,b02,b2三个点,将三个点用一条光滑的曲线连接得到的就是一条贝塞尔曲线。
相对的对于有
n
n
n个点来说,要找到就需要进行
n
−
1
n-1
n−1趟查询新点;如下图的4个点的情况:
1.1.2线性代数表示
下图的系数金字塔更为直观的表示出了找寻新点的过程:
例:已知现在有3个点,每两点之间找到它的
t
t
t处,相当于在它们两个之间作了一个位置的线性插值,每一个点都可以由它们的起始点线性表示出来:
第一次:
b
0
1
(
t
)
=
(
1
−
t
)
b
0
+
t
b
1
b_0^1(t)=(1-t) b_0 + t b_1
b01(t)=(1−t)b0+tb1
b
1
1
(
t
)
=
(
1
−
t
)
b
1
+
t
b
2
b_1^1(t)=(1-t)b_1 + t b_2
b11(t)=(1−t)b1+tb2
第二次:
b
0
2
(
t
)
=
(
1
−
t
)
b
0
1
+
t
b
1
1
b_0^2(t)=(1-t)b_0^1 + t b_1^1
b02(t)=(1−t)b01+tb11
综合后:
b
0
2
(
t
)
=
(
1
−
t
)
2
b
0
+
2
t
(
1
−
t
)
+
t
2
b
2
b_0^2(t)=(1-t)^2b_0 +2t(1-t)+ t^2 b_2
b02(t)=(1−t)2b0+2t(1−t)+t2b2
可以看出,这个式子中的多项式系数其实就是
[
(
1
−
t
)
+
t
]
2
[(1-t)+t]^2
[(1−t)+t]2的展开(同理,4个点就是立方)。
由此可得:给定了
n
+
1
n+1
n+1个控制点,可以得到一个
n
n
n阶的贝塞尔曲线,这个贝塞尔曲线在任意时间
t
t
t都是之前给定的这些控制点的线性组合,组合的系数就是一个和时间
t
t
t有关的多项式:
其中伯恩斯坦多项式为:
综上所述:任意阶数的贝塞尔曲线在时间
t
t
t时的位置是由伯恩斯坦多项式作为系数对给定的控制点的加权。
同样的,这个公式也适应于三维空间,如下图所示:
1.1.3 凸包性质(Convex hull)
曲线一定不会超出所有控制点构成的多边形范围。
凸包可以想象为一条刚好包着所有点的橡皮圈:
1.2逐段贝塞尔曲线(Piecewise Bezier Curve)
对于这种控制点很多的贝塞尔曲线,由于控制点众多,很难控制局部的贝塞尔曲线形状,解决方法:分段贝塞尔曲线。
即每4个控制点定义一条贝塞尔曲线(即每一段起点终点和空间中的两个控制点):
曲线连续的要求:
C
0
连
续
C_0连续
C0连续:第一段曲线的终点 = 第二段曲线的起点时;如下图所示:
C
1
连
续
C_1连续
C1连续:即切线连续,第一段终点的切线方向与第二段起点的切线方向共线距离相同。如下图所示:
2.曲面(Surfaces)
在理解了贝塞尔曲线之后,贝塞尔曲面的原理也是十分容易理解的了,就是一个从2维到3维的过渡。
2.1贝塞尔曲面(Bezier surfaces)
2.1.2画法
Step1:每行(列)形成一个贝塞尔曲线(
4
×
4
4\times4
4×4的点);
Step2:四个曲线上的点再形成贝塞尔曲线;
Step3:用UV代表行列;
Step4:遍历UV得到贝塞尔曲面;