Новая версия RGK - новая функциональность и улучшение базовых инструментов
Автор: Леонид Баранов, директор по развитию технологий моделирования
Автор: Леонид Баранов, директор по развитию технологий моделирования
Приближается время выхода очередной версии геометрического ядра RGK от компании «Топ системы». С момента предыдущей публикации («Новая версия геометрического ядра RGK: открыто о сложностях и достижениях») прошёл почти ровно год, и имеет смысл рассказать о результатах, достигнутых за это время командой разработки RGK. С одной стороны, была проделана большая работа по развитию внутренних технологий ядра – работа с точностями в генераторах, распараллеливании внутренней логики, оптимизации алгоритмов как по скорости, так и по точности результата. С другой, наращивались возможности и устойчивость уже существующих функций ядра, разрабатывались различные, полезные на практике, инструменты. В частности, это относится к инструментам анализа геометрии, тесселяции, генерации проекций. И, наконец, разрабатывались принципиально новые технологические направления, значительно расширяющие возможности ядра при решении практических задач.
Приближается время выхода очередной версии геометрического ядра RGK от компании «Топ системы». С момента предыдущей публикации («Новая версия геометрического ядра RGK: открыто о сложностях и достижениях») прошёл почти ровно год, и имеет смысл рассказать о результатах, достигнутых за это время командой разработки RGK. С одной стороны, была проделана большая работа по развитию внутренних технологий ядра – работа с точностями в генераторах, распараллеливании внутренней логики, оптимизации алгоритмов как по скорости, так и по точности результата. С другой, наращивались возможности и устойчивость уже существующих функций ядра, разрабатывались различные, полезные на практике, инструменты. В частности, это относится к инструментам анализа геометрии, тесселяции, генерации проекций. И, наконец, разрабатывались принципиально новые технологические направления, значительно расширяющие возможности ядра при решении практических задач.
Развитие формообразующих операций и средств редактирования модели
В первую очередь, хотелось бы остановиться на дальнейшем развитии базовых операций создания модели. Практически во всех этих операциях-генераторах были сделаны важные улучшения.
В операции «по сечениям» была добавлена возможность использования «почти гладких» сечений. То есть сечений, сегменты которых состыкованы с управляемым допуском по углу. Такая возможность требуется при практической работе, чтобы упростить конечному пользователю или приложению создавать геометрию по не совсем аккуратным данным, но с управляемой погрешностью.
Задание угловой точности для построения единого гладкого сегмента на ребрах, стыкующихся почти гладко, см. рисунок 1.
Рисунок 1. Иллюстрирует ситуацию задания в качестве исходных данных негладкой проволоки, но результат операции в форме одной сплайн поверхности с формированием толерантных рёбер на границе грани
Рисунок 2. Пример построения поверхности «по сечениям» с продлением за пределы крайнего сечения
На практике нередко встречается необходимость построить поверхность «по сечениям» с направляющими за пределами крайних сечений. В новой версии ядра реализована такая возможность как для случая одной направляющей, так и для набора направляющих.
Продление по направляющим за пределы сечений. Случай одной направляющей. (Рисунок 2)
Рисунок 3. Пример построения поверхности «по сечениям» с продлением за пределы крайнего сечения для нескольких направляющих
Продление по направляющим за пределы сечений. Случай нескольких направляющих. (Рисунок 3)
Кроме того, в алгоритм генератора добавлена возможность автоматической синхронизации сечений как с одинаковым числом «углов», так и с разным. Вот пара примеров на эту функциональность (Рисунок 4):
Автоматический поиск соответствия вершин.
Поддержка сечений с разным числом вершин.
Рисунок 4. Пример работы режима автоматической синхронизации сечений с изломами
Значительное внимание в улучшении алгоритмов ядра уделялось вопросам качества и оптимизации поверхностей. Эта работа ведётся в самых разных инструментах ядра в том числе и в генераторе «по сечениям». Вот несколько примеров изменений в генерации поверхностей в этой операции в новой версии по сравнению с прошлым годом (Рисунок 5, Рисунок 6, Рисунок 7).
Тело по 3 замкнутым сечениям без граничных условий.
Рисунок 5. Пример, иллюстрирующий оптимизацию формы поверхности в новой версии генератора «по сечениям»
Поверхность по 2 сечениям с граничным условием на сохранение кривизны с прилегающих граней.
Рисунок 6. Пример, иллюстрирующий улучшение в алгоритме «по сечениям» пи обработке граничных условий G2
Оптимизация количества контрольных точек поверхностей (Рисунок 7).
Рисунок 7. Диаграмма изменения числа контрольных точек поверхностей, полученных операцией «по сечениям»
Была добавлена опция «впечатывания» промежуточных сечений и направляющих в топологию результирующего тела (Рисунок 8).
Рисунок 8. Иллюстрация работы опции впечатывания рёбер промежуточных сечений и направляющих в результирующее тело
В операции «по траектории» большое внимание было уделено поддержке граничных условий по гладкости в случае многопрофильного задания – когда задаётся несколько образующих и направляющих. Как известно, при внешней схожести такого способа задания с операций «по сечениям», форма создаваемой поверхности будет другой из-за природы алгоритма её получения – как бы движения некой кривой по траектории с деформированием кривой по законам, заданным явно (функциями кручения-масштабирования) или неявно – несколькими траекториями и/или промежуточными кривыми-сечениями. При разработке RGK принято детально рассматривать задачу, в том числе и регламентировать поведение алгоритмов в пограничных и вырожденных конфигурациях, проводить сравнение с лидирующими на мировом рынке инструментами моделирования. Такой подход, конечно, сильно повышает трудоёмкость и требования к качеству математики ядра, но и позволяет обеспечить приложениям требуемый уровень функциональности и стабильности. Приведём примеры работы новой функциональности в операции «по траектории» (Рисунок 9, Рисунок 10, Рисунок 11).
Рисунок 9. Пример построения поверхности методом протягивания границы грани по траектории с переходом в заданную кривую с сохранением гладкости с исходной гранью
Рисунок 10. Пример работы функциональности в случае задания условия гладкости на некоторых (но не всех) исходных гранях
Рисунок 11. Пример создания листового тела операцией «по траектории» с сохранением гладкости даже в случае негладкой границы на исходных сечениях
Обработка случая касательной сечения паралельной траектории (Рисунок 12).
Рисунок 12. Пример поведения алгоритма в ситуации геометрической неопределённости (выбрано одно из возможных решений)
Обработка случая различающегося направления нормали в разных точках ГУ (Рисунок 13).
Рисунок 13. Пример, иллюстрирующий поведение алгоритма в ситуации, когда нормаль ГУ «переворачивается» в разных точках образующей
Задание множителя производных в вершинах (Рисунок 14).
Рисунок 14. Пример, показывающий влияние задания множителя ГУ на форму результирующей поверхности
Отрицательный множитель позволяет контролировать направление ГУ (Рисунок 15).
Рисунок 15. Иллюстрация использования множителя ГУ для выбора решения в случае геометрической неоднозначности задачи
Поддержка в закрученном случае (Рисунок 16).
Рисунок 16. Пример построения замкнутого листового тела с выполнением условия касания в начале-конце траектории и с заданием «перекручивания» при помощи задания точек соответствия
Поддержка случая схождения нескольких линий соответствия вершин в одну вершину (Рисунок 17).
Рисунок 17. Пример создания листового тела операцией «по траектории» с соблюдением касания к исходным граням и сведением нескольких граней в одну точку
Приведённые иллюстрации, на наш взгляд, лаконично, но довольно наглядно демонстрируют прогресс в генерации сложных форм операцией «по траектории». Как легко видеть в этих примерах, ядру удаётся построить поверхности предсказуемой формы с соблюдением всех условий по геометрической гладкости даже в ситуациях неоднозначных и практически вырожденных. За таким поведением стоит не только довольно сложная алгоритмическая составляющая, но и много разных любопытных математических задач. По традиции наших статей вкратце расскажем об одном вопросе, который пришлось решить в базовых инструментах ядра, чтобы обеспечить построение и использование в ядре некоторых из приведённых выше форм. Важным требованием к поверхностям при моделировании является требование определённости нормали к поверхности в любой точке. В ряде случаев это требование формально не выполняется. Ниже приведён пример поверхности для которой правило получения нормали как векторного произведения векторов частных производных не выполняется.
Вычисление нормалей поверхностей в сингулярных точках: проблема.
В некоторых точках поверхности S(u, v) векторное произведение частных производных [S’u, S’v] = 0, и из-за этого нормаль не вычисляется.
Рисунок 18. Пример неопределённой нормали в углах поверхности
Как легко видеть на этом примере, «интуитивная» нормаль при этом существует в любой точке этой поверхности (Рисунок 18). Задача состоит в придумывании математической схемы, которая позволила бы вычислять нормаль к таким и подобным поверхностям устойчивым и однозначным образом.
Вычисление нормалей поверхностей в сингулярных точках: решение.
Рассматривается uv-кривая, проходящая через сингулярную точку, и вычисляется односторонний предел нормали вдоль этой кривой при параметре, стремящемся к параметру сингулярной точки (Рисунок 19).
Рисунок 19. Иллюстрация регуляризации задачи вычисления нормали к поверхности
Рисунок 20. Иллюстрация решения задачи
Вычисление нормалей поверхностей в сингулярных точках: решение
Для вычисления предела используется «особое правило Лопиталя» для векторов, полученное из геометрических соображений о том, что нормированное значение дифференцируемой векторной функции стремится к ее нормированной касательной при стремлении параметра к значению, в котором эта векторная функция обращается в нулевой вектор. Знак касательной зависит от того, с какой стороны рассматривается предел (Рисунок 20).
Вычисление нормалей поверхностей в сингулярных точках: результаты.
Такой подход позволяет вычислять нормали в сингулярных точках. При этом в точках, в которых нормаль не определена, можно рассмотреть разные uv-кривые, чтобы это выяснить (Рисунок 21).
Рисунок 21. Иллюстрация поведения алгоритма вычисления нормали к поверхности в зонах сингулярности
Приведённая схема решения одной из многочисленных задач при разработке ядра показывает, что часто приходится довольно тонко анализировать задачи и подходы к их решениям для получения качественного ответа. Любопытно, что описанный подход в ядре используется не только «напрямую» для работы с поверхностями в «конечных» моделях, но и при генерации поверхностей, и вообще работе с функциями двух переменных в тех же алгоритмах генерации «по сечениям» и «по траектории».
В булевых операциях была сделана очередная «незаметная» доработка. А именно в одновременной булевой надо набором тела была добавлена возможность получения обобщённой топологии в процессе построения.
Добавлена возможность проведения обобщенных булевых операций на множестве тел, при которых промежуточное тело может получиться с обобщенной топологией, но итоговое тело получается регулярным (Рисунок 22).
Рисунок 22. Иллюстрация булевого объединения нескольких тел по новой схеме
Был разработан новый генератор из класса локальных операций – «Рельеф/тиснение». Он позволяет формировать надписи и рисунки на твёрдых и листовых телах путём задания профилей и ограничений (Рисунок 23, Рисунок 24). Вот общий список возможностей этого генератора:
- Операция построения рельефа или тиснения по заданному профилю
- Пользователь передаёт целевое тело, профиль и, при необходимости, ограничивающий контур
- Поддерживаются листовые и твёрдые тела
- Доступно выполнение локально на определённых гранях тела
- Можно выбрать способ построения: по направлению, с уклонами граней или по нормалям поверхности
- Возможно создание как операции как «наружу» тела – рельеф, так и внутрь – «тиснение»
Рисунок 23. Пример работы выполнения рельефа на твёрдом теле с передачей профиля и ограничивающих граней в случае твёрдого тела
Рисунок 24. Пример работы выполнения рельефа на твёрдом теле с передачей профиля и ограничивающих граней в случае листового тела
Продолжали совершенствоваться представленные в прошлой версии новые генераторы. В частности, генератор построения серединного тела. В первую очередь был улучшен алгоритм расширения серединных тел и затягивания отверстий, что значительно повысило его стабильность в работе на практических примерах. В частности, в новой версии RGK, операция подрезки серединных тел может проанализировать входные серединные тела и их родительское твёрдое тело, и, если потребуется, расширить серединные тела и затянуть в них отверстия. Как известно, создание серединных тел и последующая подрезка может привести к появлению моделей, в которых грани перекрывают друг друга. Зачастую это происходит при работе с твёрдыми телами с неоднородной толщиной. При объединении листовых тел это может привести к образованию обобщённой (non-manifold) топологии. Для исправления ситуации в новой версии RGK в операцию подрезки серединных тел добавлен режим поиска и/или удаления перекрывающихся наборов граней (Рисунок 25).
Рисунок 25. Иллюстрация работы нового режима поиска перекрытий и подрезки серединных листовых тел в перекрывающихся конфигурациях
В RGK активно развивается режим построения истинно серединных листовых тел, о котором мы писали в прошлой публикации, как о важном режиме построения. Ранее режим был реализован для одиночных родительских граней. Теперь реализуется режим для множеств родительских граней. Серединное листовое тело в RGK состоит из листов, каждый из которых представляет истинно серединную поверхность, построенную между некоторой парой родительских граней (Рисунок 26, Рисунок 27).
Рисунок 26. Пример работы алгоритма построения истинно серединных тел в новой версии RGK (случай гладко сопряжённых граней)
Рисунок 27. Пример работы алгоритма построения истинно серединных тел в новой версии RGK (случай негладкого сопряжения граней)
Как видно из приведённых иллюстраций, технология генерации серединных тел получила значительное улучшение. Проводимые в ходе работ постоянные сравнения с ведущими иностранными ядрами показывают, во многих случаях получение более точного и топологически верного результата работы нового алгоритма.
Дальнейшему развитию подверглась функциональность расширения листовых тел. Добавлен режим расширения «до тела», а также возможность построения «заплатки» поверхности для исключения появления разрывов между расширяемыми гранями.
Добавлена возможность построения заплатки для случая расширения до тела (Рисунок 28).
Рисунок 28. Иллюстрация нового режима расширения листового тела «до тела»
Рисунок 29. Иллюстрация режима частичного расширения до тела
Кроме того, появилась опция «частичного расширения до тела». Она позволяет делать максимально возможное расширение листового тела до возникновения самопересечений (Рисунок 29).
Добавлена возможность частичного расширения до тела, когда нельзя расширить поверхность до пересечения с телом.
Понятно, что в общем случае, расширение листа – это довольно сложный процесс, и очень важно, чтобы ядро предоставляло возможности не получать «плохую» геометрию. Опция «частичного расширения» – как раз и есть пример такого поведения, не допускающего очевидную некорректность ответа. Вот ещё пример, как работает эта опция в иной конфигурации (Рисунок 30).
Рисунок 30. Иллюстрация поведения ядра при расширении листового тела для периодических поверхностей
Традиционно значительное внимание в разработке уделялось совершенствованию алгоритмов построения сглаживаний рёбер и поверхностей. Может показаться, что в новой версии изменения не столь значительны, как в прошлых релизах. С точки зрения изменений в API ядра, это действительно так, но прогресс в части совершенствования внутренних алгоритмов, повышения скорости и робастности всё же был значительным. Вот, к примеру, иллюстрация такого «незаметного» прогресса (Рисунок 31).
Рисунок 31. Примеры улучшения в сглаживании несколькими радиусами за одну операцию
Новые обработки в скруглении помогли увеличить радиус прокатывания на сложных сплайнах (Рисунок 32).
Рисунок 32. Пример расширения возможностей генератора сглаживаний RGK
Увеличена робастность алгоритма построения перекрытий (Рисунок 33, Рисунок 34).
Рисунок 33. Пример обработки перекрытия поверхностей сглаживания большого радиуса в новой версии ядра
Рисунок 34. Улучшено определение типа необходимой заплатки при схождении трёх родительских рёбер скругления на промышленной детали авиационного назначения. Результат иностранного САПР на нижнем правом рисунке
Комментируя примеры на рисунках, хочется сказать, как в одной старой рекламе: «мы работает ради этих миллиметров!». В контексте обсуждения обработки перекрытий листов сглаживания в процессе операции следует указать, что в новой версии добавлена возможность построения перекрытий в случае наличия набора последовательностей переменной выпуклости за одну операцию (Рисунок 35).
Рисунок 35. Наглядная иллюстрация работы ядра со сглаживанием перекрывающихся последовательностей разной выпуклости за одну операцию
Доработка обрезки сглаживания в случаях гладкосопряженных обрезающих граней в случае сплайновых поверхностей (Рисунок 36).
Рисунок 36. Пример, показывающий улучшение в «обрезке» сглаживания в сложном случае сплайновых граней
Улучшена логика работы с периодическими поверхностями (Рисунок 37).
Рисунок 37. Пример построения сглаживания с обработкой зон высокой кривизны
Генерация заплатки при невозможности построения кривой пересечения продлений гладкосопряженных терминальных граней (Рисунок 38).
Рисунок 38. Пример построения завершения листа сглаживания на сплайновых гранях в толерантных в случаях
Доработка обрезки сглаживания в случае вырождения обрезающих граней при расширении (Рисунок 39).
Рисунок 39. Пример работы алгоритма сглаживания в случае, где требуется расширение обрезающих граней
Последний пример показывает кажущимся небольшим улучшение алгоритма. Но тут стоит учесть, что «пирамидка» в нем – это построенная сплайнами топология, и сложность состоит как в расширении такой геометрии до требуемого для обрезки расстояния, не говоря уже о том, что алгоритм определяет какие грани нужно расширять, и в какой комбинации, для получения требуемого ответа. Таких, казалось бы, малозаметных улучшений, в новой версии довольно много. Их «незаметность» с точки зрения внешнего интерфейса отражает переход стадии разработки ядра от наращивания функциональности к оттачиванию алгоритмов на «промышленных» примерах (Рисунок 40).
Рисунок 40. Применение нового алгоритма на «промышленном» примере
Как этот процесс организуется в рамках разработки, поговорим чуть позже. Сейчас же стоит отметить, что только совершенствованием внутренней «начинки» алгоритма сглаживания доработки не ограничились. Были добавлены и принципиально новые возможности. В частности, появилась возможность строить гладкую поверхность скругления с сохранением как одной, так и двух границ в одной операции.
Алгоритм скругления автоматически сохраняет рёбра на пути сглаживания. В сечении у специальных поверхностей - дуга окружности с радиусом, заданным пользователем. Все поверхности скругления стыкованы гладко (G1). Поддерживается режим постоянного и переменного радиуса (Рисунок 41, Рисунок 42).
Рисунок 41. Пример, иллюстрирующий поведение алгоритма сглаживания новой версии при переходе в режиме сохранения рёбер на постоянном радиусе
Важно, что такое поведение демонстрирует алгоритм не только постоянного, но и переменного радиуса (Рисунок 43).
Рисунок 42. Иллюстрация сохранения гладкости поверхности между участками различной обработки в случае, представленном выше
Рисунок 43. Пример работы алгоритма сглаживания переменного радиуса с сохранением рёбер на переменном радиусе с сохранением G1 стыковки поверхностей сглаживания
В режиме реберного скругления с переменным радиусом можно задавать значения радиусов только для части гладкой реберной цепочки. При включенной опции «продлевать по гладко сопряженным» появилась возможность достраивать скругление постоянным радиусом для всей гладкой реберной цепочки (Рисунок 44).
Рисунок 44. Иллюстрация новой опции сглаживания в режиме переменного радиуса
Рисунок 45. Пример работы алгоритма сглаживания в новой версии RGK с явным и неявным заданием ограничивающих рёбер в рамках одной последовательности
Кроме того, добавлена возможность комбинировать различные режимы построения поверхностей сглаживания для разных участков последовательности сглаживания. Эта возможность ещё больше повышает гибкость и мощность алгоритма сглаживания, как в рёберной, так и граневой постановке задачи (Рисунок 45).
Была значительно доработана функциональность придания толщины листовому телу. В частности:
- Добавлена возможность задавать направление придания толщины
- При задании различных толщин для различных гладко сопряжённых граней появилась возможность задать режим стыковки результирующих граней (ступенька или продление до пересечения соседей)
- Добавлена возможность задавать «выколотые» грани на исходном теле. По аналогии с подобным поведением в операции «Оболочка»
- Улучшена обработка стыковки между негладкими поверхностями смещения
Приведём иллюстрации новой функциональности (Рисунок 46, Рисунок 47, Рисунок 48, Рисунок 49, Рисунок 50).
Добавлена возможность задавать общее направление смещения для всех граней
Рисунок 46. Иллюстрация построения тела смещения в заданном направлении внутрь и наружу от исходного листового тела
Рисунок 47. Иллюстрация обработки построения тела смещения с формированием ступеньки в месте разрыва смещаемых граней
Рисунок 48. Иллюстрация обработки построения тела смещения с расширением результирующих граней в месте разрыва смещаемых граней
Рисунок 49. Пример построение тела смещения с исключением выделенной грани исходного тела из обработки
Рисунок 50. Иллюстрация построения тела смещения при изломе ламинарной границы
Расширена функциональность различных инструментов ядра. В операцию «Сшивка» добавлена возможность задания «шаблона» при сшивке. То есть, указания наборов рёбер, которые нужно сшить. Эта функциональность полезна во многих приложениях как при разработке различных трансляторов, так и при формировании модели по специальной прикладной логике. Она позволяет, с одной стороны, ускорить процесс при наличии большого числа топологий, но, что более важно, избегать некорректного срабатывания операции при наличии мелких рёбер и грубых точностей на модели (Рисунок 51).
Рисунок 51. Иллюстрация результата работы сшивки «по шаблону» (справа) от «глобальной» сшивки (слева)
Кроме того, в операцию «Сшивка» добавлена возможность формировать обобщённые тела в качестве корректного ответа в соответствующем режиме генератора (Рисунок 52).
Рисунок 52. Иллюстрация получения обобщённого тела в результате сшивки двух листовых тел
Продолжено развитие функциональности замены граней. Теперь можно заменить сразу несколько граней тела на многогранные листы (Рисунок 53).
Рисунок 53. Пример работы нового режима в операции замены граней (разными цветами показаны соответствия грань-тело для замены в рамках одной операции)
Как можно заметить из рисунка, одна грань исходного тела может быть заменена на листовое тело, в котором содержится несколько граней. Ещё более наглядно эта возможность представлена на картинке ниже (Рисунок 54).
Рисунок 54. Пример замены одной грани тела на совокупность граней
Следует добавить, что при замене граней могут возникать неоднозначности, как на рисунке ниже (Рисунок 55).
Рисунок 55. Пример выбора варианта решения при неоднозначности
Вариант решения определяется указанием ориентации целевого листового тела, что добавляет гибкости операции при решении реальных задач.
Были выполнены доработки функциональности вычисления тени на теле. В ней добавлена дополнительная опция разделения входных тел на группы Cast - отбрасывающие тень тела, Gather - собирающие тень тела. Опция ускоряет работу на сложных телах, когда самозатенение отдельных тел не требуется, повышает стабильность генератора для касательных к направлению наблюдения граней (Рисунок 56).
Рисунок 56. Пример работы новых опций при формировании тени тел (красным цветом отмечено тело с заданием опции Cast, самозатенение этого тела отсутствует)
Рисунок 57. Пример работы новых опций при формировании тени тел (красным цветом отмечено тело с заданием опции Cast, второе тело задано с опцией Gather)
Опция Gather также устраняет самозатенение тела. Это позволяет точнее управлять областями, куда должна попадать тень от других тел на сложных телах (Рисунок 57).
Были доработаны и расширены востребованные в приложениях функции анализа геометрии, которое присутствовали в прошлых версиях, но в новом релизе были значительно переработаны. Например, метод для анализа кривой на разрыв производной. Внешнее приложение передаёт желаемую степень непрерывности кривой, метод возвращает разрывы производных на интервале от нулевой до желаемой степени непрерывности включительно (от С0 до С3 включительно по умолчанию). Доступна также функциональность вычисления вырождения кривизны кривых (Рисунок 58).
Пример поиска разрывов на кривой до 3 производной включительно. Сплайновая кривая 3 степени, 34 контрольные точки.
Пример поиска вырожденностей на кривой быстрым методом. Сплайновая кривая 3 степени, 10 контрольных точек.
Рисунок 58. Пример работы функции проверки аналитической гладкости кривой
Значительное внимание при разработке таких функций было уделено скорости вычислений и сравнению с конкурирующими ядрами мировых лидеров. Ниже приведено одно из таких сравнений (Рисунок 59).
Сравнение скорости выполнения поиска разрывов до 3-х (от С0 до С3 включительно) производных на кривых с иностранным ядром на моделях.
Рисунок 59. Пример сравнения скорости работы алгоритмов проверки гладкости кривых в сравнении с известным иностранным ядром
Похожая функциональность доступна и для анализа поверхностей. Доступен как анализ на аналитическое вырождение, так и на самопересечение сплайн поверхностей и поверхностей смещения (Рисунок 60, Рисунок 61).
Пример поиска вырожденностей на поверхности. Сплайновая поверхность 3 степени по U, 3 степени по V, 16 контрольных точек.
Рисунок 60. Иллюстрация поиска вырождения сплайн-поверхности
Рисунок 61. Примеры работы алгоритма поиска зон самопересечения
Оптимизация алгоритмов ядра
Помимо развития функциональности на всех уровнях, разработчики RGK традиционно большое внимание уделяют оптимизации алгоритмов геометрического ядра. Как уже неоднократно говорилось, задачей разработки является получения промышленного инструмента высокого качества на замену подобных библиотек ведущих мировых разработчиков. Поэтому вопрос оптимизации как по скорости, так и по памяти является крайне важным, и с течением времени занимает и будет занимать в будущем одно из центральных мест в процессе разработки. Приведём некоторые результаты, которые удалось получить в новой версии (Рисунок 62).
Рисунок 62. Иллюстрация прогресса в ускорении наиболее ресурсоёмких фаз булевых операций по сравнению с версией прошлого года
Оптимизировано вычисление сегментов пересечений:
- Улучшена многопоточная производительность.
- Пересечения поверхностей вычисляются с переданной пользователем точностью.
Повышена стабильность работы алгоритма на промышленных и модельных примерах.
В среднем производительность на моделях с насыщенной геометрией выросла на 24%.
Достигнутые ускорения получены и за счёт оптимизаций вычислений «низкого» уровня. Как тех, что приведены на рисунке ниже, так и за счёт более аккуратной работы с точностями кривых и точек, получаемых алгоритмами для решения задач (Рисунок 63, Рисунок 64).
Увеличена скорость расчёта сплайновых поверхностей и их частных производных. Пример: бикубическая поверхность (13x9 = 117 контрольных точек).
Рисунок 63. Иллюстрация достигнутого прогресса при вычислении параметров на сплайн поверхностях в сравнении с состоянием года назад, и актуальной версией известного иностранного ядра
Рисунок 64. Иллюстрация достигнутого прогресса при вычислении линий пересечения поверхностей
К рисунку 65 стоит добавить комментарий. Речь идёт о построении модели с той же самой результирующей точностью, заданной в параметре генератора, но использованию более «лёгких» математических форм для кривых пересечения.
Булево вычитание, модельный пример.
Рассечение листовым телом.
Рисунок 65. Иллюстрация уменьшения «тяжести» кривых пересечения за счёт оптимизации точности вычислений (экономится как память, так и время расчёта)
Кое-что существенно новое
Как уже упоминалось в начале статьи, в новой версии разработан ряд принципиально новых инструментов, расширяющих область применения геометрического ядра. В первую очередь нужно рассказать о появлении в RGK поддержки «гибридной» геометрии. Речь идёт о поддержке возможности использовать при моделировании в рамках общего формализма B-rep сеточных поверхностей и полилиний. Начиная с новой версии, в RGK можно создавать и работать с гранями, представленными треугольными сетками и рёбрами, представленными полилиниями. В отличии от подобных решений в других ядрах, в RGK разработана уникальная технология, позволяющая работать с такой геометрией ровно при помощи того же API, как и при «точном» моделировании. То есть с точки зрения внешнего приложения ничего принципиально не меняется – в теле те же рёбра и грани, но под ними лежит геометрия в полигональной форме. Самым важным моментом в этом представлении является тот факт, что в одном теле (твёрдом или листовом) может быть одновременно геометрия обоих типов – и точная и сеточная. И ядро теперь умеет оперировать с такими гибридными телами точно так же, как раньше работала с точными. Например, можно делать булевы операции над гибридными телами, строить проекции с удалёнными невидимыми линиями, рассчитывать масс-инерционные характеристики, проводить анализ пересечения и т.д. Понятно, что как частный случай, может быть создано полностью полигональное тело и, как и раньше, полностью «точное». Важно, что в гибридных телах работает вся та-же логика толерантных рёбер и вершин, что раньше была разработана для точных представлений. То есть, удалось добавить в ядро поддержку полигональных геометрий совершенно естественным и прозрачным образом – без изменения API генераторов и принуждения прикладного ПО специально обрабатывать случай полигональной геометрии каким-то особым образом. Понятно, что с точки зрения практической полезности, работа с сетками не ограничивается функциональностью общего назначения – требуется и дополнительная функциональность, учитывающая специфику этого типа геометрии. Опять же скажем сразу, что речь идёт о первой версии этой принципиально новой функциональности и часть полезных функции будет доступна в рамках ближайшего релиза, а часть в будущих обновления ядра. Но сейчас предлагается рассмотреть более подробно, как у нас принято, с иллюстрациями, что умеет делать RGK с гибридными телами в новой версии. В первую очередь, можно создать «сеточное» тело из внешней сетки (Рисунок 66). Сделать это можно разными способами. Например, есть возможность загрузить в ядро сетку в формате STL и позволить алгоритмам ядра декомпозировать её на грани и рёбра, то есть сформировать топологию тела. Ниже приведён пример работы такой функции на известном примере с формированием полностью корректного B-Rep представления твёрдого тела.
STL и Сеточное тело.
Рисунок 66. Иллюстрация функции RGK, которая конвертирует STL модель в сеточное тело, с которым можно выполнять различные операции
STL и Сеточное тело.
Рисунок 67.Пример работы функции преобразования неструктурированной сетки в твёрдое тело
В данном случае стоит обратить внимание на правую часть рисунка, где сетка разрезана рёбрами – каждый такой участок – это отдельная грань результирующего тела, а каждое ребро, соответственно, ребро такой модели. Сетка разбивается на отдельные грани, близкие к плоским, в которых вместо традиционной поверхности лежит сеточная поверхность.
Вот ещё один пример работы алгоритма преобразования входной сетки STL в тело RGK (Рисунок 67).
Приведённые примеры показывают самый простой способ получения тела с сеточной геометрией. Как уже отмечалось, он не единственный. В этом смысле сеточная геометрия не сильно отличается от точной: фактически в ядро только добавился дополнительный тип геометрии наряду с традиционными типами. То есть помимо плоскости, сферы, тора, цилиндра, конуса и NURBS, есть ещё и треугольная сетка. Например, можно удалить грань тела и вместо неё пришить сеточную грань или листовое тело, содержащее и сеточные и точные грани, полученные тем или иным способом (Рисунок 68).
Рисунок 68.Пример работы операции сшивки листового «точного» тела и листового тела с «сеточными» гранями с формированием твёрдого «гибридного» тела
Булево вычитание.
Рисунок 69. Пример вычитания из сеточного тела набора точных тел-цилиндров
Рисунок 70. Пример на замену граней тот же что был выше, но в качестве заменяющей используется сеточная геометрия
Модели с сеточной геометрией можно создавать преобразованием из точного представления через фасетер. Можно также использовать стандартные низкоуровневые функции создания топологии тела с передачей сеточной геометрии в качестве одного из стандартных типов геометрии. Например, можно всю сетку модели кролика передать в функцию создания граней и получить твёрдое тело с одной замкнутой гранью, а потом разрезать эту грань на произвольный набор граней при помощи операций проецирования и встраивания рёбер. Важно, что это те же самые вызовы API, что используются для работы с любой другой геометрией. Стоит отметить, что если сетка не замкнута, то такие тела будут иметь топологию листового тела – точно так же, как в «точном» случае. После формирования такого тела ядро позволяет делать с ним булевы операции без ограничений (Рисунок 69). Причём операнды, как уже говорилось, могут быть сеточными, точными, или гибридными телами – алгоритм булевых операций один и тот же для всех типов (Рисунок 70). Такой универсальности удалось добиться во многом благодаря мощной парадигме толерантного моделирования, которая изначально заложена в архитектуре ядра. Действительно, линия пересечения точного цилиндра и сеточной грани, это просто ребро с меньшей точностью, чем это было бы если вместо сетки использовать точную поверхность.
Булева операция, также работает между сеточными и обычными телами (Рисунок 71).
Рисунок 71. Чуть более экзотический пример булевой операции с получением гибридного тела
Так как структурно модель тела не претерпела изменений при добавлении «гибридности», как и следовало ожидать, функциональность ядра общего назначения продолжает работать на таких телах без изменений, так сказать «из коробки». Вот пример, работы функции вычисления масс-инерционных характеристик на модели, представленной на последнем рисунке (Рисунок 72).
Рисунок 72. Пример расчёта характеристик твёрдого тела
Как можно предположить из вышесказанного, функциональность построения проекций с удалёнными невидимыми линиями работает, в том числе, и с гибридными телами (Рисунок 73).
Поддерживается создание проекционных видов гибридных тел, содержащих как сеточные, так и аналитические грани
Сеточные и аналитические грани обрабатываются в рамках единого алгоритма
Рисунок 73. Примеры работы функциональности проецирования с удалёнными невидимым рёбрами на телах с гибридной геометрией (красным цветом на исходной модели помечены аналитические поверхности)
Но есть и специфичные алгоритмы, разработанные для сеточных геометрий. Например, алгоритм затягивания дыры в полигональной грани – листовом теле (Рисунок 74).
Рисунок 74. Пример работы алгоритма затягивания дыры на полигональной сетке в новой версии RGK
Этот алгоритм в настоящее время умеет затягивать не только односвязные «дыры». Ниже приведён простой пример работы этого алгоритма на многосвязной области. В конфигурации с так называемыми «островами» (Рисунок 75).
Рисунок 75. Пример работы функциональности затягивания островной области на сеточных гранях
Разработанная функциональность обладает значительной гибкостью и позволяет решать различные задачи достраивания сеточных геометрий на основе существующей в модели сеточной геометрии. Приведём ещё несколько примеров работы этих инструментов (Рисунок 76).
Существует возможность управлять формой патча.
Рисунок 76. Иллюстрация возможностей управления формой затягивающей сетки для областей, ограниченных сеточной геометрией
Важной особенностью разработанного инструмента является то, что граница затягиваемой области может быть не замкнутой, как на примере ниже (Рисунок 77).
Рисунок 77. Пример работы алгоритма на области с не замкнутой границей
И даже просто разрывной в нескольких местах, как на рисунке ниже (Рисунок 78).
Рисунок 78. Пример работы алгоритма затягивания области с полигональной разрывной границей
Важным моментом, который стоит отметить является возможность фасетера ядра получать согласованную по границам сетку на гибридных телах. Это важная возможность, которая позволяет корректно использовать такие геометрии в различных приложениях, например, в модулях CAE или CAM (Рисунок 79).
Рисунок 79. Примеры работы фасетера на гибридных телах
Как уже говорилось ранее, разработка функциональности гибридного моделирования ещё не полностью завершена. Соответственно, доработки будут вестись в двух направлениях. Во-первых, в направлении обеспечения поддержки сеточной геометрии в различных операциях ядра. Например, построении оболочек, уклонов, замене граней и других операциях. Во-вторых, развитии алгоритмов, специфичных для сеток. Важно отметить, что B-rep модель, используемую в RGK, удалось естественным образом обобщить с целью обеспечения поддержки сеточной геометрии. И это является в определённом смысле уникальным достижением команды разработки и показателем гибкости и общности архитектуры ядра в плане классов решаемых задач.
В статье прошлого года мы писали про технологию построения аппроксимирующей поверхности как мощного инструмента RGK, разрабатываемого для решения различных задач поверхностного моделирования общего вида. За прошедший год эта работа продвинулась далеко вперёд, несмотря на, в значительной степени, поисково-исследовательский её характер. В связи с этим, в новой версии ядра, помимо использования этой математики в различных внутренних алгоритмах для приложений, использующих ядро, стала доступна функциональность построения «поверхности-заплатки» заполняющую область между гранями тела с соблюдением заданных условий геометрической гладкости (G0, G1, G2) на границах. А также функциональность замены набора «гладко» состыкованных граней (в смысле допуска по углу уклонения нормалей или кривизны) одной поверхностью с заданной точностью. Рассмотрим подробнее полученные результаты в этой области. В первую очередь, стоит отметить новый G2 решатель, который позволил повысить скорость и точность получаемых решений (Рисунок 80).
- Линейная точность: 1е-6
- Угловая точность: 0.1 градуса
- Количество контрольных точек по U и V: 37, 37
- Время: 0.767982 секунды
Рисунок 80. Пример работы нового решателя в типовой задаче генерации поверхности
Для каждого ребра теперь можно задать свою геометрическую гладкость G0, G1, G2 (Рисунок 81).
Рисунок 81. Пример работы функции построения поверхности «заплатки» с различными условиями непрерывности на различных границах
Добавлена возможность передавать контур с разрывом (Рисунок 82).
Рисунок 82. Пример работы функции построения поверхности «заплатки» с различными условиями непрерывности на различных границах на разрывном контуре
В нижней части приведённого рисунка на диаграмме «зебра» заметно выполнение условий по G2 через верхние рёбра, а также нарушение условий G1 на боковых рёбрах – ровно так, как и было задано на генерацию.
Приведём результаты улучшений по скорости генерации поверхностей «заплаток» в новой версии в сравнении с прошлой и конкурирующим решением (Рисунок 83, Рисунок 84).
Иностранное ядро:
- Степень сплайна - 3х3
- Контрольных точек - 34х37
RGK:
- Степень сплайна - 5х5
- Контрольных точек - 33x28
Рисунок 83. Иллюстрация изменения скорости генерации поверхности из прошлогодней статьи
Рисунок 84. Иллюстрация достигнутого ускорения в новой версии
Выше упоминалась функциональность построения поверхности, заменяющей набор гладко сопряжённых граней с заданной точностью с сохранением условий гладкости через границы граней. Теперь приведём пару примеров работы этой функции ядра (Рисунок 85).
Рисунок 85. Примеры работы функции построения заменяющей поверхности с одновременным встраиванием её в тело вместо заменяемых граней
И ещё на одном аспекте в разработке новой версии RGK стоит остановится отдельно. Вскользь об этом упоминалось в более ранних статьях, но возможно, стоит рассказать подробнее о технологии формирования тестов для ядра. Общая схема этой технологии не меняется несколько лет, но в новой версии она получила значительное расширение и развитие. Речь идёт о получении тестовых скриптов для RGK из процесса пересчёта моделей T-FLEX CAD. Схема довольно проста: в код параметрического пересчёта операций T-FLEX CAD по определённым условиям вписано обращение к функциям RGK – аналогам функций ядра Parasolid. Полученные таким образом тестовые скрипты по реальным данным от пользователей служат основой тестовой базы RGK. Важно отметить, что это не некие unit-тесты, а именно реальная геометрия из промышленности, созданная при помощи одного из лучших промышленных ядер в мире. Нередко на пределе возможностей этого ядра. То есть, когда мы говорим, о задаче при разработке RGK, соответствовать лучшим мировым технологиям это не пустые слова – мы в каждодневном режиме сравниваемся с этими технологиями на реальных тестах. Такой подход позволяет, в настоящее время начать работы по широкому внедрению ядра RGK в продукты компании «Топ Системы».
Вместо заключения
В ближайшее время новая версия геометрического ядра RGK станет доступной как для промышленного применения, так и для тестирования. Уточним, что за последнее время появились коммерческие продукты, которые используют RGK в качестве основного инструмента моделирования. В приведённой статье мы постарались продемонстрировать, что за прошедший год была проведена значительная и многоплановая работа. Были улучшены и оптимизированы как базовые алгоритмы ядра, так и различные инструменты высокого уровня. Но, с нашей точки зрения произошло ещё одно важное изменение в развитии этого инструмента – от парадигмы «догнать» мировых технологических конкурентов происходит плавный переход к парадигме «развить новые технологии». Появление гибридного твердотельного моделирования и значительный прогресс в алгоритмах создания сложных поверхностей показывают это качественное изменение. В рамках развития будущих версий есть ещё не один приятный для разработчиков приложений технологический «сюрприз». Конуры некоторых из них можно угадать уже сейчас. Конечно важно понимать, что работы ещё много, но и цели остаются максимально амбициозными. Темп разработки от версии к версии сохраняется на высоком уровне и это приносит свои плоды.







