我正在使用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);
我想知道的一件事是结数据的含义。它如何影响结果?我可以在那里尝试哪些其他选项? 出于某种原因,我找不到任何正确解释这个问题的教程。
答案 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只是可能的任何曲线的集合体。 :)