10.10.2025 • C3D Modeler

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D

Ранее в геометрическом ядре C3D было реализовано построение срединных оболочек для эквидистантных групп граней. Мы расширили этот функционал на общий случай. Теперь можно строить сплайновые срединные поверхности между гладкими совокупностями группами граней без требования эквидистантности.

Примеры построений

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

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 1
Рисунок 1а. Построение сплайновой срединной поверхности

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 2
Рисунок 1б. Построение срединной поверхности между группами граней, сверху — трехмерный вид, снизу показано поперечное сечение

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 3
Рисунок 1в. Построение замкнутой срединной поверхности

Общий алгоритм

Схема построения сплайновой срединной поверхности выглядит следующим образом.

Сначала выбираются базовая и ответная поверхности, которые могут быть составлены из нескольких граней одного тела. Гладкость этих поверхностей должна быть не ниже G1. Вместе с поверхностями выбирается сектор, в котором будет выполняться построение срединной поверхности. Для этого устанавливаются ориентации базовой и ответной поверхностей так, чтобы нужный для построения сектор находился с их внутренней стороны. На рисунке 2 базовая поверхность показана зеленым цветом, а ответная — оранжевым.

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 4
Рисунок 2. Выбор базовой и ответной поверхностей

На первом этапе алгоритма выполняется построение сетки на базовом наборе граней.

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 5
Рисунок 3. Сетка на базовой поверхности

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

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 6
Рисунок 4. Точки срединной поверхности

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

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 7
Рисунок 5. Фильтрация точек срединной поверхности. Зеленым цветом показаны точки, при построении которых использовалась сама ответная поверхность, а не ее продолжение

Далее выполняется отображение сетки базовой поверхности на точки срединной поверхности. Таким образом получаем первичное сеточное представление срединной поверхности.

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 8
Рисунок 6. Сетка срединной поверхности

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

Сплайновые срединные поверхности для общего случая в геометрическом ядре C3D, фото 9
Рисунок 7. Сплайновая срединная поверхность

Изменения в API

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

  • Режим запуска InputMode::im_twogroups.
  • Флаги инвертирования нормалей groupsInvNormals, определяющие ориентации базовой и ответной поверхностей. Используются для выбора сектора, в котором будет выполняться построение срединной поверхности. Срединная поверхность будет построена с внутренней стороны базовой и ответной поверхностей.
  • Флаг respGroupExt, разрешающий использовать точки срединной поверхности, найденные с использованием продолжения ответной поверхности.

Более подробно с обновленным интерфейсом вы можете ознакомиться по ссылке.

Ниже приведен пример кода для построения сплайновой срединной поверхности.

// 1. Выбор тела.
SolidSPtr baseSolid( ::SelectSolid() );
// 2. Создание параметров операции.
MbSNameMaker snameMaker( (SimpleName)ct_MedianShell, MbSNameMaker::i_SideNone, 0 );
IndicesSet baseFaces, respFaces; // Наборы граней, составляющие базовую и ответную поверхности.
baseFaces.insert( baseSolid->GetFaceIndex( *::SelectFace() ) );
respFaces.insert( baseSolid->GetFaceIndex( *::SelectFace() ) );
MedianShellValues params;
params.inputMode = MedianShellValues::InputMode::im_twogroups;
params.detectPairs = false; // Попробовать найти пары граней и построить срединную оболочку по эквидистантному случаю.
params.groupsInvNormals = { false, false }; // Флаги инвертирования нормалей базовой и ответной поверхностей. Выбор сектора построения срединной поверхности.
params.respGroupExt = true; // Использовать ли продолжение ответной поверхности.
params.cutByBordes = false; // Подрезать ли срединную поверхность границами тела.
MbMedianShellParams opParams( baseFaces, respFaces, params, snameMaker );
opParams.SetPrecision( 1.0E-6 ); // Запрашиваемая точность построения.
MbMedianShellResults results; // Результаты операции.
// 3. Выполнение построения оболочки.
MbResultType res = ::MedianShell( *baseSolid, cm_Copy, opParams, results );
// 4. Вывод.
if ( results._solid != nullptr ) {
  TestVariables::viewManager->AddObject( Style(), results._solid );
  double deviation = results.GetTolerance(); // Отклонение сплайна от первичного сеточного представления срединной поверхности.
}

Илья Патрушев, Ведущий математик-программист
Илья Патрушев,
Ведущий математик-программист, к. т. н.
C3D Labs
Поделиться материалом
Вверх