上一节提到,要表现一些复杂的几何模型有两种方法:
本节课讲的为显式几何
显式几何有两种方式:
下面介绍几种方法:
点云是最简单的一种方法,点云是将每一个点就当作一个点,并不像三角形那样把点链接起来,而是只是单纯的用点来形成面。当点十分密集时,每个点和点之间都是相邻并且十分接近,密集的点就能形成一个面。如下所示:
上面部分的点十分密集,形成了一个铜像,而下面的点比较稀疏,则无法构成一个面,只能看见一些离散的点。
这种方法有以下特点:
多边形面是目前应用最广泛的一种方式。具有以下特点:
一般用.obj文件来存储一个模型,如果使用blender建模然后导出就可以得到一个.obj文件,文件的内容如下:
v代表几何体的每个顶点的位置信息,vt代表纹理坐标,vn代表顶点对应的法向量,f代表将三角形连接成顶点的索引顺序。
如第一行f表示,将第5个,第1个和第4个顶点连接成三角形。f代表的是:顶点号/纹理号/法向量号。
p0,p1,p2,p3为控制点,其中p0,p3为起点和终点。定义一个曲线的条件:
有以上两个条件,就可以定义一个控制方向。即控制点+属性就可以定义一条曲线。
注:曲线并不一定经过控制点,但一定经过起点和终点。
b0,b2为起点和终点,b0,b1,b2为控制点。
贝塞尔画曲线的方法就是:假设有一个时间t属于[0,1],只要找出所有 在任意时间t上所对应的曲线的点,就可以画出这条曲线。
也就是说,给一个时间t属于[0,1],找出曲线上这个点在哪。如下图所示:
注:上图bo到中间点b(01)为(1-t),而b(01)到b1为t,图画反了。
要在两条线段上都找到这样一个中点:
然后在两个中点的连线上再找到一个时间t对应的中点。
得到的b(02)就是曲线上的点。只要我们枚举所有的时间t所对应的点,就能够画出这条曲线。
如果有四个点三条线段时:
如上所示,现在三条线段上各找一个中点,然后将三个中点连接成两条线段,然后再在两条线段上找两个中点,然后再连接成一个线段,再找到这一个线段上的中点即可。简化一下:
四个点,三条线 - > 三个点,两条线 - > 两个点,一条线 -> 一个点,这个点就是曲线上的点。
先把b(01)和b(11)用控制点表示出来,然后再对b(02)用上面获得的两个中点表示。将b(01)和b(11)带入b(02),就能够得到最下面的那个式子。可以看到,b(02)是所有控制点的一个线性组合所表示的,是否可以认为,曲线上的点都是所有控制点的一个线性组合?
实际上是这样,所有曲线上的点都是所有控制点的一个线性组合,公式如下:
上图表示当有n+1个控制点时,曲线上t所对应的点可以由所有的控制点的线性组合表示,其中:
可以看出,其实
为[t + (1-t)]^n的二项展开的一个通项。
第一个和最后一个控制点为起始点,一定要经过,其他控制点不一定经过
- 最开始的两个点和最后的两个点决定起点和终点的切线方向,比如有4个点b0,b1,b2,b3,切线如下
其中3并不是固定的,当控制点的数量改变时,3可能变为其他的系数
先用控制点画的贝塞尔曲线,和经过仿射变换(affine transformation)的控制点画出来的曲线是一样的。注:旋转变换+缩放变换 = 线性变换, 线性变换 + 平移变换 = 仿射变换。
凸包性质(Convex hull property):给出一系列的控制点画曲线,画出来的曲线一定在一个能够包围所有控制点的范围内。如下图所示:
其中蓝色的框就是凸包,这些控制点画出来的曲线一定在这个蓝色框内。更通俗的理解就是说:比如在一个木板上,钉了许多钉子,这些黑点就是一个一个钉子,然后用一个环形的橡皮筋来包围住这些所有的钉子,这个橡皮筋一定会被最外围的一圈钉子支撑形成一个环,这个环就是凸包。
先看下面一个例子:
上图中,用十个控制点来画贝塞尔曲线,可以看到划出了一条曲线。但是这存在了一些问题,在一些偏移较大的控制点的位置,其画出来的曲线偏移十分的小,比如在靠近上面的一段曲线甚至接近一条直线,但是可以看到控制点歪曲的方向非常大,这就是为题所在。
当控制点十分多的时候再用贝塞尔曲线,得到的曲线就难以达到我们想要的标准,于是我们想:为什么要用许多的控制点定义一个贝塞尔曲线,而不是用几个控制点定义一段贝塞尔曲线,最终把这些曲线连接起来?于是,分段贝塞尔曲线就诞生了。
分段贝塞尔曲线通常用四个控制点定义一段曲线,然后将这些曲线最终连起来。如下:
以最左面的一段曲线举例,四个控制点定义了这一段曲线:
图中四个蓝色的点为控制点,然后后面的依次类推,每次用四个控制点画一段贝塞尔曲线,最后连起来就能够得到一条我们希望的曲线。
分段贝塞尔的连续性有两种,分别是:
定义:一个连续的曲线由一系列的控制点控制,并且在曲线上的任意一点都满足连续性。
解决问题:在之前10个控制点的例子中,对于这种控制点很多的曲线,当我们想修改其中的一小部分的时候,如果用贝塞尔曲线,当我们想修改一个控制点,就会导致整个曲线发生改变,这个是我们不希望看到的。我们希望改变一个控制点只会改变局部的曲线,希望曲线能够具有这种局部性。样条就是解决这个问题。分段贝塞尔也可以解决这个问题,但是样条能够控制更加方便,不需要分段。