Лучшие практики

Подписаться на эту рубрику по RSS

Делай так

Разбиение по непрерывности

Сегодня мы поговорим о малоизвестном инструменте ядра OpenCascade, позволяющем улучшить аналитические свойства модели. Известно, что геометрические ядра плохо работают на кривых и поверхностях класса C0. Для уверенной работы операторов моделирования требуются гладкость не хуже C2. На рисунке ниже показана часть обшивки корабля, смоделированная лоскутом поверхности с гладкостью C0. На практике, с такой геометрией плохо справляются операторы пересечения или, например, «сшивки» граней.

Грань качества C0.

Если модель класса C0 читается из формата IGES (без топологии), то «сшить» ее грани получается не всегда. Дело в том, что соответствующий оператор сшивки (BRepBuilderAPI_Sewing) не гарантирует корректной работы на геометрии класса C0. То же касается большинства других операторов моделирования.

Модель качества C0.

В случае сплайновых кривых и поверхностей дефект гладкости (еще говорят «дефект сплайна») связан с наличием кратных узлов. Кратные узлы понижают порядок дифференцируемости кривых и поверхностей. С кратными узлами можно поступить двумя способами: разбить граничный элемент по соответствующему стыку, либо убрать этот стык чисто геометрически, путем понижения кратности. На рисунке ниже показан кусок обшивки корабля, преобразованный в оболочку из трех граней гладкости C2 в результате разбиения по кратным стыкам.

Грани качества C2.

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

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

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

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

У этой кривой синтетическая гладкость выше аналитической.

Легко видеть, что чисто геометрическая непрерывность данной кривой в точке стыка обладает свойством гладкости, более сильным, чем C0. Чтобы развести понятия геометрической («синтетической») и аналитической гладкости, используют буквенные обозначения G и C соответственно. Так, стык нашей кривой имеет гладкость как минимум G1, а значит параметризацию кривой можно улучшить. В нашем случае самое простое — избавиться от излишней кратности узла.

Глава 5.4 Книги NURBS.

В библиотеке OpenCascade разбиение по гладкости осуществляет класс ShapeUpgrade_ShapeDivideContinuity. Пример его использования можно посмотреть в программе Анализ Положения (команда split-by-continuity).

Алгоритм удаления узла реализован в методах Geom_BSplineSurface::RemoveUKnot() и Geom_BSplineSurface::RemoveVKnot() для поверхности и Geom_BSplineCurve::RemoveKnot() для кривой. Эти методы принимают параметр, контролирующий допустимое искажение формы, возникающее в результате удаления узлов. Известно, что удаление узла сопровождается локальным пересчетом контрольных точек кривой или поверхности. Если расстояние между новыми и прежними контрольными точками оказывается больше допуска, то такой узел не удаляется. Алгоритм ShapeUpgrade_ShapeDivideContinuity также принимает геометрический допуск. Если удаление узлов невозможно (допуск нарушен), то происходит топологическое разбиение модели. Кривые бьются по стыкам, поверхности — по соответствующим изолиниям.

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

Изолинии для узлов с кратностью больше 1.

Если, однако, увеличить геометрический допуск и позволить алгоритму удалять узлы, то результат разбиения может оказаться приемлемым.

Результат разбиения с расширенным допуском для удаления узлов.

Качество результирующих поверхностей становится не хуже C1.

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