GAMES101-现代计算机图形学学习笔记(11)

GAMES101-现代计算机图形学学习笔记(11)

Lecture 11 Geometry 2

    • GAMES101-现代计算机图形学学习笔记(11)
  • 点云
  • 多边形
  • 曲线
    • 贝塞尔曲线
      • 解释
      • 数学表示
      • 性质
    • 分段贝塞尔曲线
    • 样条与贝塞尔曲面

原课程视频链接以及官网
b站视频链接: link.
课程官网链接: link.

点云

点云就是一堆点的集合,最简单的点云表示形式就是(x,y,z),x,y,z分别表示每个点在三维空间上的位置。除了坐标以外,每个点的属性还包括颜色(R,G,B)、法线等,如图所示:
GAMES101-现代计算机图形学学习笔记(11)_第1张图片
非二进制编码的点云文件可以直接用记事本查看,这里举例了一个包含位置、颜色以及法向量的点云文件(.obj文件)。其中每一行 v 包含了顶点(x,y,z)和颜色(r,g,b),vn表示每个点对应的法向量。
GAMES101-现代计算机图形学学习笔记(11)_第2张图片

多边形

相比点云,多边形多了一些点与点之间的连接关系。对于一个三角形面片组成的模型来说,也可以用 .obj 文件存储这个模型,同时它也包含了更多如:点的连接关系(f)、纹理坐标(vt)等信息:
GAMES101-现代计算机图形学学习笔记(11)_第3张图片

曲线

在计算机图形学应用中,我们经常需要在屏幕上绘制许多不同类型的对象。对象并非都是由平面组成,有些对象可能需要用曲线来进行描绘。为了使得描绘的曲线不受分辨率的影响,研究人员就提出一种曲线–贝塞尔曲线。它是一种显示曲线,由一系列控制点与线段组成,通过它可以得到精确的曲线。

贝塞尔曲线

贝塞尔曲线受限于由一系列控制点,它是通过使用控制点的近似切线生成曲线。已知四个点 p 1 p_1 p1, p 2 p_2 p2, p 3 p_3 p3, p 4 p_4 p4, 那么贝塞尔曲线就可以表示如下:
GAMES101-现代计算机图形学学习笔记(11)_第4张图片

解释

贝塞尔曲线本质就是对线段插值,它是一个类似递归求解的过程。 C a s t e l j a u Casteljau Casteljau 算法描述了如何求解贝塞尔曲线,下面是该算法对应三个控制点的贝塞尔曲线求解过程:
已知三点 b 0 b_0 b0 , b 1 b_1 b1 , b 2 b_2 b2 ,和插值参数 t t t, 第一次递归插值得到 b 0 ➡ b 1 b_0 ➡ b_1 b0b1 线段上的 b 0 1 b^{1}_{0} b01 b 1 ➡ b 2 b_1 ➡ b_2 b1b2 线段上的 b 1 1 b^{1}_{1} b11 。第二次递归插值对 b 0 1 ➡ b 1 1 b^{1}_{0}➡ b^{1}_{1} b01b11 进行插值,发现他们与插值结果 b 0 2 b^{2}_{0} b02 构成的线段位于同一条直线上,所以递归结束,得到贝塞尔曲线结果: b 0 b_0 b0 ➡ b 0 1 ➡ b^{1}_{0} b01 ➡ b 0 2 ➡ b^{2}_{0} b02 ➡ b 1 1 ➡ b^{1}_{1} b11 ➡ b 2 ➡ b_2 b2
GAMES101-现代计算机图形学学习笔记(11)_第5张图片
由上图可以总结出求解一趟贝塞尔曲线的过程:
①给定起始点和终止点(已知插值参数 t t t
②遍历每个控制点和该点的下一点(如 b 0 ➡ b 1 b_0 ➡ b_1 b0b1)形成的线段,对其进行插值。将插值后得到的点的集合中的第一个点和最后一个点替换为起点和终点。当起点和终点以及最终插值结果的点 ( b 0 2 b^{2}_{0} b02) 是在同一条直线(如 b 0 1 ➡ b 0 2 ➡ b 1 1 b^{1}_{0}➡ b^{2}_{0}➡ b^{1}_{1} b01b02b11)时,递归结束回到③,否则回①
③结束,记录最终插值结果的点
一趟贝塞尔曲线的结果只是针对于当前 t 得到的结果,它只是一个点。所以我们在 t 的范围内遍历 t ,得到所有贝塞尔曲线的结果,将这些点和起始点、终止点连接起来即得到完整的曲线。

配合下面两张图更容易理解:
①两次迭代就结束时:
GAMES101-现代计算机图形学学习笔记(11)_第6张图片
②多次迭代才结束时:
GAMES101-现代计算机图形学学习笔记(11)_第7张图片
可以看出每次迭代求解的规模是在逐步减小的,如果我们盯着起点,插值点,终点三点看的话,会发现它们是在逐步靠近于一条直线的。当最后一次迭代时,这三个点一定会汇聚于一条直线,这一次递归的点数也减少为起点和终点两个点。所以说求解规模在不断减小,且有终止条件,所以说这个过程也是遵循递归的。

数学表示

贝塞尔曲线的数学表示如下:
b n ( t ) = ∑ j = 0 n b j B j n ( t ) \mathbf{b}^{n}(t)=\sum_{j=0}^{n} \mathbf{b}_{j} B_{j}^{n}(t) bn(t)=j=0nbjBjn(t)
n是贝塞尔曲线的阶数, b j b_{j} bj 是控制点(通过控制点的切线的来计算曲线), B j n ( t ) B_{j}^{n}(t) Bjn(t) 表示 B e r n s t e i n Bernstein Bernstein 多项式,由如下公式定义:
B i n ( t ) = ( n i ) ( 1 − t ) n − i t i B_{i}^{n}(t)=\left(\begin{array}{c} n \\ i \end{array}\right)(1-t)^{n-i} t^{i} Bin(t)=(ni)(1t)niti

最简单的贝塞尔曲线是从点 P 0 P_0 P0 P 1 P_1 P1 的直线,二次贝塞尔曲线由三个控制点确定,三次贝塞尔曲线由四个控制点确定:
GAMES101-现代计算机图形学学习笔记(11)_第8张图片

性质

  1. 端点性质
    第一个控制点和最后一个控制点恰好是曲线的起始点和终止点。对于控制点来说,当t=0的时候处于起点,当t=1的时候处于终点
  2. 一阶导数性质
    第一个控制点和第二个控制点所在连线是第一个控制点所在的曲线切线;最后一个控制点和倒数第二个控制点所在连线是最后一个控制点所在的曲线切线。
    在这里插入图片描述
  3. 仿射变换性质
    当想要对曲线进行仿射变换时,只需要对不同的顶点进行仿射变换即可。
  4. 凸包性质
    贝塞尔曲线会被所有控制点形成的多边形所包围,如下图:
    GAMES101-现代计算机图形学学习笔记(11)_第9张图片

分段贝塞尔曲线

为何要引入分段贝塞尔曲线?其中一个主要原因就是当控制点增多时无法很好的控制曲线的变换:
GAMES101-现代计算机图形学学习笔记(11)_第10张图片
人们就引入了一种方法来解决这种问题:通过某几个控制点控制一段贝塞尔曲线,然后连接不同的贝塞尔曲线形成一条完整的贝塞尔曲线(通常是用四个控制点决定一个贝塞尔曲线)。这里需要注意的就是如何保持不同贝塞尔曲线连接起来也是平滑(连续)的,做法就是保持过曲线的两个控制点形成的切线大小相等,在方向上保持相反:
GAMES101-现代计算机图形学学习笔记(11)_第11张图片
贝塞尔曲线的连续性分为两种:

  1. C 0 C^0 C0 连续:即图中 a n a_n an b 0 b_0 b0 都处于红点处(处于曲线中同样的位置)
    GAMES101-现代计算机图形学学习笔记(11)_第12张图片
  2. c 1 c^1 c1 连续:在曲线某点保持切线连续(大小相等,方向相反):
    GAMES101-现代计算机图形学学习笔记(11)_第13张图片

样条与贝塞尔曲面

既然贝塞尔曲线在控制点较多时,调整一部分控制点也会影响到整条曲线。并且分段贝塞尔曲线的拼接也不是很容易进行,因为需要保持相邻曲线的连续性,所以人们又引入了样条,它更为可控。我们可以把样条看成是一条具有弹性的木条,它可以较为灵活的改变自身的形态。而 B-样条,作为贝塞尔曲线的“补充”,除了保持贝塞尔曲线自身的特性外,它另一个最大的好处就似乎可以对曲线进行局部修改。
这里有一些关于 B-样条 的原理与实现的链接,课程不做深入了解:
实现: https://github.com/thibauts/b-spline.
原理: https://zhuanlan.zhihu.com/p/50450278.

同样的,贝塞尔曲面也是由贝塞尔曲线构造得到,假设存在(n+1) × (m+1)个空间点,则m × n Bezier曲面定义为:
P ( u , v ) = ∑ i = 0 m ∑ j = 0 n P i j B i , m ( u ) B j , n ( v ) u , v ∈ [ 0 , 1 ] B i , m ( u ) = C m i u i ( 1 − u ) m − i B j , n ( v ) = C n j v j ( 1 − v ) n − j \begin{aligned} P(u, v)=\sum_{i=0}^{m} \sum_{j=0}^{n} P_{i j} B_{i, m}(u) B_{j, n}(v) & u, v \in[0,1] \\ B_{i, m}(u)=C_{m}^{i} u^{i}(1-u)^{m-i} & \\ B_{j, n}(v)=C_{n}^{j} v^{j}(1-v)^{n-j} \end{aligned} P(u,v)=i=0mj=0nPijBi,m(u)Bj,n(v)Bi,m(u)=Cmiui(1u)miBj,n(v)=Cnjvj(1v)nju,v[0,1]
简单来说,就是分别在这些控制点上构造贝塞尔曲线,其中每一条曲线又会和其他控制点构成新的曲线,最终形成贝塞尔曲面:
GAMES101-现代计算机图形学学习笔记(11)_第14张图片
有关详细推导可以查看这篇博客,这里不做详细展开: https://cronusliang.me/%E5%9B%BE%E5%BD%A2%E5%AD%A6/2019/04/16/Bezier%E6%9B%B2%E7%BA%BF%E4%B8%8E%E6%9B%B2%E9%9D%A2/.

你可能感兴趣的:(图形学)