Упрощение тяжелых сеток

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

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

На сегодняшний день инструменты для осуществления операций по чистке (clean) и упрощению (simplify) тяжелых сеток, в той или иной степени имеются фактически в любом популярном 3д пакете, ровно как и отдельные утилиты специализирующиеся на решении исключительно подобных задач (например  Skinny3D от TDMSolution -создателей популярных плагинов для Rhino), однако мощным, гибким и удобным инструментом является open-source пакет MeshLab (хотя насчет удобства это еще как сказать, софт не без особенностей, так например примененную  операцию нельзя отменить), к слову сказать как раз разработанный для коррекции и выправления результатов сканирования.

Процедура упрощения в MeshLab

Сама процедура упрощения меша, и как следствие уменьшения веса конечного файла с помощью MeshLab достаточна проста, и описана ниже.

Импортируем меш в MeshLab посредством меню File → Import Mesh или нажав сочетание клавиш Ctrl+i. В качестве примера я импортировал скан статуэтки в формате .ply размером 180мб (предварительно оптимизированный, но, увы, ничего “тяжелее” на момент написания статьи под рукой не нашлось), однако MeshLab работает фактически со всеми распространенными форматами сеток.

скан статуэтки индийского бога Ганеши в формате .ply размером 180мб
скан статуэтки индийского бога Ганеши в формате .ply размером 180мб

После того как мы импортировали  меш, в строке меню выбираем Filters Remeshing, simplification and construction Quadratic Edge Collapse Detection. Если необходимо сохранить текстуру модели ниже строка Quadratic Edge Collapse Detection (with texture).

Параметры инструмента упрощения

меню опций окна Quadratic Edge Collapse Detection
меню опций окна Quadratic Edge Collapse Detection

Target number of faces — количество полигонов, которое хотите получить на выходе.

Percentage reduction (0…1)размер итогового файла в процентном соотношение к изначальному размеру, по умолчанию установлено значение 0, т.е. параметр не учитывается. 

Quality threshold – определяет порог качества для исправления “плохих” граней, в диапазоне от 0 до 1. Значение 0 отключает опцию, значение установленное в 1 увеличивает время расчетов. Оптимальным является значение 0.5.

Preserve Boundary of the Mesh – сохранение границ меша, если параметр активирован процесс не влияет на изначальные границы меша.

Boundary Preserving Weight – значение границ меша. По умолчанию установлено 1.0, что означает что процесс не влияет на изначальные границы меша. Значения выше 1.0 увеличивают значения границ меша и приводят к эффекту удаления вершин ниже этих значений.

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

Preserve Topology — сохранение топологии. Если активен все разрывы топологии начального меша, такие как дыры, несоединенные грани и т.д., исправление которых может привести к нарушению топологии начального меша, в процессе расчета упрощенного меша игнорируются, топология останется неизменной.

Optimal position of simplified vertices — каждая вершина упрощенной сетки будет перемещена так, чтобы минимизировать квадратичные ошибки, что в свою очередь может привести к некачественному результату и образованию “шипов” (в случае с большим количеством плоских областей). Если параметр не активен ребра “схлопываются” к двум оригинальным вершинам, в результате чего координаты вершин упрощенной сетки будут идентичны координатам вершин исходной.

Planar simplification добавляет ограничения на упрощения планарных частей меша (плоскостей).

Weighted Simplification — если параметр активен, при вычислениях учитывается вес вершин. Так части меша, имеющие больший вес не будут подвержены процессу упрощения, в то время как части с меньшим весом вершин будут упрощены.

Post Simplification cleaning после процесса упрощения чистит геометрию, удаляя такие артефакты, как отдельные вершины, несоединенные ребра и т.п.

Simplify only selected faces – упрощать только выделенные грани (при активации параметра будьте внимательны с указанием количества граней в параметре Target number of faces!).

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

Оставляю значения всех параметров по умолчанию, в окне Target number of faces задаю желаемый полигонаж (кстати, программа уже сделала это за меня, предварительно разделив количество граней исходного меша вдвое), и сниму галочку с параметра Optimal position of simplified vertices поскольку оптимизация координат вершин в достаточно сложной геометрии наверняка приведет к неудовлетворительному результату. Apply.

Операция заняла у меня четыре минуты (243647 msec, как посчитал сам MeshLab), в результате чего программа сгенерировала новую сетку с вдвое меньшим количеством полигонов. Однако, т.к.  параметр Preserve Normal я не активировал, вывернутых нормалей избежать не удалось (см. скриншот ниже). Сделал я это умышленно, поскольку по опыту знаю, активация данного параметра увеличит время расчетов фактически в двое. Чтобы пофиксить это идем в меню Filters Normals, Curvatures and Orientation ReCompute Vertex Normals, и в открывшемся окне выбираем один из алгоритмов перерасчета нормалей, согласно которому программа будет  направления этих самых нормалей определять. Разбирать отличия одного от другого я не буду, т.к. это выходит за рамки данной статьи, достаточно того что в открывшемся окне имеется чекбокс preview, активировав который можно посмотреть результат выбранного алгоритма не применяя его (помним о том, что отменить примененную операцию в MeshLab нельзя). Мне отлично подошел четвертый, описанный неким Nelson Max, о чем он написал внушительную бумагу и попросил сообщать в случае использования алгоритма для своих нужд (что и делает программный пакет MeshLab).

результат упрощения вдвое и коррекции нормалей
результат упрощения вдвое и коррекции нормалей

Полученный в итоге файл весит 84.8 мб от изначальных 179мб, визуальных отличий между итогом и оригиналом мною не замечено.

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

Вот что у меня “наупрощалось” в результате повторения описанных шагов несколько раз.

сравнения результатов многократного применения операции упрощения
сравнения результатов многократного применения операции упрощения

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

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

 

Комментарии закрыты.