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

Одна из самых труднорешаемых задач в системах автоматизированного проектирования – скругления при моделировании объектов сложных форм. За построение скруглений, как и за всю геометрию в САПР, отвечает геометрическое ядро.

С точки зрения разработчика ядра охватить все варианты скруглений невозможно ввиду их бесконечного разнообразия. Наши математики постоянно добавляют в ядро C3D новые частные случаи, а недавно сделали скругление трех граней (или полное скругление).

В чем его сложность и как работает алгоритм, рассказывает Анна Ладилова, математик-программист C3D Labs.

Что такое «полное скругление»
Допустим, у нас есть тело с тремя цепочками граней – центральной (верхней) и боковыми (правой и левой). Требуется заменить центральную грань поверхностью скругления, которая бы гладко стыковалась с соседними боковыми гранями. Эта новая поверхность и будет полным скруглением. В общем случае она имеет переменный радиус, определяемый автоматически.

Во многих известных CAD-системах операция полного скругления (full-round fillet) реализована, но ее математика не раскрывается.


Операция Full round fillet в Solidworks

Поэтому мы разработали собственный алгоритм. И он отличается от алгоритмов других разработчиков.

Операции, хотя и называются одинаково, но приводят к немного разным результатам. Это говорит о том, что в SolidWorks скруглению трех граней дается другое определение.


Справа — исходная модель, в центре полное скругление в SolidWorks, слева — в C3D.

Алгоритм построения полного скругления
Задача построения любого вида скруглений включает в себя несколько этапов:

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

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

    Рассмотрим, как можно вычислить тройку точек – по одной на каждом сплайне.


    Обработка элементарной составляющей. Скругление касается каждой из трех граней по кривым l0; l1; l2. Синей линией изображено поперечное сечение

    В каждом поперечном сечении :

    • – рассчитывается автоматически
    • ортогональны касательным плоскостям поверхностей в соответствующих точках
    • 0 – точка привязки, лежит в плоскости .

    Определим исходные поверхности центральной, левой и правой граней радиус-векторами в некоторой области определения. Пусть боковые поверхности задаются радиус-векторами 1 и 2, а центральная – 0. Введем положительный числовой параметр .

    Обозначим через 0, 1, 2 единичные нормали к соответствующим поверхностям, направленные «внутрь».


    Поперечное «сечение» при построении скругления

    Потребуем, чтобы концы этих нормалей, растянутых в раз, попали в одну точку – точку .

    В терминах дифференциальной геометрии наши требования можно сформулировать системой из семи уравнений с семью параметрами:

    0 = 1,
    0 = 2,
    (00, 10, 20 = ,

    где

    • — переменный радиус
    • 0 — точка привязки
    • — переменные из области определения параметров.

    Используя алгоритмы численных методов (например, метод Ньютона), мы находим решение этой системы: 0, 0, 0, 0, 0, 0, 0.

    Решение определяет точки касания с поверхностями:

    • 0(0, 0),
    • 1(0, 0),
    • 2(0, 0),

    а также радиус 0.

    Пробегая некоторый набор точек 0, мы получаем наборы троек точек касания с поверхностями, по которым можно восстановить «кривые касания» 0, 1, 2 как сплайны Эрмита, проходящие через рассчитанные точки.

    Область определения [min, max] у всех кривых одна и та же, причем параметру i соответствуют точки 0i, 1i, 2i. Далее по этим кривым производится расчет нужного сечения скругления.

    Зафиксируем некоторый параметр и вычислим для него точки:

    • 0
    • 1
    • 2.

    Построим сплайновую кривую, проходящую через эти точки и ортогональную в них векторам нормали 0, 1, 2 соответственно.

    Если слегка изменить постановку задачи и искать кривую по заданным точкам и касательным векторам в этих точках, то методы, которыми можно реализовать такой сплайн, можно найти, например, в книге Николая Голованова «Геометрическое моделирование».

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

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

    В описании этой части алгоритма остался небольшой вопрос — как «правильно» выбрать набор точек 0, соответствующих поперечному сечению, по которым можно будет легко восстановить «кривые касания» 0, 1, 2?

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


    Слева поперечные сечения, зависящие от точки 0.
    Справа фигуры могут быть достаточно сложными, поэтому правильно выбрать «вспомогательную» кривую — это отдельная задача.

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

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


    Вверху модель без алгоритма сглаживания. Внизу — после применения алгоритма.

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


    Автор — Анна Ладилова, к.ф.-м.н., математик-программист C3D Labs

    Оставить комментарий