如何绘制NURBS曲线?
与Bezier曲线相比,我只求Bernstein多项式,用控制点位置乘以它,就这样。
在NURBS维基百科页面的“NURBS曲线的一般形式”段落中,我很难看到其中的多项式。也许这个“基函数”最终是一个多项式?是否有一种有效的方法来构造和评价基础函数?
发布于 2015-08-25 14:24:03
NURBS和Bezier曲线有两个不同之处.
1)它是理性的,这意味着它是一条曲线除以另一条曲线。(理性来源于“比率”,与其气质无关!)
理性并不是一个问题,虽然是简单的评估。甚至还有rational曲线,再一次,你只需把一个Bezier曲线除以另一个,得到最后的结果。
这允许您使用Bezier曲线来生成形状,否则您将无法这样做,例如,rational曲线可以精确地表示圆锥曲线。
下面是一个HTML5演示,您可以在其中使用rational曲线:http://demofox.org/bezquadrational.html
此外,这里还有一个着色玩具,它使用rational曲线计算sin!https://www.shadertoy.com/view/XtfSRH
2)第二个不同之处是,至少对我来说,这样的差异会使评估变得更加困难。第二个区别是NURBS,就像B样条一样,可以有任意数量的控制点,但是有一个固定的度。它的工作原理是,曲线上的任何给定点都只受特定数量的控制点的影响。
例如,可以有一个具有8个控制点的二次曲线,其中曲线上的每个点一次只由3个控制点定义。
控制点的影响开始和结束的地方称为节点向量。
基本上,如果你能求出一个有理曲线,你可以计算一个b样条,你就会知道如何计算一个NURBS。
解释如何评估一个b样条是太长的答案,我认为,有很多信息在网上,在教科书,所以我会链接到一些东西,可能会帮助你!
阅读De Boor的算法,它的b样条等价于De Casteljeau的算法:https://en.m.wikipedia.org/wiki/De_Boor%27s_算法
下面是一个在像素着色器中绘制b样条的着色玩具:https://www.shadertoy.com/view/MtfSRN
下面是关于如何计算b样条:http://web.mit.edu/hyperbook/Patrikalakis-Maekawa-Cho/node18.html的信息
另外,下面是一些代码(GLSL),它演示了如何计算一个8控制点三次B样条:
float N_i_1 (in float t, in float i)
{
// return 1 if i < t < i+1, else return 0
return step(i, t) * step(t,i+1.0);
}
float N_i_2 (in float t, in float i)
{
return
N_i_1(t, i) * (t - i) +
N_i_1(t, i + 1.0) * (i + 2.0 - t);
}
float N_i_3 (in float t, in float i)
{
return
N_i_2(t, i) * (t - i) / 2.0 +
N_i_2(t, i + 1.0) * (i + 3.0 - t) / 2.0;
}
float N_i_4 (in float t, in float i)
{
return
N_i_3(t, i) * (t - i) / 3.0 +
N_i_3(t, i + 1.0) * (i + 4.0 - t) / 3.0;
}
float SplineValue(in float t)
{
return
P0 * N_i_4(t, 0.0) +
P1 * N_i_4(t, 1.0) +
P2 * N_i_4(t, 2.0) +
P3 * N_i_4(t, 3.0) +
P4 * N_i_4(t, 4.0) +
P5 * N_i_4(t, 5.0) +
P6 * N_i_4(t, 6.0) +
P7 * N_i_4(t, 7.0);
}我想你的问题归结为:是否有一种方法可以将down算法作为一个等价方程,就像Bernstein多项式是De算法的一种方程形式一样。
我不确定,但由于有“分支”(请参阅glsl代码中的N_i_1 ),这似乎很困难。也许其他人会对这部分有一个更直接的答案。
https://computergraphics.stackexchange.com/questions/339
复制相似问题