NURBS Curve: сохранить длину при редактировании
Я пытаюсь написать инструмент разработки для Maya, где один из критериев, которым я должен соответствовать, - это поддерживать длину кривой NURBS. Инструмент разработки предоставляет пользователю элемент управления для редактирования кривой NURBS, но он должен быть таким, чтобы длина кривой всегда поддерживалась. Когда я говорю длина, я имею в виду длину дуги кривой. Есть ли прямая связь между кривой NURBS и ее длиной дуги?
Так что в идеале именно так я и представляю свою систему для работы. Если какие-либо CV кривой будут изменены, другие CV будут изменены так, чтобы длина дуги кривой сохранялась. Любые идеи для реализации этого были бы чрезвычайно полезны.
Кроме того, как вы думаете, Maya вычисляет arcLength? Я использую узел curveInfo для вычисления arcLength кривой. Это просто суммирует отрезки полиномиальной линии, которые составляют кривую для ее длины?
2 ответа
С математической точки зрения точная длина кривой NURBS - это "уродливый монстр". Действительно, даже длина кривой Безье уже является монстром (длина общей кубики Безье является эллиптическим интегралом).
Но даже если предположить, что приблизительной длины (это гораздо более простая задача) вам достаточно, я думаю, что идея перемещения всех остальных вершин таким образом, чтобы длина оставалась неизменной для данного параметрического интервала, была достаточно сложной численно и сомнительной (наверняка решение не является уникальным, поэтому какую метрику следует использовать, чтобы выбрать "наилучшую" настройку для других вершин, чтобы решение стало уникальным?).
Разве вам не достаточно, чтобы пользователь просто переместил одну вершину или изменил один вес, а затем показал точку вдоль кривой, которая имеет определенную длину дуги? Это хорошо определено, пользователю легко предвидеть (никаких "сюрпризов" о других вершинах, которые пользователь хотел бы оставить фиксированными) и намного проще в реализации.
Эта функция встроена в майя с незапамятных времен. Просто нарисуйте кривую, затем, пока она выбрана, выберите " Правка кривых" -> "Изменить кривые" -> "Длина блокировки".