非均匀有理B样条学习笔记

· · 个人记录

1. 引入

如果你还没有看过回形针paperclip如何设计一个逼真的三维模型,可以在观看后再看此博客。

当我看完这个视频的时候,我整个人都是蒙的,正如这条评论

在以下的讲解中,会从函数过渡到图像的步骤开始开始

2. 从函数到多项式

正如回形针所说,计算机不具有人类一样徒手画线的能力,为了画出一条曲线,计算机需要一个函数来画出一个曲线。

从小学到高中我们学了很多函数图像,将这些图像伸缩,平移,就可以基本满足曲线的要求。

而回形针的方式,是将普通f(x)的函数转变为参数函数。如以下这个函数y=0.5x

如果你看到回形针的P(t)=(x(t),y(t)),你可以把它理解为,在这个函数上的任意一个P点,满足一个x坐标和y坐标的关系。如果将上图中函数的P点的y坐标记作t,那么P的坐标就为P(2t,t),那么就可以表示为:

\hspace{-7cm} \left\{\begin{matrix} \ \text{P(t)=(x(t),y(t))}\\ \ \hspace{-1.5cm} \text{ x(t)=2t}\\ \ \hspace{-1.5cm} \text{y(t)=t} \end{matrix}\right.

讲完了参数函数,我们过渡到回形针这个片段。

[]()

现在,便不难理解这里的P(t)函数,P(1),P(2)都包含了x,y,z轴的坐标,所以最后的P(t)也将是一个以P1为起点,P2为终点的直线。

3. 贝塞尔曲线

贝塞尔曲线,就是一种可自定义的参数函数。它可以在PS中用钢笔工具画出。

[]()

这就是贝塞尔曲线,如果我们找到ABC三个点,想绘制出以A为起点,C为终点,B为控制点的曲线,那么,我们可以在 AB 线段上任选一个点 D,根据 AD 和 AB 的比值,在 BC 线段上找到一个点 E,让 AD:AB=BE:BC 。再连接 DE ,在 DE 线段上找出点 F,让 DF:DE = AD:AB = BE:BC,如图所示:

[]()

让这个F点从A运动到C,就是我们需要的二次贝塞尔曲线。

[]()

而控制点越多,就可以画出三次,四次,多次的贝塞尔曲线。

[]()

而贝塞尔曲线是如何实现的?这些比例关系如何作用在直角坐标系上?这时候,我们就需要了解贝塞尔曲线的参数函数。

这就是贝塞尔曲线的参数函数,通过一个基函数B(t)控制了对应的每一个t,Pi对于整个图像P(t)的影响力。如果我们需要一个P(t)的坐标,就是B(t,i)与每个P点的坐标相乘的乘积的总和,如下图所示:

以回形针举的例子,三次贝塞尔曲线为例,我们可以看到B(t)对于编号1,2,3,4四个点的对应函数图像。

我们可以很明显的发现,当t=0时,P(0)在P0上,当t=1时,P(1)在P3上。而当t在0到1的范围中间的时候,P就构成了这个曲线。

当我们更改任何一个点,都可以会改变这个曲线。而且我们没法控制每个点的权重。于是,在贝塞尔曲线的基础上,出现了均匀有理B样条。

4. 均匀B样条

这是B样条曲线和贝塞尔曲线的参数函数。

可以看到除了定义域和基函数,其他的都是一样的。

这是B样条基函数的展开式。其中,大T中的t1,t2,t3……都是自己设定的数值,用于设定局部控制,k是需要的次数,n是节点个数。

以4个节点的三次B样条为例,我们需要设定t0到t7一共8个值,我们假定它们为均匀的0 1 2 3 4 5 6 7。发现当我们需要计算三次的Ni,3(t)就需要计算Ni,2(t)。

反复到最后,直至k=0,我们才能计算出Ni,0(t),然后再计算出Ni,1(t),最后算出Ni,3(t)。

这样,我们就从0次到3次,最终得到了这个基函数的图像。

注意,这里灰色的部分并于不能算出,仅仅用于简便计算。灰色的部分不会出现在对应k次的基函数中。

由于我们的例子从t0到t7,间隔都是均匀的,所以叫做均匀B样条。

5. 非均匀B样条

如果这个大T中的小t值的间距不同,就是非均匀B样条。

这样,可以控制每个控制点能够影响的范围。

6. 非均匀有理B样条

而有理,就是说可以控制每一个节点的权重,更好,更完全地控制曲线。

这就是非均匀有理B样条,英文缩写NURBS。

7. 建模实战

正像这期视频的开头,画一条曲线,画很多条曲线,让曲线连接,旋转,平移,就构成了一个曲线的三维模型。

这是我的观后作业,希望你喜欢。