B-сплайн для любого количества контрольных точек

В настоящее время я работаю над системой мягких тел с использованием числовой пружинной физики, и я наконец-то это понял. Моя проблема в том, что в настоящее время все идет по прямой линии.

Я стремлюсь воспроизвести что-то похожее на игру «Пол — это желе», и все работает, кроме гладких углов и деформации, которые в настоящее время являются прямыми и угловатыми.

Я пытался использовать уравнения Кубического Безье, но это означает, что каждые 3 узла у меня новая кривая. Существует ли уравнение для сплайнов Безье, которые принимают n контрольных точек, которые будут работать с циклом vec2 (таким образом, узел [0] является первой и последней контрольной точкой).

Извините, у меня нет никакого кода, чтобы показать это, но я полностью озадачен, и поиск в Google ничего не поднимает.

1

Решение

Просто Google «B-Spline Library» даст вам много ссылок. Сказав это, B-сплайн не единственный ваш выбор. Вы можете использовать кубический сплайн Эрмита (который определяется рядом точек и производных) (см. ссылка на сайт для деталей), а также.

С другой стороны, вы также можете продолжать использовать прямые линии в вашей системе и создать кривую, интерполирующую вершины прямых линий только для целей отображения. Чтобы создать интерполяционную кривую через ряд точек данных, сплайн Catmull-Rom является хорошим выбором для легкой реализации. Этот подход, вероятно, будет иметь лучшую производительность, чем в действительности использование кривой B-сплайна в вашей системе.

0

Другие решения

Я бы использовал B-сплайны для этой задачи, так как они могут представлять гладкие кривые с минимальным количеством контрольных точек. Кроме того, поиск приближенной гладкой поверхности для данного набора данных является простой задачей линейной алгебры.

Я написал простую библиотеку B-spline C ++ (включая кривые Безье), которую я использую для научных расчетов:
https://github.com/feevos/bsplines

он может принять произвольное количество контрольных точек / кратностей и вернуть вам основу. Однако создание кривой B-сплайна, которая соответствует вашим данным, — это то, что вам нужно сделать.

Отличная реализация B-сплайнов (но без кривых Безье) существует также в GNU GSL (
https://www.gnu.org/software/gsl/manual/html_node/Basis-Splines.html). Опять же, здесь вы должны реализовать контрольные точки, которые должны быть 2 / 3D для данной основы, и установить граничные условия, чтобы соответствовать вашим данным.

Больше информации об открытых / закрытых кривых и B-сплайнах здесь:
https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/index.html

0

По вопросам рекламы [email protected]