![image](https://habrastorage.org/webt/qb/mn/dn/qbmndn6mknsni8fgckahyoiskzs.png)
Одна из самых труднорешаемых задач в системах автоматизированного проектирования – скругления при моделировании объектов сложных форм. За построение скруглений, как и за всю геометрию в САПР, отвечает геометрическое ядро.
С точки зрения разработчика ядра охватить все варианты скруглений невозможно ввиду их бесконечного разнообразия. Наши математики постоянно добавляют в ядро C3D новые частные случаи, а недавно сделали скругление трех граней (или полное скругление).
В чем его сложность и как работает алгоритм, рассказывает Анна Ладилова, математик-программист C3D Labs.
Что такое «полное скругление»
Допустим, у нас есть тело с тремя цепочками граней – центральной (верхней) и боковыми (правой и левой). Требуется заменить центральную грань поверхностью скругления, которая бы гладко стыковалась с соседними боковыми гранями. Эта новая поверхность и будет полным скруглением. В общем случае она имеет переменный радиус, определяемый автоматически.
![image](https://habrastorage.org/webt/mk/zg/ln/mkzglnp0asjk9brbqdcphcx_f8o.jpeg)
Во многих известных CAD-системах операция полного скругления (full-round fillet) реализована, но ее математика не раскрывается.
![image](https://habrastorage.org/webt/so/dd/3c/sodd3chqrolatrltvlupww_2zxs.jpeg)
Операция Full round fillet в Solidworks
Поэтому мы разработали собственный алгоритм. И он отличается от алгоритмов других разработчиков.
Операции, хотя и называются одинаково, но приводят к немного разным результатам. Это говорит о том, что в SolidWorks скруглению трех граней дается другое определение.
![image](https://habrastorage.org/webt/np/ib/bu/npibbuz5ehzbs_x8oqh5j4wbm1s.png)
Справа — исходная модель, в центре полное скругление в SolidWorks, слева — в C3D.
Алгоритм построения полного скругления
Задача построения любого вида скруглений включает в себя несколько этапов:
- Разбить заданную цепочку на элементарные составляющие (для скругления трех граней это ровно три грани: левая, правая и центральная).
- Последовательно упорядочить элементарные составляющие.
- Построить поверхность скругления для каждой элементарной составляющей.
- «Сшить» ребрами соседние поверхности скругления.
- Обработать торцевые участки цепочки скруглений, т. е. корректно соединить их с модифицируемым телом.
Ключевым моментом в этой процедуре является третий шаг: построить поверхность скругления для трех заданных граней.
Для построения искомой поверхности первоначально необходимо определить кривые, по которым скругление касается каждой из трех граней. В общем случае эти кривые можно построить только как сплайны, проходящие через известные точки, которые рассчитаны заранее.
Рассмотрим, как можно вычислить тройку точек – по одной на каждом сплайне.
![image](https://habrastorage.org/webt/n2/jr/bf/n2jrbfs3zmz-ldwgg1jzot19nts.png)
Обработка элементарной составляющей. Скругление касается каждой из трех граней по кривым l0; l1; l2. Синей линией изображено поперечное сечение
В каждом поперечном сечении
– рассчитывается автоматически
ортогональны касательным плоскостям поверхностей в соответствующих точках
0 – точка привязки, лежит в плоскости
.
![image](https://habrastorage.org/webt/pw/zf/mm/pwzfmmbf95tlxsowylyxqht5x-m.png)
Определим исходные поверхности центральной, левой и правой граней радиус-векторами в некоторой области определения. Пусть боковые поверхности задаются радиус-векторами
Обозначим через
![image](https://habrastorage.org/webt/e8/96/r9/e896r9ub4rln1gpcxqb_hpdipfg.png)
Поперечное «сечение» при построении скругления
Потребуем, чтобы концы этих нормалей, растянутых в
В терминах дифференциальной геометрии наши требования можно сформулировать системой из семи уравнений с семью параметрами:
(
где
— переменный радиус
0 — точка привязки
— переменные из области определения параметров.
Используя алгоритмы численных методов (например, метод Ньютона), мы находим решение этой системы:
Решение определяет точки касания с поверхностями:
0(
0,
0),
1(
0,
0),
2(
0,
0),
а также радиус
Пробегая некоторый набор точек
Область определения [
Зафиксируем некоторый параметр
0
1
2
.
Построим сплайновую кривую, проходящую через эти точки и ортогональную в них векторам нормали
Если слегка изменить постановку задачи и искать кривую по заданным точкам и касательным векторам в этих точках, то методы, которыми можно реализовать такой сплайн, можно найти, например, в книге Николая Голованова «Геометрическое моделирование».
В книге подробно описаны методы скругления ребра тела, в частности, показано, что поперечное сечение скругления может быть реализовано как NURBS-кривая, определенная тремя точками. В случае скругления трех граней аналогичная кривая будет определяться пятью точками.
Итак, для каждого параметра
В описании этой части алгоритма остался небольшой вопрос — как «правильно» выбрать набор точек
Представляется разумным брать их с некоторой заранее выбранной кривой. В детали построения этой кривой мы вдаваться не будем, отметим только, что она должна быть гладкой, без самопересечений и «усреднять» цепочки ребер, ограничивающих слева и справа центральную грань.
![image](https://habrastorage.org/webt/ym/cr/sf/ymcrsfsqb_9ggnamxlem3u9ikcw.png)
Слева поперечные сечения, зависящие от точки
Справа фигуры могут быть достаточно сложными, поэтому правильно выбрать «вспомогательную» кривую — это отдельная задача.
Теперь, когда мы умеем строить поверхности скругления для простейших элементарных случаев, можно перейти к более сложной задаче: построить поверхность для цепочки граней.
Здесь основная проблема — «сшить» соседние поверхности гладким образом. Это четвертый шаг алгоритма.
Трудность заключается именно в гладкости сшивки, поскольку поверхности построены при разных начальных данных. Чтобы обеспечить гладкость, приходится прибегать к различным ухищрениям: менять направление и длину векторов производных в продольном направлении на некотором расстоянии от границы, менять значения производных весовых функций на границах и т.д. Результаты видны на рисунке: более гладкие линии «зебры» соответствуют более гладкой поверхности.
![image](https://habrastorage.org/webt/lt/q1/sj/ltq1sjl421bm1bpzgdzoxw9psvo.png)
![image](https://habrastorage.org/webt/2i/ws/fx/2iwsfxtcq6lx1t71j7cndso4i2g.png)
Вверху модель без алгоритма сглаживания. Внизу — после применения алгоритма.
Итог
В результате наших изысканий геометрическое ядро C3D умеет строить поперечное сечение скругления, опорные кривые, скругление трех граней; умеет сглаживать поверхность за счет выбора параметризации; частично умеет гладко стыковать соседние поверхности скругления.
![](https://habrastorage.org/webt/r2/es/ae/r2esaea4zfnhkc96crsygd9z9rg.png)
Автор — Анна Ладилова, к.ф.-м.н., математик-программист C3D Labs