Интерактивный скиннинг лопатки

В дополнение к автоматическому методу реконструкции лопатки, рассмотрим интерактивный подход. Принцип остается прежним: геометрия пера моделируется скиннингом профильных кривых, каждая из которых представлена сплайном. Попробуем реализовать простой сценарий реконструкции и посмотрим, какие трудности могут возникнуть. Для начала импортируем полигональную модель лопатки из файла формата STL.

Модель лопатки, загруженная из файла формата STL.

Добавляем в сцену интерактивную секущую плоскость. Позиционируем ее так, чтобы получить нужный нам срез. Для сечения сетки плоскостью используется алгоритм vtkCutter библиотеки VTK. Он выдает точки пересечения, принадлежащие ребрам триангуляции, поэтому для грубых сеток плотность результирующего облака будет небольшой.

Сечение триангуляции интерактивно задаваемой плоскостью.

Для последующей аппроксимации точек сплайном необходимо их упорядочить. Для этого мы используем алгоритм построения невыпуклой оболочки по K ближайшим соседям [Moreira, A. and Santos, M.Y. 2007. Concave hull : a k-nearest neighbours approach for the computation of the region occupied by a set of points. Proceedings of the Second International Conference on Computer Graphics Theory and Applications, 61-68.]. Алгоритм простой как пробка и не очень интеллектуальный, но для нашей работы годится вполне.

Стопка сечений в радиальном направлении лопатки. Точки каждого сечения отсортированы алгоритмом построения огибающей по K ближайшим соседям.

Аппроксимация с заданной точностью выполняется средствами библиотеки OpenCascade, в результате чего мы имеем стопку кривых для дальнейшего скиннинга.

B-кривая, аппроксимирующая сечение лопатки.

Попробуем построить поверхность, не забывая о том, что профильные кривые должны быть унифицированы (т.е. иметь одинаковую степень и быть определенными на едином узловом векторе).

Поверхность лопатки, протянутая через 31 сечение.

Уже на этом шаге возникает трудность. Сечения лопатки, как правило, являются довольно сложными кривыми, и их унификация с последующим скиннингом оказывается затратным процессом. Более того, и это самое главное, в результате будет получена поверхность совершенно дикой сложности, практически непригодная для дальнейшей работы.

Более 43k контрольных точек в результирующей поверхности. Нежно-голубыми изолиниями изображены узловые значения (видны характерные сгущения после унификации сечений).

Простой метод борьбы со взрывным ростом сложности состоит в том, чтобы избежать процесса унификации кривых, построив их сразу в унифицированном виде. Для этого мы введем новую дискретизацию с заданным количеством точек на кривой. Эти точки интерполируем на едином узловом векторе, используя центростремительную параметризацию. В результате получаем сечения той же формы, но с хорошими аналитическими свойствами. Попробуем протянуть поверхность через адаптированные кривые. Поверхность конструируется значительно быстрее, и ее аналитические свойства выглядят куда лучше.

Совместная интерполяция сечений позволила избежать унификации и дала поверхность существенно меньшей сложности.

Однако невооруженным глазом видны аномалии формы: лопатка оказывается перекрученной в зонах, где спинка переходит в корытце.

Аномалии формы: лопатка перекручена.

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

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

Способ борьбы с такой аномалией уже менее очевиден. По существу, нам нужно добиться того, чтобы кривые в зонах спинки и корытца пробегали одни и те же интервалы по параметру. Для этого мы усложним процесс реконструкции и вернемся к этапу, когда точечная огибающая сечения уже построена, а кривая — еще нет. Заставим пользователя сегментировать каждое сечение вручную, то есть указать зоны перехода от спинки к корытцу. Теоретически этот процесс можно автоматизировать путем анализа кривизны профиля, но сейчас мы это опустим. Итак, пользователь размечает каждое сечение, и система аппроксимирует сегменты один за другим.

Сегментация среза для аппроксимации цепочкой кривых. Для иллюстрации взят синтетический набор точек.

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

Локальная геометрическая неточность стыков.

Попробуем обойтись одной стопкой кривых, для чего объединим построенные сегменты в сплайн с гладкостью C0 на стыках. Эти композитные кривые имеют, в отличие от первого эксперимента, синхронные параметризации, поскольку они содержат в своей структуре сегменты, определенные пользователем.

Объединение кривых.

В результате скиннинга имеем единственный лоскут с дефектом сплайна на стыках. Разрежем лоскут топологически командой split-by-continuity и оценим геометрический допуск командой check-toler. Точность моделирования становится значительно лучше.

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

Скиннинг с различными коэффициентами сглаживания.

Замкнутые кривые для скиннинга можно скачать, кликнув по ссылке. Видео-демонстрация размещена на нашем канале.