Статья подготовлена к конференции разработчиков Альянса по открытому проектированию (Open Design Alliance, ODA), которая пройдет 10-11 сентября в Праге. На конференции компания C3D Labs, партнер ODA, проведет собственную сессию для заказчиков и партнеров.
Когда мы говорим о 3D-модели в математическом смысле, то обычно имеем в виду граничное представление твёрдых тел. Твёрдых – в том смысле, что форму их можно считать постоянной; материал, из которого они изготовлены, считается однородным.
Пройдёмся предельно кратко по граничному представлению в стиле Авраам родил Исаака, Исаак родил Иакова. Я буду вводить некие понятия, не давая им строгих определений, ограничиваясь иллюстрациями. Более точное описание можно найти в специализированной литературе.
В граничном представлении тел предметом описания является граница: некий объект, по свойствам очень похожий на поверхность. Граница тела представляется в виде набора граней.
Вряд ли найдётся конструктор, который вручную станет описывать в явном виде геометрию своего изделия, все взаимосвязи между гранями и вершинами. Тем более он не обязан знать об особенностях хранения модели в файлах, с которыми работает САПР.
Например, в файлах DWG/DXF, работа с которыми есть хлеб Open Design Alliance (ODA), трёхмерные данные хранятся в разделе ModelSpace. За хранение тел в граничном представлении отвечают объекты типа Db3dSolid. В них содержится описание объёмных тел в формате SAT, что расшифровывается как save as text; формат разработан для обмена данными с геометрическим ядром ACIS компании Spatial.
Современные САПР предоставляют проектировщикам богатый набор инструментов, в основе которых лежит сравнительно небольшое число операций. Их правильная комбинация позволяет формировать изделия сложной формы. Команды консоли или сложный графический интерфейс делает удобным обращение к функциям модуля САПР, именуемого геометрическим ядром или моделером.
Именно тот небольшой набор операций, который моделер или платформа предоставляет разработчикам конечно-пользовательских приложений, и будет в фокусе внимания.
Создание 3D-моделей с помощью булевых операций в Teigha
Конструктор, проектируя изделие, не описывает его форму с явным использованием того математического аппарата, который лежит в основе представления моделей, записанных в файлах формата DWG. В свою очередь, пользовательский интерфейс приложения в соответствии с логикой, заложенной разработчиками САПР, обращается к функциям моделера.Одним из интерфейсов, который в платформе Teigha отвечает за 3D-моделирование, является интерфейс OdDb3dSolid. Набор методов, с помощью которых осуществляется моделирование, можно разделить на две большие группы: булевы операции над телами, операции над топологическими элементами и методы создания тел.
Булевы операции
Булевы операции над телами – очень мощный инструмент моделирования, наглядный, интуитивно понятный и применимый для многих практических задач. Вместе с тем соответствующий раздел API платформы Teigha является наиболее лаконичным, он представлен всего одним методом:OdResult OdDb3dSolid::booleanOper(OdDb::BoolOperType operation, OdDb3dSolid* solid);
Последний аргумент операции определяет её тип: объединение, пересечение или вычитание.
namespace OdDb
{
enum BoolOperType
{
kBoolUnite = 0,
kBoolIntersect = 1,
kBoolSubtract = 2
};
}
На этом принципе основан целый раздел моделирования, который называется конструктивной твердотельной геометрией (CSG). Суть этого подхода состоит в том, что листьями графа построения являются элементарные тела: параллелепипеды, цилиндры, шары и другие.
Создание операндов булевых операций
Для создания элементарных тел Teigha предоставляет исчерпывающий набор методов:void createBox( double xLen, double yLen, double zLen );
void createFrustum( double height, double xRadius, double yRadius, double topXRadius );
void createSphere( double radius );
void createWedge( double xLen, double yLen, double zLen );
void createTorus( double majorRadius, double minorRadius );
Все элементарные тела создаются в глобальной системе координат. Позиционирование в пространстве тел, над которыми требуется совершить булеву операцию, осуществляется с помощью операций параллельного переноса, поворота вокруг осей и масштабирования. Параметры операций на практике представляются в виде матрицы следующего вида: квадратная матрица поворота размера 3 как бы достраивается до матрицы размера 4: в дополнительных столбце и строке хранятся вектор смещения и коэффициенты масштабирования вдоль осей координат.
locMatr = OdGeMatrix3d::rotation( OdaPI2, OdGeVector3d::kXAxis ) * OdGeMatrix3d::translation( OdGeVector3d::kXAxis * 100.0 );
///...
pSolid->transformBy(locMatr);
Иногда подход CSG трактуется расширенно: под ним подразумевается моделирование тел с использованием булевых операций над классом тел, более широким, чем элементарные. В число операндов операций, как правило, включаются тела заметания. Тело заметания строится по двум кривым: заметаемый контур и траектория заметания. Среди траекторий заметания особое место занимают отрезок и дуга окружности, по которым строятся тела выдавливания и вращения соответственно. В Teigha для создания тел заметания предусмотрены следующие методы:
OdResult extrude(const OdDbRegion* region, double height, double taper, bool isSolid = true);
OdResult revolve(const OdDbRegion* pRegion, const OdGePoint3d& axisPoint, const OdGeVector3d& axisDir, double angleOfRevolution);
OdResult extrudeAlongPath(const OdDbRegion* region, const OdDbCurve* path, double taperAngle = 0.0, bool isSolid = true);
Я обращаю внимание на такую интересную особенность API, как наличие параметра конусности, который отвечает за плавное масштабирование заметаемого контура вдоль траектории выдавливания.
Локальные модификации 3D-моделей с помощью Teigha
Описание тела с помощью конструктивной твердотельной геометрии (CSG) сопряжено со значительными сложностями в тех случаях, когда возникает необходимость модифицировать форму тела. А необходимость подобного рода является скорее правилом, чем исключением, поскольку проектирование изделий носит итеративный характер. Список оснований для доработки модели весьма обширен: это могут быть результаты каких-либо расчётов или же испытаний прототипа. В ходе эксплуатации могут накопиться замечания и пожелания по совершенствованию конструкции. Переход на более совершенную технологию изготовления также может оказать влияние на форму заготовки. В общем, возможность изменить форму тела должна быть заложена в функциональность моделера и конечно-пользовательского приложения.В контексте решения данной задачи слабым местом конструктивной геометрии оказывается необходимость учитывать взаимозависимость всех характеристик всех исходных операндов булевых операций или, по крайней мере, их части. Это особая задача; есть коммерческие продукты для её решения, которые называются параметрическими ядрами, но они, как правило, используются для решения других конструкторских задач. Кроме того, не исключено, что нужно учитывать не только взаимосвязь параметров исходных тел, но и сам их набор.
Операции скругления, фаски, создания тонкостенного тела
Примером задачи, когда нужно согласованным образом менять характеристики многих тел, является операция скругления углов параллелепипеда.
Операция фаски похожа на операцию скругления с тем отличием, что поверхность между гранями, которые примыкают к рёбрам, сопрягается не по касательной, а под заданным углом.
OdResult filletEdges( const OdArray
const OdGeDoubleArray& radius,
const OdGeDoubleArray& startSetback,
const OdGeDoubleArray& endSetback );
Это неполный список операций геометрического моделирования.
Напомним, что моделирование как таковое не является основной задачей платформы: она предназначена для работы с файлом формата DWG. В этом отношении роль модуля-адаптера такова: получить SAT-поток из файла и сформировать исходное тело, выполнить операцию с заданными параметрами и сформировать SAT-поток результата.
До недавнего времени операции трёхмерного моделирования в Teigha могли быть реализованы только с использованием геометрического ядра компании Spatial. Модуль, который обеспечивает сопряжение платформы Teigha с геометрическим ядром, поддерживается разработчиками платформы, но моделер ACIS необходимо приобретать каждой компании самостоятельно.
В настоящее время альтернативным решением является использование связки моделера C3D Modeler и модуля обмена C3D Converter. Напомним, что формат SAT не является «родным» для геометрического ядра C3D, в отличие от ACIS. Этим и обусловлена необходимость использования конвертера. Процесс преобразования исходных данных и результатов моделирования скрыт от пользователя платформы Teigha: для того чтобы нетривиальные операции моделирования были доступны, к приложению достаточно подключить модуль C3D Modeler для Teigha. Необходимые библиотеки C3D Toolkit также могут быть загружены с сервера Open Design Alliance, а запрос лицензионного ключа осуществляется в один клик в личном кабинете. Простая процедура получения доступа к функционалу трёхмерного моделирования при использовании Teigha рассматривается командой C3D как преимущество перед ядром ACIS.
Первая – найти модель достаточно старую, при построении которой не применялись бы операции, которых нет в API Teigha. Ну, или хотя бы чтобы таких операций было минимальное число. Логично ожидать, что разработчики САПР, выпуская новую версию своего продукта, будут прикладывать демонстрационные примеры, которые содержат примеры реализации новой функциональности, новых операций. Наиболее яркий пример, с которым мы столкнулись при подготовке примеров, – операция выдавливания до объекта.
Вторая сложность уже чисто техническая: как организовать процесс построения так, чтобы получить красивую иллюстрацию «было — стало» для каждой операции. Основное противоречие, которое здесь приходится преодолевать, заключается в том, что ориентация модели и её масштаб не являются стандартными и должны совпадать до и после каждой операции. В то же время селектирование операндов булевых операций или, например, рёбер, требует изменения масштаба или вращения модели. Кстати, не исключено, что эта сложность преувеличена и возникла только из-за неполного знания возможностей тестового приложения платформы Teigha.
Как бы то ни было, история построения моделей была воплощена в двух демонстрационно-тестовых примерах.
Teigha® поддерживает работу с файлами .dwg, .dgn, .prc, .rvt, .rfa и .pdf на уровне программного обеспечения, а также обеспечивает импорт и экспорт данных из многих других форматов. Решение доступно для использования на всех основных настольных, серверных и мобильных платформах. Поддерживаются языки программирования: C++, .NET и Java.
Разработку Teigha® ведет Альянс по открытому проектированию / Open Design Alliance.
Teigha® является торговой маркой Open Design Alliance. Все другие торговые марки являются собственностью их правообладателей.
OdResult chamferEdges( const OdArray
const OdDbSubentId& baseFaceSubentId,
double baseDist,
double otherDist );
OdResult shellBody( const OdArray
double offsetDistance );
Как в Teigha реализованы операции геометрического моделирования
В самой платформе Teigha реализован только функционал создания элементарных тел. Все прочие операции реализованы «на стороне» и подключаются к платформе через модули-адаптеры.
Практические примеры
Основной идеей для выбора практических примеров является возможность воспроизвести историю построения модели, спроектированной в какой-либо из САПР. Сложностей было две.
О платформе Teigha®
Платформа Teigha® предоставляет разработчикам программного обеспечения инструментарий для создания различных инженерных приложений, включая полноценные CAD-системы, программы для автоматизации и визуализации общего назначения, а также решения по управлению доступом к пользовательским данным и их редактированию.