Значение узлов при рисовании кривой NURBS? - PullRequest
4 голосов
/ 04 июня 2011

Я использую 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 ]

5 голосов
/ 04 июня 2011

На самом деле в Интернете есть достаточно сайтов, которые объясняют вектор узлов.Это не специфическая вещь GL, а неотъемлемое свойство NURBS.Таким образом, введя «вектор узла NURBS» в Google, вы получите подробные объяснения.

Я просто хочу сказать, что обычно вектор узла имеет длину 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 с.Результирующий сплайн будет идентичен кривой Безье.

Это действительно трудно объяснить без изображений или математического фона (полиномы Бернштейна)

0 голосов
/ 20 марта 2014
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 будет показано, как они используются в рекурсивном уравнении Кокса-де-Бура (которое получает немного сложный комплекс). Наконец, вы увидите, что означает вес. Это причина для "R" в аббревиатуре NURBS (Неравномерный рационализированные сплайны B). Фрагмент, который вы дали, был для сплайновой кривой Uniform B. В общем, NURBS - это просто конгломерат любой возможной кривой. :)

...