首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NURBS曲线绘制

NURBS曲线绘制
EN

Computer Graphics用户
提问于 2015-08-25 14:07:20
回答 1查看 681关注 0票数 7

如何绘制NURBS曲线?

与Bezier曲线相比,我只求Bernstein多项式,用控制点位置乘以它,就这样。

NURBS维基百科页面的“NURBS曲线的一般形式”段落中,我很难看到其中的多项式。也许这个“基函数”最终是一个多项式?是否有一种有效的方法来构造和评价基础函数?

EN

回答 1

Computer Graphics用户

回答已采纳

发布于 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样条:

代码语言:javascript
复制
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 ),这似乎很困难。也许其他人会对这部分有一个更直接的答案。

票数 7
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档