Реализация моделирования представления границ
Есть ли у кого-нибудь хорошие стратегии реализации или ресурсы для создания системы моделирования b-rep?
OpenCascade - это, очевидно, хорошая библиотека для моделирования b-rep (используемая FreeCad и PythonOCC оба очень крутые), но библиотека огромна, сложна и может не быть хорошей отправной точкой для изучения "движков" моделирования b-rep.
Я довольно много читал исследовательскую работу, и хотя фундаментальная математика полезна для понимания того, почему все работает, у меня остались некоторые вопросы по реализации.
Представляется, что структура данных с половинным краем является предпочтительным способом хранения информации о теле в реализациях b-rep.
Итак, несколько вопросов в произвольном порядке:
Используя половинную структуру данных, как обычно выполняется рендеринг? Триангуляция на основе границ твердого тела?
Как обычно применяются круглые грани / изогнутые поверхности? Например, цилиндр в одном базовом введении к б-репу, который я читал, хранился внутри как призма. Т.е. экструдированный треугольник и метаданные были сохранены вокруг граней колпачка, обозначая, что они действительно были круглыми.
Как обычно выполняются логические операции? Я читал о создании BSP-Tree вдоль кривых пересечений, а затем о комбинировании этих деревьев для создания новой геометрии. Существуют ли другие способы реализации логических операций и какие у них есть плюсы / минусы?
Спасибо!
Если вы хотите привести пример кода, не беспокойтесь о языке - вопросы больше о деталях реализации алгоритмической структуры / структуры данных
1 ответ
Я работаю над B-Rep-моделером на C# (я на очень ранней стадии: это огромный проект), поэтому я задаю себе те же вопросы, что и вы. Вот мои ответы:
- Триангуляция: я не сделал этого шага, но стратегия, о которой я думаю, заключается в следующем: спроецируйте границы граней в пространстве параметров, чтобы получить 2D-многоугольники (с отверстиями), триангулируйте это с помощью алгоритма отсечения ушей, а затем перепроектируйте вершины треугольника. в трехмерном пространстве. Для изогнутых поверхностей мне нужно разделить полигоны с помощью сетки, чтобы следовать поверхности;
- Для цилиндра есть 3 ребра: два круга и один отрезок. У меня есть классы для каждого типа кривых (
Segment3d
,Circle3d
...) и каждая половина содержит экземпляр одного из этих классов. Каждая грань содержит экземпляр поверхностного объекта (плоскость, цилиндр, сфера...); - Здесь есть интересный проект, основанный на BSP-дереве, но он использует метод CSG, а не B-rep. Я все еще изучаю, как это сделать, но не думаю, что мне понадобится дерево BSP. Сложность заключается в вычислении пересечений и топологии.
Лучшие книги, которые я нашел на эту тему:
- 3D CAD - принципы и приложения (старые, но все еще актуальные)
- Геометрическое моделирование: математика форм (более поздняя, чем предыдущая, но менее понятная)