В этой заметке мы хотим остановиться на геометрических расчетах. Ядро C3D Modeler, наряду с построением и редактированием трехмерных моделей, поддерживает и различные вычисления по имеющейся модели, например, построение триангуляции и плоских проекций, определение площади поверхностей (эту возможность как раз использовал НТП Трубопровод в новой версии программы ПАССАТ), объема и инерционных характеристик тел.
Одни из наиболее востребованных расчетов при разработке САПР относятся к проверке компонентов сборки на пересечение. Для получения результатов проверки рекомендуем использовать метод ::IsSolidsIntersection().
В качестве входных параметров есть возможность передать тела и их матрицы преобразования в глобальную систему координат. Работа алгоритма управляется через вспомогательные флаги: checkTouchPoints — флаг для поиска точек касания и checkTangent — флаг, определяющий, считать ли точки касания пересечениями.
Полное описание данного метода смотрите в онлайн-документации:
https://c3d.ascon.ru/doc/math/group___algorithms__3_d.html
Рассмотренный выше метод позволяет лишь установить факт пересечения, но не дает представления о расстоянии между телами. Для подобной задачи подходят методы ::MinimumSolidsDistance() и MbFaceShell::DistanceToShell().
При поиске пересечений внутри сборки из большого числа компонентов могут потребоваться многократные вызовы данных функций для одних и тех же тел. В такой ситуации рекомендуем воспользоваться первым методом, так как в нем реализован механизм создания и хранения объектов сопровождения тел и их граней через выставление соответствующих флагов isMultipleUseSolid1 и isMultipleUseSolid2.
Перечень параметров и их описание доступны в онлайн-документации:
https://c3d.ascon.ru/doc/math/group___algorithms__3_d.html
При использовании метода ::MinimumSolidDistance() заданные тела могут быть переданы в своих локальных системах координат. При этом вместе с телами необходимо задать матрицы преобразования в глобальную систему координат. В методе MbFaceShell::DistanceToShell() предполагается, что тела находятся в одной системе координат.
Вся полученная информация о найденном минимальном расстоянии содержится в полях класса MbShellsDistanceData. В них хранится не только значение минимальной дистанции, но и индексы граней и ребер оболочек, содержащих ближайшие точки. Получить данные из этих полей можно с помощью методов класса. Полный список этих методов приведен в онлайн-документации:
https://c3d.ascon.ru/doc/math/class_mb_shells_distance_data.html
В случае пересечения или касания тел выходной массив данных MbShellsDistanceData будет состоять из одного элемента со значением расстояния «0».
Разработчики понимают, насколько важно быстродействие при расчетах по геометрической модели, поэтому в новой версии C3D Modeler мы оптимизировали работу алгоритма определения минимального расстояния. Среди прочего высокая скорость достигается за счет кеширования данных и предварительного анализа по габаритным кубам тел.
Автор:
Сергей Бирюков
Продакт-менеджер C3D Toolkit