Конструктивная сетка с твердой геометрией - PullRequest
31 голосов
/ 05 января 2010

Если я создаю фигуру, используя конструктивную геометрию твердого тела , как я могу построить каркасную сетку для рендеринга? Мне известны алгоритмы непосредственного рендеринга форм CSG, но я хочу преобразовать их в каркасную сетку только один раз, чтобы я мог отобразить ее «нормально»

Чтобы добавить немного больше деталей. Учитывая описание формы, такой как «Куб здесь, пересечение со сферой здесь, вычитание цилиндра здесь», я хочу иметь возможность вычислять многоугольную сетку.

Ответы [ 7 ]

21 голосов
/ 05 января 2010

Есть два основных подхода. Если у вас есть набор многоугольников, можно создать дерево BSP для каждой фигуры, затем деревья BSP можно объединить. Из Википедии,

1990 Нейлор, Аманатиды и Тибо предоставить алгоритм объединения двух деревья BSP, чтобы сформировать новое дерево BSP из два оригинальных дерева. Это обеспечивает много преимуществ, в том числе: объединение движущиеся объекты, представленные BSP деревья со статической средой (также представлена ​​BSP-деревом), очень эффективные операции CSG на многогранниках, точное обнаружение столкновений в O (log n * log n) и правильное упорядочение прозрачных поверхностей, содержащихся в двух взаимопроникающие объекты (было используется для эффекта рентгеновского зрения).

Здесь находится статья Слияние деревьев BSP дает многогранные операции над множествами .

В качестве альтернативы, каждая фигура может быть представлена ​​как функция над пространством (например, расстояние до поверхности со знаком). До тех пор, пока поверхность определена так, что функция равна нулю, функции можно объединять, используя операторы (MIN == пересечение), (MAX == union) и (NEGATION = not) для имитации операций над множествами. Полученная поверхность может быть затем извлечена как позиции, где объединенная функция равна нулю, используя метод, подобный марширующим кубам. Также можно использовать лучшие методы извлечения поверхности, такие как Dual Marching Cubes или Dual Contouring. Это, конечно, приведет к дискретному приближению истинной поверхности CSG. Я предлагаю использовать Dual Contouring , потому что он способен восстанавливать острые элементы, такие как углы кубов.

4 голосов
/ 25 апреля 2010

Эти библиотеки, кажется, делают то, что вы хотите:

www.solidgraphics.com / SolidKit / carve-csg.com/ gts.sourceforge.net/

3 голосов
/ 11 июля 2010

См. Также «Конструктивная сплошная геометрия для триангулированных многогранников» (1990). Филип М. Хаббард doi: 10.1.1.34.9374

2 голосов
/ 05 января 2010

Здесь - некоторые ссылки Google Scholar, которые могут быть полезны.

Исходя из того, что я могу сказать об аннотациях, основная идея состоит в том, чтобы сгенерировать облако точек из объемных данных, доступных в модели CSG, а затем использовать некоторые более распространенные алгоритмы для создания сетки граней в 3D, чтобы соответствовать этой точке облако.

Редактировать: Проводя дальнейшие исследования, этот вид операции называется «преобразование из CSG в B-Rep (представление границы)». Поиски по этой строке приводят к полезному PDF:

http://www.scielo.br/pdf/jbsmse/v29n4/a01v29n4.pdf

И, для получения дополнительной информации, алгоритм ключа называется " Алгоритм марширующих кубов ". По сути, модель CSG используется для создания объемной модели объекта с вокселями, а затем алгоритм Marching Cubes используется для создания трехмерной сетки из данных вокселей.

1 голос
/ 08 мая 2012

Мне повезло с приложением BRL-CAD MGED, где я могу построить выпуклый многогранник, пересекая плоскости с помощью CSG, а затем извлечь представление границы с помощью команды g-stl из командной строки. Чек http://brlcad.org/ Malcolm

1 голос
/ 05 января 2010

Вы можете попытаться триангулировать (тетраэдрически) каждый примитив, а затем выполнять булевы операции на тетраэдрической сетке, что «проще», поскольку вам нужно беспокоиться только об операциях тетраэдр-тетраэдр. Затем вы можете выполнить извлечение границы, чтобы получить B-повтор. Поскольку вы знаете формы своих примитивов аналитически, вы можете создавать собственные тетраэдризации своих примитивов в соответствии с вашими потребностями вместо того, чтобы полагаться на библиотеку генерации сетки.

Например, предположим, что вашим объектом был союз куба и цилиндра, и предположим, что у вас есть тетраэдризация обоих объектов. Чтобы вычислить граничное представление результирующего объекта, сначала нужно пометить все граничные грани тетраэдров каждого примитивного объекта. Затем вы выполняете операцию объединения: если два тетраэдра не пересекаются, то ничего не нужно делать; в полученном многограннике должны существовать оба тетраэдра. Если они пересекаются, то есть ряд случаев (вероятно, порядка десятка или около того), которые необходимо обработать. В каждом из этих случаев объем двух тетраэдров необходимо повторно триангулировать таким образом, чтобы соблюдались поверхностные ограничения. Это несколько облегчает тот факт, что вам нужно беспокоиться только о тетраэдрах, а не о более сложных формах. При этом необходимо поддерживать метки граничных фасетов, чтобы в конечном наборе тетраэдров граничные грани можно было извлечь для образования треугольной сетки поверхности.

0 голосов
/ 21 апреля 2015

Если вы можете преобразовать свои входные примитивы в многогранные сетки, то вы можете использовать логические подпрограммы C ++ libigl. Далее вычисляется объединение сетки (VA, FA) и другой сетки (VB, FB):

igl::mesh_boolean(VA,FA,VB,FB,"union",VC,FC);

где VA - матрица #VA на 3 позиции вершин, а FA - матрица #FA на 3 из треугольных индексов в VA, и так далее. Техника, используемая в libigl, отличается от тех, что упомянуты в ответе Джо. Все пары треугольников пересекаются друг с другом (с использованием пространственного ускорения), а затем полученные субтреугольники классифицируются как принадлежащие выходной поверхности или нет.

...