

Приближается релиз новой версии отечественного геометрического ядра RGK от «Топ Системы». Компания делится результатами работы команды разработчиков за прошедший с момента предыдущей публикации период времени. Работа была проделана большая и разноплановая. Улучшения касались как функциональности API ядра, так и внутренних базовых алгоритмов. В статье хочется остановиться не только на новой функциональности ядра, но и на важных внутренних улучшениях и алгоритмах, которым в значительной степени была посвящена разработка за последний год.
«Неприятные» задачи в геометрическом моделировании
Прежде чем обсуждать достижения в некоторых аспектах функциональности ядра, нужно поговорить о том, какие задачи являются традиционно трудными и «неприятными» для геометрических ядер. Обычно не принято говорить о таких аспектах в обзорных публикациях, но нам кажется, что для читателей будет полезно полнее понимать внутреннюю «кухню» разработки промышленных геометрических ядер, сложности и вызовы, которые возникают в этом процессе.
Как известно из прошлых публикаций, важной особенностью ядра RGK является поддержка точностей топологических элементов и управление этими точностями. В том или ином виде такого рода информация присутствует во всех промышленных ядрах, хотя и в разных формах. Тут важно понимать, что механизм точностей должен являться базовым архитектурным элементом всего ядра, и все алгоритмы ядра должны поддерживать адекватную работу с этой важной информацией. В этом смысле невозможно внедрить этот механизм в код, который изначально не проектировался с учётом проблем, возникающих в связи со «сквозным» управлением точностью вычислений. На первый взгляд, наличие точностей у рёбер и вершин кажется очень простой идеей — любой инженер прекрасно понимает, что размеры в жизни не бывают точными. Но в геометрическом моделировании механизм точностей — это несколько более глубокая вещь. Именно правильная архитектура алгоритмов с учётом точностей является основой для обеспечения надёжности геометрического ядра на реальных промышленных данных.
Основываясь на многолетнем опыте использования промышленных геометрических ядер и опыте собственных разработок, мы утверждаем, что невозможно обеспечить стабильную работу алгоритмов геометрического ядра без тонкой настройки алгоритмов по управлению точностью. Такие рассуждения могут показаться несколько абстрактными, но они объясняют, почему разработчики RGK так много сил и времени уделяют совершенствованию именно этого аспекта ядра, хотя формально такая работа и не расширяет API. Излишне говорить, что архитектурная поддержка тех или иных аспектов моделирования представляет собой не более чем необходимое условие успеха алгоритмов в обработке сложных и неприятных конфигураций при моделировании. Поэтому процесс совершенствования и выстраивания логики работы ядра в нетривиальных случаях идёт постоянно и будет продолжаться в будущих версиях.
Итак, какие задачи традиционно считаются «неприятными» в геометрическом моделировании? Это, в первую очередь, задачи, возникающие при построении пересечений касательных и «почти» касательных поверхностей и кривых. Они возникают в разных алгоритмах ядра — не только чисто геометрических, но и топологических. Бывают ситуации, когда пересечение в некоторой области с заданной точностью становится двумерным множеством. То есть любая кривая в такой области удовлетворяет заданному условию. Но все дело в том, что с точки зрения конечного результата требуется выбрать только одно решение. То есть доопределить решение плохо обусловленной задачи в математическом смысле. Как следствие, из подобных ситуаций возникает понимание «неприятных» задач, которые не могут быть решены с произвольной точностью в силу особенностей своей постановки. Техника обработки подобных ситуаций зависит как от основного алгоритма моделирования, будь то булева операция, построение сглаживания, уклона и проч., так и от типов уравнений, задающих геометрию кривых и поверхностей, — для аналитических логика и точности обработки могут быть одни, а для сплайновой геометрии — другие. Рассмотрим на примерах, какие результаты получены в новом релизе. Начнём с примеров в булевых операциях.

Задача вычитания «трубки» из тела с прорезями. Особенность задачи в том, что геометрия «трубки» почти касается прорезей первого операнда. При этом требуемая точность результата задаётся генератору в качестве входного параметра

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



Подробное рассмотрение зависимости топологического ответа ядра от точности входной модели и точности операции
В приведённой иллюстрации производится совместный учёт точностей в булевой операции:
- учёт точности операции при слиянии поверхностей,
- учёт точностей рёбер и вершин исходных тел.
- слияние вершин и удаление рёбер для получения корректного результирующего тела.
Ещё пара примеров на эту тему. Рассмотрим вот такое булево вычитание:

Учёт точностей в булевой операции: слияние вершин и удаление микрорёбер для построения корректного тела
Ещё более непросто обстоит дело с пересечением сплайновых поверхностей. Рассмотрим задачу объединения почти касательных тел со сплайновой геометрией:

Пример, показывающий работу RGK в случае частичного наложения сплайновых поверхностей в булевых операциях
Следует отметить, что главную сложность в настройке алгоритмов при работе с толерантными моделями представляет выстраивание единой и непротиворечивой логики поведения всех алгоритмов ядра при различных комбинациях геометрии, топологии и точностей как исходных данных, так и вычислительных алгоритмов получения новой геометрии. В принципе, можно утверждать, что именно наличие такой разработанной и внедрённой идеологии и функциональности отличает промышленное ядро от функционального прототипа.
Конечно, развитие геометрического ядра «в глубину» не заменяет его развития «в ширину», а именно неуклонного наращивания функциональности API как в плане развития уже существовавших генераторов, так и разработки новой функциональности.
Функциональность для формирования и редактирования модели
Генераторы тел по траектории
Логическое развитие получила функциональность генераторов тел по траектории. Теперь в генераторах Sweep, Extrusion и Rotation поддерживается возможность задания толщины стенки результирующего тела.

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

Режимы ориентации профиля при движении по траектории, похожей на винтовую линию
Следует отметить режим автоматического распознавания винтовой линии — он позволяет создавать «правильно» ориентированные тела не только в случае строго винтовой траектории, но и при траектории в определённом интуитивном смысле подобной винтовой. Подобным образом ведут себя генераторы геометрии в некоторых других промышленных ядрах. Как говорится, всё дело в деталях, и это одна из таких деталей.
В новой версии добавлена поддержка продления многопрофильного тела по траектории за пределы первого и последнего профиля/контура.

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

Построение многопрофильного многосвязного тела по траектории с заданием соответствия компонент связности

Построение многосвязного многопрофильного тела по траектории с опцией объединения компонент результата
Дополнительно важно отметить, что эта функциональность допускает использование как замкнутых, так и разомкнутых контуров в качестве компонент связности.
Генератор тел «по сечениям»
В генераторе «по сечениям»:
- существенно доработан генератор,
- некоторые алгоритмы стали проще и надёжнее,
- выросла стабильность и качество результатов,
- добавлена новая функциональность.
Теперь поддерживается комбинация замкнутого и открытого сечения в общем виде.

Комбинация разных типов сечений в операции «По сечениям»
Добавлена поддержка касания сечений по вершинам.

Пример касания нескольких сечений по вершине
Реализована поддержка касательных граничных условий в операции «По сечениям» с вершиной — можно задать нормаль плоскости касательной, к которой будет поверхность в точке завершения.

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

Примеры операции «По сечениям» с условиями гладкости на продольные сечения

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

Примеры работы генератора на одном и том же наборе сечений с указанием разных требований по гладкости в каждом из сечений
Булевы операции
Дальнейшее развитие получила функциональность булевых операций. Точнее, инструментов моделирования на основе теоретико-множественной логики, частным случаем которых являются традиционные операции сложения, вычитания и пересечения объёмов. Была значительно расширена возможность работы с так называемыми non-manifold топологиями — обобщением понятия твёрдого тела на комбинацию топологий различной размерности.

Пример работы булева объединения твёрдого и поверхностного тела с различными значениями опций слияния топологий

Иллюстрация различных результатов булева вычитания в non-manifold случае с различными значениями флагов управления топологией ответов

Пример булева вычитания non-manifold тел
В текущей версии логика работы с обобщённой топологией доведена до полноты — поддерживаются все требуемые на практике конфигурации, а алгоритмы ядра учитывают в своей работе возникающие топологические обобщения.
Развитие получила функциональность селективной булевой операции. Раньше эта функциональность не позволяла произвольным образом задавать включаемые и исключаемые регионы и их произвольные комбинации. В текущей версии ядра эти ограничения были сняты. Теперь инструмент позволяет изменять поведение алгоритма в весьма широких пределах. Вот несколько примеров таких возможностей:

Иллюстрация возможности комбинации в одной операции разных типов булевых операций над разными частями модели

Пример булева объединения нескольких тел с отбрасыванием лишней топологии
Локальное редактирование модели
Развивается в RGK и функциональность локального редактирования модели. В распознавании сглаживаний добавлена поддержка фасок.

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

Пример изменения радиуса сглаживаний с ветвлением и зависимыми гранями

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

Пример перестроения сглаживания с учётом возможных переполнений при изменении радиуса

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

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

Пример удаления замкнутой цепочки сглаживаний

Пример удаления цепочек сглаживания с ветвлениями
Отдельное развитие получил и общий алгоритм удаления граней. Теперь он умеет обрабатывать более сложные конфигурации.

Пример удаления граней с восстановлением исходной топологии

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

Построение уклона граней с предварительным разрезанием изоклиной
В новой версии возможно задание поверхности разъёма (поверхностного тела), лежащей за пределами уклоняемых граней, и даже твёрдого тела.

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

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



Доступные опции в построении уклона граней с построением ступенек (с указанием рёбер отрыва и поверхности разъёма со ступенькой как по нормали, так и по поверхности)
В генераторе построения оболочек появилась поддержка изменения топологии тела при смещении. Тем самым поддерживается возможность вырождения топологических элементов.

Пример вырождения граней при построении оболочки внутрь тела (при заданном смещении пропадают грани сглаживания)
Реклама. АО «Топ Системы». erid: 2SDnjcHZhj3