赞
踩
最简单的表现方式:一连串的点(x,y,z).
点云是最简单的一种方法,点云是将每一个点就当作一个点,并不像三角形那样把点链接起来,而是只是单纯的用大量的点来形成面。当点十分密集时,每个点和点之间都是相邻并且十分接近,密集的点就能形成一个面。如下所示:
一般用.obj文件来存储一个模型,如果使用blender建模然后导出就可以得到一个.obj文件,文件的内容如下:
把空间中的一堆点,法线和纹理坐标在文件中分开表示,并且也在文件中表示了他们之间的关系。
如第一行f表示,将第5个,第1个和第4个顶点连接成三角形。
Maya中的曲线应用
字体中的曲线应用
使用一系列的控制点,去定义某个曲线:
然后这些控制点会去满足这个曲线的某些性质,比如说:
p0,p1,p2,p3为控制点,其中p0,p3为起点和终点。定义一个曲线的条件:
有以上两个条件,就可以定义一个控制方向。即控制点+属性就可以定义一条曲线。
但这不意味着曲线一定要经过我们的控制点,只要经过起始点和终止点就可以。
给出一系列任意多的控制点,怎么画出一条贝塞尔曲线?
比如说目前只有三个点,两条线段:
先考虑只有三个顶点两条线段的情况下如何画一条曲线:
首先这条线一定要从b0开始,到b2结束。b1决定了整条线要向哪个方向弯曲。
给定一个时间t,从0开始到1结束。在这里我们用图下方的线段表示出来。
同样的,在b1b2上:
到此我们通过三个点b0、b1、b2得到了两个点b10、b11。
把刚刚得到的两个点b10、b11连起来
b20这个点即为由b0、b1、b2三点确定的一条贝塞尔曲线在时间t=1/3上的点。
再比如说目前有四个点,三条线段:
根据上面三个点,两条线段的例子,可以推出一下过程:
找出相对于三条线段,t(t=0.5)点的位置,如下图所示:
可以得到b10,b11,b12三个点。
然后将这三个点连起来,这样又得到两条线段,然后又在这两条线段上取t点,得到两个点b20、b21:
再由上面得到的两个点连成一条线段,然后取点t,得到点b30:
连接线段。 t的取值从0到1,每取一个值都重复上述步骤,然后得到了一系列点,将所有的点连起来就得到了一条贝塞尔曲线。将其连接起来就会得到最后的贝塞尔曲线。
动画绘制,回视频观看的话在1:02:20。
最后会得到下图的关系式,算数式使用的是 线性插值 计算方法(线性插值知识博客):
将上面三个式子融合就可以得到下面这个式子:
b0、b1、b2前的系数可以看成是1的平方的展开,1的平方可以写成{(1-t)+t}²,展开后也就是上面的系数了。
总结规律后可以得到下面这个关系式:
给 n+1 个控制点(分别是0,1,2…,n),可以得到一个n阶的贝塞尔曲线,这个贝塞尔曲线在任意时间t都是给定的控制点的线性组合,而组合的系数就是一个多项式(伯恩斯坦多项式):
伯恩斯坦多项式是跟时间有关的一个多项式:
i对应从0到n(竖着的n i应该是组合数,对应排列组合中的C(n,i))
最后简化一下,不考虑有多少层了,任意阶数的贝塞尔曲线,任意时间t的点的位置就由伯恩斯坦多项式作为系数对给定的控制点的加权。
例:不用将控制点限制在平面内,在空间中仍然可以得到一个贝塞尔曲线,只要将不同的控制点输入成三维坐标,同样用伯恩斯坦多项式对其插值
因为伯恩斯坦多项式相当于对1自己的n阶展开,所以这个多项式:
贝塞尔曲线规定了必须过起点和终点,所以在t=0时在起点,t=1时在终点
特别的,对于4个控制点,起始的切线一定是3(b1-b0),结束的切线为3(b3-b2)。在这里的三倍是根据我们这个举例有4个控制点来的,如果有其他不同的控制点,这里需要变化。
求贝塞尔曲线两种不同的方式,但结果一样。
凸包性质(Convex hull property)
画出来的贝塞尔曲线一定得在所有控制点形成的凸包内。
为什么要逐段考虑?
当碰到下面这种高阶贝塞尔曲线时:
一般每四个控制点控制一条贝塞尔曲线,也就是Piecewise cubic Bézier
如下图,是由不同的贝塞尔曲线连接的,可以看发生剧烈拐弯处的点,显然不是通过原始的点求出来的贝塞尔曲线。而每一段贝塞尔曲线由四个点控制,如第一条由曲线起始点、下面蓝色线段的左端点、上面蓝色线段的左右端点
下图就分段贝塞尔曲线的例子,黑色的点和蓝色的方块都是某一条贝塞尔曲线的控制点。
分段贝塞尔的连续性有两种,分别是:
C0连续。即上一段曲线的终点是下一段曲线的起点,仅仅满足这种物理上的连续,并不管这两段相连的地方会形成多大的锐角,只要他们两段挨在一块。
C1连续。C1连续是在满足C0连续的条件外,还要满足在连接点的两端切线的方向相同,切长度相等。如下面红线所示,中间点为终点,左右两个点分别为两段曲线的控制点。
C0连续是两个函数在值上连续,C1连续是导数连续,C2连续是二阶导数连续。
定义:一个连续的曲线是由一系列的控制点控制的,并能够满足一定的连续性。简单来说就是一个可控的曲线
早期人们通过提前固定好点,然后使用树枝穿过这些点,从而得到自然弯曲的曲,如上图所示。
是basis splines的缩写,就是基函数样条。
基函数: 可以理解成用伯恩斯坦多项式在时间t对几个控制点做加权平均,也可以理解为用控制点的位置对伯恩斯坦多项式进行加权求和。那伯恩斯坦多项式就是可以理解成一个基函数,就相当于由不同的函数通过不同的方式组合起来形成别的函数,这个函数就叫基函数。
B样条: 是贝塞尔曲线的扩展,能力要更强(像之前n=10的情况下,我动一个点,整个一条曲线在任何位置都会发生变化,而这在设计上并不是一个很好的性质,当我们觉得这条曲线其他的地方都很好,就想改一个点,如果贝塞尔曲线就要动所有的点,很不方便),具有局部性(我改变一个点,我知道这个控制点至多影响到这条曲线的哪些范围内)。同样对于局部性,分段贝塞尔也可以实现。
如果想更加深入了解B样条可以看下面的内容。
将曲线扩展到曲面。
下图可以理解为一个曲面,有一种力将它拉了上去。但其实下图是通过16(4x4)个控制点得到的。
相当于双线性插值的理解,在两个方向上分别应用贝塞尔曲线
具体表示为以下过程:
首先,我们在平面上定义4x4个点:
我们认为他有4行,每一行用四个控制点得到一条曲线
每一条曲线在不同时间t上,会在不同的位置上,我们先将其相连成一条线,在所有时间t上重复这个过程,可以绘制出一个面。
然后这个线在不同时间t来不断扫空间的过程中会得到一个曲面。也可以任意的改变贝塞尔曲面控制点的位置
图表表示过程:
通过上面那个方式我们可以得到非常复杂的曲面。
要找到贝塞尔曲面上任何一个点,通过上面的过程看,是需要两个不同的时间t(在水平方向上找同一个时间t,找到4个点后,这4个点要连成一条曲线,还需要一个时间t),所以需要一个二维的控制,我们管它叫uv。
完全可以找到某一个u沿着得到的4条曲线上,找到时间u在哪,这样可以得到4个蓝色的点,再给任何一个时间v,在这4个蓝色的点形成的曲线上找时间v,就找到了最后的点的位置(也就是曲面在uv参数下的位置)
这也说明了为什么贝塞尔曲线是显式的表示的,因为是通过参数uv映射过去的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。