2017-01-31 4 views
1

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

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

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

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

+0

[Эйген] (https://eigen.tuxfamily.org/dox/unsupported/group__Splines__Module.html) имеет шлицы библиотеки. Я использовал его один раз, и это было нормально, несмотря на то, что он официально не поддерживался. Но я не думаю, что он поддерживает закрытые кривые. – Potatoswatter

+0

может стоить давать http://pomax.github.io/bezierinfo/#bsplines чтение, потому что внедрение b-сплайнов на самом деле не является полностью *, что * много работает. Также https://github.com/thibauts/b-spline/blob/master/index.js - это хорошо читаемая реализация JS, которая (почти) тривиально принята на множестве других языков, включая C++ –

ответ

0

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

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

+0

сплайн Catmull-Rom был идеальным и быстрым! Работал с замкнутыми кривыми, почти не меняя уравнения! –

0

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

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

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

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

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

Смежные вопросы