5

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);

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

4

2 回答 2

6

实际上,网上有很多网站可以解释结向量。这不是 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点并使用第二种形式,那么您只有0s 和1s。生成的样条曲线将与贝塞尔曲线相同。

如果没有图像或数学背景,这真的很难解释(伯恩斯坦多项式)

于 2011-06-04T15:51:35.043 回答
0
A knot vector is the curve parameter at which the continuity changes. Try to 

了解如何编写“贝塞尔”曲线。我们将创建一条度数为 num_control_points - 1 的曲线。因此对于具有 4 个控制点的贝塞尔曲线。我们会得到一条 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 递归方程中使用这些节点(它会变得有点复杂)。最后,您将了解权重的含义。这就是首字母缩略词 NURBS(非均匀有理化 B 样条)中“R”的原因。您给出的片段是用于统一 B 样条曲线。所以基本上,NURBS 只是任何可能曲线的集合体。:)

于 2014-03-20T14:44:09.280 回答