具体求解这曲线,我们可以采用如下方式,假设我们有一个点在时间内从移动到,那么在任意一个时间点t,它的位置应该是:
图中的与的比值,与的比值,与的比值都为t/(1-t)
二次贝塞尔曲线其实就是先用三个点按比例得到了两个新的点,然后再在新的两个点的连线上按照比例得到一个点
三次的贝塞尔曲线其实就是四个点来决定曲线,相通的方式,从四个点逐步变成1个点
再高次的贝塞尔曲线其实就是不断递归上述过程:
我们刚才只讲述贝塞尔曲线的是怎么得到的,那么如何用公式表达这个过程呢?如下是二次贝塞尔曲线的结果
这结果其实我们把等式右边的系数拿出来,是的展开式
对于高阶的贝塞尔曲线,其公式如下,其中的B表示的是二项分布的展开式,即每次得到结果的概率是t,那么n次独立重复实验出现j次结果的概率:
当我们一个曲线是非常高阶的贝塞尔曲线的时候,其实是很难控制的,如下图所示:
所以我们可以采取多个低阶贝塞尔曲线拼接的方式:
贝塞尔曲面是由4*4=16个点来控制的曲面:
如下图所示,首先水平每一行的四个点可以得到一个贝塞尔曲线,此时我们得到了四条贝塞尔曲线,然后我们再想象有一个平面竖直切下去,和四个贝塞尔曲线得到四个点,这四个点再能确定一个贝塞尔曲线,我们移动这个数值面的过程中就可以得到一个贝塞尔曲面:
这个过程其实还是个递归的过程:
所谓mesh细分,指的是,将mesh中的多边形进行拆分,以获得更加光滑的效果
从定义中我们就可以看出,这个mesh细分其实有两件事情要做,第一件事是把多边形拆分,第二部要对拆分后的多边形进行调整,不然单纯的拆分并不会得到更加光滑的效果,就比如我们把一个三角形三条边中点连起来得到四个三角形,但是这四个三角形还是在一个面上,不会有更光滑的效果出来
叫Loop只是因为发明者算法的人叫Loop
算法第一步就是把三角形的三条边的顶点连起来,我们就得到了四个三角形。
接下来我们要更新点的位置来使拆分后的面有更光滑的效果:
对于三个新的点,我们采取以下方式更新坐标
对于原本的三个点,我们更新方式如下:
Loop细分的限制很明显,只能拆分三角面,那么对于多边形我们如何拆分呢?
可以看出来,只有第一次拆分才会增加奇异点的数量,也就是只有第一次把三角形拆分成三个四边形之后,四边形怎么拆分得到的都是四边形了。
那么我们在如何使用更新新的四边形的位置呢?
其实就删掉一个边,或者说把边的两个顶点合并成一个。
、
这个方案听起来简单,但是有两个问题,删除哪个边,合并之后的点的位置在哪里才能引入最小的误差。
注意,在图形学中,很多所谓的最,只是效果上可以接受的意思
这里我们引入一个新的概念,叫做二次度量误差,即距离被删除的面L2距离和最小时候的L2距离
我们只需要计算出所有面的二次度量误差,然后依次选取最小的删除就好。
这里其实有个问题,就是每次删除后,都会影响一些点的位置,从而影响其二次度量误差,我们需要重新计算并重新排序获得最小的进行删除。这里我们就要用到优先级队列这个数据结构,每次获取队头进行删除,然后更新被影响到的二次度量误差,再从队头获取就好。