绘制NURBS曲线时结的含义?

时间:2011-06-04 14:28:50

标签: opengl graphics 3d glu nurbs

我正在使用gluNurbsCurve绘制一些带有控制点的曲线。我已经得到了红皮书中描述的基本设置正常工作,我正在努力扩展它 此示例如下所示:

float knots[8] = {0,0,0,0,1,1,1,1};
float pnts[4][3] = { {...},{...},{...},{...} };
GLUnurbsObj *m = gluNewNurbsRenderer();
gluBeginCurve(n);
gluNurbsCurve(n, 8, knots, 3, pnts, 4, GL_MAP1_VERTEX_3)
gluEndCurve(n);

我想知道的一件事是结数据的含义。它如何影响结果?我可以在那里尝试哪些其他选项? 出于某种原因,我找不到任何正确解释这个问题的教程。

2 个答案:

答案 0 :(得分:5)

实际上,网上有足够的网站可以解释结矢量。它不是GL特定的东西,而是NURBS的固有属性。因此,在谷歌输入“NURBS结矢量”将为您提供详细的解释。

我只想说结点向量的长度通常为knot-vector-length = number-of-points + degree-of-curve + 1,唯一重要的是比率,而不是绝对值。因此{0,1,2,3}{0,2,4,6}

相同

在我看来,最重要的结点是:

1) {0,1,2,3,4,5,6,...}

如果重复最后(或第一个)degree-of-curve-1点,

将允许您轻松扩展曲线连续性曲线,但这意味着曲线实际上并未贯穿其起点和终点,因此您必须重复最后(或第一个)degree-of-curve-1点才能创建连续的闭合曲线。

另一个重要形式是

2) {0,0,0,1,2,3,...,n,n,n}

而开头的0和结尾的n重复degree-of-curve + 1次。这也是您使用的表单。这将为您提供NURBS曲线,该曲线从第一个点开始,到您指定的最后一个点结束。但它只能提供位置连续性。因此,如果你用这个制作一个闭合曲线,那么你很可能会出现切线不连续性。

顺便说一下。如果您只有degree-of-curve + 1分并使用第二个表单,那么您只有0个和1个。生成的样条曲线与Bézier曲线相同。

如果没有图像或数学背景(Bernstein多项式)

,这很难解释

答案 1 :(得分:0)

A knot vector is the curve parameter at which the continuity changes. Try to 

了解" Bezier"曲线写的。我们可以创建一个度数为num_control_points的曲线 - 1.对于具有4个控制点的Bezier曲线。我们得到一个3阶曲线(阶数= 4)。所以在这条曲线的任何地方连续性将是C2,意味着存在曲率连续性。该曲线的结矢量将是(0,0,0,0,1,1,1,1)。这来自您上面给出的代码段。您已经提供了结矢量和曲线的控制点。

因此,可以在参数0处判断出。有C0连续性。参数1也是如此。 参数的结点值越多。这意味着该参数的连续性是 减少。希望你明白我所说的。由于曲线的程度是3 连续性从(C3→C2→C1→C0)下降。那是(0 - > 0 - > 0 - > 0)的立场 对于。

我仍在研究(研究:P)如何在一个统一的结矢量情况下,曲线从中途开始。至于现在,假设结矢量是(0,1,2,3..7)的情况。这告诉参数0-1之间。有一条曲线。 1到2之间,还有另一个。所以基本上我们将整个曲线分成7个部分(当然,程度取决于你)。如果我将其作为度数为3的曲线。这意味着我有7条不同的曲线,每条曲线都有3度。

希望你按照我的说法去做。如第1步所述,尝试理解结向量的含义,第2步将是如何在Cox De-Boor递归方程中使用它们(它有点复杂)。最后,你会看到权重意味着什么。这就是" R"在首字母缩略词NURBS(非统一合理化B样条)中。您给出的片段是针对均匀B样条曲线。所以基本上,NURBS只是可能的任何曲线的集合体。 :)