ПрограммированиеФорумГрафика

Операция *Boolean* над мешами

#0
11:36, 2 мар 2007

Добрый день!

Возникла необходимость моделировать вырезание одного меша из другого.
Возможно два варианта:
1) Первое тело ВЫРЕЗАЕТ из второго тела ту часть, на которую в него входит.
2) Первое тело СМИНАЕТ второе тело в той части, в которых они перекрываются.
Требования и по точности и по скорости.

Может быть кто подскажет хорошие ссылки по данному вопросу, какие есть алгоритмы и т.д.?

Большое спасибо! :)

#1
12:46, 2 мар 2007

google ->  "constructive solid geometry"

#2
14:41, 2 мар 2007

Nikopol
Спасибо конечно, но в таком море инфы нужен хороший лоцман :)

#3
15:40, 2 мар 2007

SXC
Эх... видел я где-то пример - как шарик вырезает из слоника разные части
То ли в ATI SDK то ли в NVIDIA SDK

#4
16:34, 2 мар 2007

Спасибо, попробую скачать NVIDIA SDK...

#5
16:52, 2 мар 2007

насколько я помню там было не вырезание как таковое (solid geometry) а фейковое, что то типа стенсила.

#6
18:07, 2 мар 2007

В DX9 SDK есть вырезание Clipping Volume. Чтобы такое делали с мешами - не видел, да и это вряд ли реально. Мешь - это поверхность, а не объем, поверхность его может быть в том числе и незамкнутой, тогда об объеме и говорить нечего.

#7
18:12, 2 мар 2007

Mikle
Здесь речь идет о вырезании треугольников попиксельно с помощью стенсила
Т. к меш чаще замкнут то можно говорить об "объеме"

#8
23:34, 2 мар 2007

Библиотека GTS имеет в своём составе CSG-операции.
http://gts.sourceforge.net/

#9
9:26, 5 мар 2007

Я видимо некорректно сформулировал вопрос, мне нужно вырезание именно солидов.

по ссылке http://gts.sourceforge.net/ ходил, но она особо не помогла, т.к. меня интересует именно технология, а в том коде разобраться сложновато...

#10
9:52, 5 мар 2007

Ну, в принципе, если подумать, можно и самому алгоритм придумать...

Типа (для intersect):

1) Разбить обе фигуры на списки выпуклых многоугольников
2) Отсечь первую фигуру по каждой плоскости грани второй, для этого каждую из граней одной фигуры отсечь по каждой плоскости грани другой, получая на каждом шаге новый выпуклый многоугольник. В процесе надо еще добавлять новый треугольники, образовавшиеся в плоскости сечения.

Короче геометрия рулит :)

#11
10:12, 5 мар 2007

Недавно я написал библиотеку для булевских операций для мешей из треугольников. При этом не обязательно, чтобы меши были замкнуты. Работает весьма стабильно. Успешно исползуются в игре Герои Уничтоженных Империй в редакторе ландшафта. Раньше использовали вызов длл-ки из Майи, но когда сами написали булевские операции, все стало работать раз в 10 стабильнее. Принцип таков:

1)находим пересечение всех ребер 1-го меша с треугольниками второго, затем ребер второго с треугольниками первого.
2)проходим по всем треугольникам как первого, так и второго мешей и строим на каждом треугольнике список линий, на концах которых - точки, полученные в пункте 1
3)в каждом треугольнике создаем список замкнутых контуров, образованных этими линиями, таким образом получаем набор полигонов, на которые разбиваеися треугольник. Если нужно, триангулируем эти полигоны. Важно помнить, что они могут быть невыпуклыми, и даже содержать дырки. Триангуляция - это отдельная и довольно нетривиальная тема.
4)в каждое из ребер, полученных в пункте 2 должно входить ровно 4 полигона. Суть булевской операции в том, что мы из этих 4-х оставляем только 2, а остальные 2 помечаем как "выброшенные". Принцип выбрасывания:  (а) для каждого граничного ребра (см 2) вычисляем векторное произведение нормали полигона на  направление ребра (б) находим скалярное произведение этого вектора на вектор нормали смежного полигона. Если больше 0 - то помечаем как выброшенный. (если реализуем вычитание, то наоборот, выбрасываем полигоны, для которых ск. произведение меньше 0)
5)рекурсивно проходим по всем полигонам, которые граничат с выброшенными не по линиям из пункта 2 и выбрасываем их тоже.
6)все

7)если нужно - убиваем короткие ребра среди (2)
8)если нужно - добавляем легкий бивел по линии (2)

В принципе алгоритм - вполне реалтаймовый для невысокополигональных мешей. Но вообще-то трудоемкое это дело. У меня ушло недели две весьма упорного труда чтоб сделать и отладить это. Месяц до того в оффлайне потихоньку придумывал алгоритм. Могу дать исходники. Но они - часть большого проекта, так что скомпилить их тоже не так уж элементарно.

#12
11:39, 5 мар 2007

AndrewShpagin
демку с исходниками могёшь сваять?

#13
12:05, 5 мар 2007

AndrewShpagin
Большое спасибо!
Все более-менее прояснилось :)

ПрограммированиеФорумГрафика

Тема в архиве.