Назначение поверхностей зонам на основе трехмерных областей, которые они окружают

Учитывая набор поверхностей в трехмерном пространстве, я пытаюсь присвоить каждой поверхности зону, относящуюся к наименьшей трехмерной области, которую включает набор, или не использовать зону, если это неприменимо. Я также хочу определить, является ли поверхность интерфейсом между двумя зонами. Так, например, если бы у нас было 11 поверхностей, представляющих два куба, поставленных друг на друга, поверхности в верхнем кубе были бы в одной зоне, а поверхности в нижнем были бы в другой зоне (с поверхностью интерфейса, в обеих зонах).

В качестве примера я хочу взять набор поверхностей, таких как это, и превратить его в это. Каждый цвет здесь представляет зону, а серый не связан с зоной (как на откидной створке внизу).

Я провел некоторые поиски, пытаясь выяснить, придумал ли кто-нибудь уже алгоритм для этого, но я ничего не нашел (большинство, похоже, идентифицируют области, а не связывают поверхности с областью, которую они заключают). Таким образом, я пытаюсь придумать свой собственный алгоритм, и мне интересно, есть ли какие-либо другие альтернативы или будет ли работать мой метод.

Я предполагаю, что все поверхности связаны.

Моя идея заключается в следующем:

  1. Выберите случайную поверхность, каждая сторона которой касается ровно одной другой поверхности, и добавьте ее в зону 1.
  2. Добавьте каждую соединенную поверхность в зону 1 при условии, что каждая ее сторона касается ровно одной другой поверхности.
  3. Для тех соединенных поверхностей, которые соприкасаются более чем с одной поверхностью хотя бы одной из своих сторон, добавьте их в список «возможно».
  4. Для каждой новой поверхности в зоне 1 повторите шаги 2-3.
  5. После того, как поверхность была дважды добавлена ​​в список «возможно», добавьте ее в зону 1 и удалите из списка «возможно». Отметьте эту поверхность как интерфейс зоны.
  6. Добавьте интерфейс зоны в зону 2.
  7. Выберите одну случайную поверхность из списка «возможно» и назначьте ее зоне 2 и очистите список «возможно».
  8. Повторяйте шаги 2–7 (конечно, обновляя номер зоны), пока не останется неназначенных поверхностей.

Кажется, это работает для простых сценариев (например, два куба, поставленных друг на друга), но я не уверен, есть ли какие-то сложные условия, на которые мне нужно обратить внимание, или если он развалится, когда будет больше двух зон. которые разделяют сторону.

Буду признателен за любое улучшение моего грубого алгоритма/альтернативных идей для реализации. Спасибо!

РЕДАКТИРОВАТЬ: вот еще несколько деталей в ответ на некоторые комментарии. Зона по моему определению — это просто группа поверхностей, которые полностью ограничивают трехмерную область без пробелов. Итак, если бы у меня было два куба, А и В, которые не соприкасаются, у меня было бы две зоны: одна, состоящая из всех поверхностей куба А, а другая из всех поверхностей куба В. Если бы у меня был отсутствующий куб с одной стороны, не будет никакой зоны, связанной с этими поверхностями.

Моя конечная цель — сделать автоматизированный процесс группировки поверхностей в инструменте моделирования, который я создаю. Специфика засекречена, но по существу я имею дело с моделями, в которых определенные свойства являются общими только между поверхностями в той же «зоне», как описано выше. Я хочу сделать автоматизированный процесс создания этих зон, чтобы пользователь мог применить эти свойства ко всем поверхностям в зоне сразу, а не делать это вручную.

По сути, проблема сводится к поиску наименьших трехмерных областей, полностью окруженных произвольным набором поверхностей, и отслеживанию того, какие поверхности принадлежат каким областям. Я надеюсь, что это сделает мой вопрос более ясным.


person sschilli    schedule 29.07.2015    source источник
comment
Это очень похоже на ограничивающие прямоугольники и октодеревья, часто используемые в 3D игры для различных целей.   -  person MooseBoys    schedule 30.07.2015
comment
@MooseBoys К сожалению, это не то, к чему я стремлюсь. Я пытаюсь сгруппировать поверхности на основе наименьших трехмерных объемов, которые они охватывают в целом, в то время как ссылка, которой вы поделились, похоже, посвящена поиску наименьшего объема, содержащего каждую поверхность. Это на самом деле не относится к тому, что я пытаюсь сделать.   -  person sschilli    schedule 30.07.2015
comment
Я согласен с MooseBoys, согласно вашему описанию, Octree, kd-tree, ограничивающая рамка или BSP — это именно то, что вы строите. Если это не так, вам нужно будет переформулировать свой вопрос. Определить зону. Определите, что вы подразумеваете под замыканием: то есть один треугольник, что охватывает в вашей схеме? Кроме того, укажите свою конечную цель, то есть если у вас есть то, что вы хотите, собираетесь ли вы выполнять специальные запросы, рассчитывать объем и т. д.?   -  person Nicko Po    schedule 04.08.2015
comment
@NickoPo Я добавил еще несколько деталей в свой исходный пост. Надеюсь, это поможет прояснить, что я ищу.   -  person sschilli    schedule 04.08.2015
comment
Вы предполагаете, что каждый набор поверхностей в точности заключает в себе объем? Под этим я подразумеваю, что поверхности не выходят за пределы многогранников, которые они заключают (нет висячих поверхностей). Как вы представляете поверхности? Я думаю, вы, возможно, сможете адаптировать QHull для этого, но мне потребуется дополнительная информация, прежде чем пытаться дать полный ответ.   -  person DrBwts    schedule 10.08.2015
comment
@DrBwts Нет, я не предполагаю, что каждый набор поверхностей точно охватывает объем. На самом деле вполне вероятно, что в моделях, которые я тестирую, будут висячие поверхности (те, которые не соединяются с другой поверхностью со всех сторон). Поверхности представлены в виде упорядоченного списка вершин (так что в основном это многоугольник в трехмерном пространстве).   -  person sschilli    schedule 10.08.2015
comment
Чтобы было ясно, являются ли вершины в этих списках также вершинами замкнутого объема (минимальные многогранники, заключенные в эти поверхности)? Поверхности ровные? Сколько вершин определяют поверхность или поверхности являются произвольными многоугольниками? Простой пример кода был бы очень полезен на этом этапе.   -  person DrBwts    schedule 10.08.2015
comment
@DrBwts Я добавил в абзац (второй), в котором есть изображения, которые помогут объяснить, чего я хочу. Я думаю, что это будет полезно. Что касается ваших вопросов: 1. Замкнутый объем определяется поверхностями, поэтому вершины идентичны. 2. Да, все поверхности плоские. 3. Все поверхности являются произвольными многоугольниками.   -  person sschilli    schedule 10.08.2015
comment
Чтобы не быть придирчивым, но первое предложение в связанной вики заканчивается плоскостью и многогранниками в 3D. Какая часть вам нужна ;)   -  person Nicko Po    schedule 10.08.2015
comment
@NickoPo Могут ли объекты DCEL работать с многообразными сетками?   -  person DrBwts    schedule 10.08.2015


Ответы (1)


В таком случае вас интересует обнаружение закрытой поверхностной (объемной) топологии сетки из набора входных полигонов; иными словами - многогранники. Это характерно практически для каждого пакета 3D-моделирования. Я предполагаю, что у Blender есть код, который делает это. Существуют разные способы сделать это, однако обычно используется некоторая версия полуреберного графа. См. вики-ссылку здесь: двухсвязный полуреберный граф. Идея состоит в том, чтобы пройтись по вашим входным полигонам и построить эти графики. После этого вы можете легко запросить каждый график, чтобы увидеть, есть ли дыры (отсутствуют ребра и т. д.).

введите здесь описание изображения

Я прикрепил картинку, объясняющую, как использовать полуреберную структуру, чтобы получить то, что вы хотите: Допустим, вам дан суп из пяти прямоугольников (они составляют куб без вершины. Если вы обрабатываете свой первый прямоугольник, скажем, ABCD, это создает ваш первый граф, скажем, G1. Теперь вы обрабатываете второй многоугольник, скажем, FEHG, ни одну из этих вершин вы еще не видели, поэтому вы создаете второй граф, G2. Теперь скажем, что вы обрабатываете многоугольник CDGH. Вы видели эти вершины раньше, поэтому вместо создания новый граф, вы объединяете (соединяете) существующие графы, которые разделяют эти узлы. Продолжайте, пока не обработаете все полигоны. Вы получите граф на картинке.

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

Обратите внимание: если у вас есть, скажем, две пересекающиеся фигуры, вы также можете отслеживать их с помощью этих графиков, но это намного сложнее. По сути, при обработке нового полигона вам нужно было бы не только посмотреть, принадлежит ли какая-либо его вершина уже обработанным графам, но и посмотреть, не пересекается ли этот полигон с каким-либо из ранее обработанных полигонов, если да, то разбить этот полигон и добавить все это в пересеченный граф.

person Nicko Po    schedule 04.08.2015
comment
Ссылка, которой вы поделились, кажется, относится к 2D-объектам, но я полагаю, что было бы несложно применить ее к 3D-телу. Тем не менее, я не понимаю, как можно использовать эту информацию для определения зон, как это пытаюсь сделать я. Я не только хочу видеть, есть ли дыры, я хочу, чтобы каждая поверхность была сопоставлена ​​с наименьшей областью, которую она заключает. Любые идеи о том, как это сделать? - person sschilli; 10.08.2015
comment
Думаю, у Нико По получилось. - person DrBwts; 11.08.2015
comment
Я присудил награду, потому что я считаю, что вы что-то нашли, и срок ее действия истекал. Однако я все еще немного смущен. При построении графика каким образом вы соединяете точки? Если у вас есть ABCD, вы рисуете стрелки от B->A, C->B, D->C, A->D? Я попытался проследить это сам и не получил тех же ребер, которых вам не хватало, и не совсем понял, как вы гарантируете, что каждое из четырех верхних ребер связано только с одной другой вершиной сверху (с отсутствующей стороной вершины). призма). Я был бы признателен, если бы вы могли помочь мне с этим. - person sschilli; 11.08.2015