Разложение 3d-сетки на 2d-сетку

Предположим, у вас есть трехмерный объект, представленный в виде трехмерной сетки в некотором распространенном формате файла. Как бы вы разработали алгоритм для разложения сетки на одну или несколько 2D-сетей, то есть 2-мерное представление, которое можно вырезать и сложить для создания исходного 3D-объекта.

Среди прочего, алгоритм должен учитывать:

  • Несколько возможных декомпозиций для любого заданного объекта
  • Обработка установки сетки на холсты фиксированного размера (листы бумаги).
  • Распознавание, когда две панели в сети перекрываются (и, следовательно, являются недействительными).
  • Разбиение сетки на несколько цепей, если они не могут быть представлены как одна из-за перекрытия или ограничений размера страницы.
  • Генерация вкладок в соответствующих местах, для присоединения смежных граней.

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

Я понимаю, что поиск оптимальной сети (наименьшее количество сетей / наименьшее количество страниц), вероятно, требует больших вычислительных ресурсов, но хорошей эвристики для поиска «достаточно хороших» сетей будет достаточно.


person Nick Johnson    schedule 08.06.2009    source источник
comment
Привет! Супер интересная тема. Какие-нибудь успехи в этом через несколько лет?   -  person nkint    schedule 23.05.2014
comment
Я только что наткнулся на этот вопрос, на самом деле есть программа, которая делает именно то, что вы говорите. Как, я понятия не имею. Но это действительно потрясающий инструмент! tamasoft.co.jp/pepakura-en   -  person Reed Jones    schedule 09.11.2017


Ответы (3)


Когда я прочитал ваш вопрос, мне пришли в голову слова «алгоритм автоматического создания бумаги». Поэтому я погуглил и нашел Модели из бумаги с использованием обобщенных цилиндров (pdf) Massarwi et al.

Мы предлагаем новый метод изготовления развернутых бумажных макетов округлых фигурок игрушечных животных из треугольных сеток с помощью аппроксимации на основе полос. Хотя в принципе триангулированную модель можно развернуть, просто сохранив как можно больше ее связности при проверке на наличие пересекающихся треугольников в развернутой плоскости, создать шаблон с десятками тысяч треугольников нереально. Наш подход заключается в аппроксимации сетчатой ​​модели набором непрерывных треугольных полос без внутренних вершин. Изначально мы разбиваем нашу сетку на части, соответствующие особенностям модели. Мы сегментируем каждую часть на зональные области, группируя треугольники, которые находятся на близких топологических расстояниях от границы части. Мы генерируем треугольные полосы, упрощая сетку с сохранением границ зональных областей и дополнительных линий разреза. Затем создается узор, просто разворачивая набор полосок. Отличительной чертой нашего метода является то, что мы аппроксимируем сетчатую модель набором непрерывных полос, а не другими линейчатыми поверхностями, такими как части конусов или цилиндров. Таким образом, аппроксимированный развернутый шаблон может быть сгенерирован с использованием только операций с сеткой и простого алгоритма развертывания. Кроме того, набор полосок можно создать, просто согнув бумагу (без разрыва краев), и они могут представлять гладкие элементы исходных моделей сетки.

Существует также более ранняя связанная статья под названием Модели бумажных поделок из сетки (9MB pdf) Shatz et al.

В этой статье представлен алгоритм сегментации сетки на развертываемые аппроксимации. Алгоритм может быть использован в различных приложениях в САПР и компьютерной графике. В этой статье основное внимание уделяется изготовлению бумаги и демонстрируется, что алгоритм генерирует аппроксимации, которые можно разрабатывать, легко резать и склеивать. Также показано, что расхождение между данной моделью и бумажной моделью невелико.

введите здесь описание изображения
Источник: http://www.ee.technion.ac.il/~ayellet/images/sel-papers-pic-5.jpg

person Eugene Yokota    schedule 08.06.2009
comment
Мне нужно было это, чтобы развернуть чистое текстурное пространство моих мешей в атлас. Ты спасатель. - person ; 30.03.2010

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

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

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

Когда у вас есть дерево, начните с рисования начального лица в начале координат. Затем пройдитесь по дереву и добавьте новые грани, вычислив новую вершину как пересечение двух окружностей с радиусами, соответствующими длинам ребер в исходной сетке. Расположение вкладок соответствует ребрам, которые были в исходной сетке, но не в сглаживаемом дереве.

Пользовательские разрезы могут обрабатываться как удаление ребер перед шагом дерева.

схема развертывания тетраэдра

Некоторыми недостатками этой техники является то, что она будет успешно создавать перекрывающиеся части в развертке, и это зависит от нахождения хорошей начальной грани. Я попробовал Floyd-Warshal, чтобы найти грань минимального диаметра для начала, но его поведение O (n ^ 3) приводило к чрезмерно длинным перерывам на кофе. С перекрывающимися частями можно было бы справиться, пометив эту ветвь дерева как «незавершенную», пропустив ее и повторно запустив алгоритм на всех неполных гранях.

person Theran    schedule 09.06.2009
comment
Хороший ответ, спасибо! Из вашего ответа не ясно, что вы намерены удалять ребра до тех пор, пока граф не станет деревом, но, похоже, это следствие. Я предполагаю, что подходит алгоритм минимального связующего дерева. Кроме того, ваш ответ подразумевает, что вы писали это раньше - личный проект или он где-то доступен? :) - person Nick Johnson; 09.06.2009
comment
На самом деле минимальное остовное дерево не работает, потому что оно не минимизирует количество складок от центра. Я обновил свой ответ, чтобы прояснить это. Что касается удаления ребер из сетки, этот алгоритм не изменяет исходную сетку. Я обнаружил, что проще создать сплющенную сетку с нуля, чем поддерживать все правильные инварианты при разделении ребер. Наконец, я действительно написал это раньше как плагин Blender с намерением выпустить его, но отвлекся, прежде чем закончить часть вкладок. Я возьму это со своего старого HD и выложу. - person Theran; 12.06.2009
comment
@Theran Как вы создали эти красивые изображения/диаграммы? - person Jason; 05.03.2014

Я знаю, что это не ответ, но это связано. Программа Lamina бывшего специалиста по графике SGI Пола Хеберли (Paul Haeberli) является решением этой проблемы.

person goger    schedule 20.06.2009
comment
Ух ты. Неплохая программа, но 353 доллара — это слишком много для использования в бумажном ремесле. ;) - person Nick Johnson; 20.06.2009