5

MIT 6.837:Curves & Surfaces 曲线和曲面

 2 years ago
source link: https://ksmeow.moe/mit-6-837-curves-surfaces/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MIT 6.837:Curves & Surfaces 曲线和曲面

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

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

Q(t)=GBT(t)=GGeometry⋅BSpline Basis⋅T(t)Power Basis

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

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

Q(t)=((P0)(P1))(−1110)(t1)

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

贝塞尔曲线

三次贝塞尔曲线由四个控制点定义,它经过首尾两个控制点,并与直线 P0P1 和 P3P4 相切。

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

三次贝塞尔曲线可以通过 de Casteljau 算法生成,它包含三次迭代,每次迭代从上次迭代生成的点的线段插值得到。如上图所示,第 0 次迭代在四个控制点连出的三条线段上插值得到三个点 P01,P11,P21,这些点两两连成的线段上再次插值得到两个点,再次插值即可得到曲线上的点。

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

展开 de Casteljau 算法迭代式,即可得到三次贝塞尔曲线的参数方程 Q(t)=(1−t)3P0+3t(1−t)2P1+3t2(1−t)P2+t3P3,其中每个点的权重都是关于参数的三次函数,写成统一的参数方程形式为

Q(t)=((P0)(P1)(P2)(P3))(−13−313−630−33001000)(t3t2t1)

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

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

高次贝塞尔曲线由多个控制点定义,其基函数 Bin(t)=n!i!(n−i)!ti(1−t)n−i,0≤i≤n。通常很少使用次数太高的曲线,因为控制点数量增加后,利用控制点建模的难度增加。

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

三次 B 样条也由四个控制点定义,但曲线不经过任何控制点。与贝塞尔曲线类似,B 样条各点的权值为三次函数,但取值并不从 0 开始取。其参数方程 Q(t)=(1−t)36P0+3t3−6t2+46P1+−3t3+3t2+3t+16P2+t36P3,表示为统一形式为

Q(t)=((P0)(P1)(P2)(P3))16(−13−313−604−33311000)(t3t2t1)

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

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

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

双线性插值面片

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

对两线性插值曲线上的点再次插值得到。记线性插值符号 L(P1,P2,α)=(1−α)P1+αP2,则参数方程为

Q(s,t)=L(L(P1,P2,t),L(P3,P4,t),s)

双三次贝塞尔面片

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

取四条三次贝塞尔曲线上的点作为控制点,从这些控制点定义的新贝塞尔曲线上得到曲面上的点。记贝塞尔曲线符号为 CB(P1,P2,P3,P4,α),则参数方程为

Q(s,t)=CB(CB(P00,P01,P02,P03,t),CB(P10,P11,P12,P13,t),CB(P20,P21,P22,P23,t),CB(P30,P31,P32,P33,t),s)

Chaikin 算法

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

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

Doo-Sabin 算法

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK