Правильная UV развертка, ошибки и пути их решения. 

Титульный рисунок


Приветствуем, на связи команда MFG!

В этой статье расскажем о правильной UV развёртке для тех, кто совсем недавно начал знакомиться с 3D моделированием. Неважно, будете ли Вы создавать модели для игр или исключительно для рендеров — без UV развёртки Вы банально не сможете её затекстурировать. В самом начале у новичков могут быть десятки вопросов. Как сделать развёртку правильно? Какие ошибки могут возникнуть и как их не допускать? На все эти и другие вопросы мы постараемся ответить по ходу этой статьи.

Давайте сперва попробуем разобраться, что представляет собой развёртка в самом общем виде. Самым простым и понятным объяснением будет следующее изображение:

Рисунок1.png

Развертка — это перенос поверхности объёмного объекта на плоскость (в виде текстуры).

Далее в статье мы будем рассматривать процесс развёртки с использованием конкретного софта, а именно Blender. Выберем стандартный куб, выделим его, перейдём во вкладку UV Editing. Теперь перейдём в режим редактирования этого куба и слева мы увидим его развёртку. Она в точности напоминает первое изображение.

Рисунок2.png

Разумеется, куб — это самый примитивный объект, на котором мы просто пытаемся показать общие принципы развертки. Развёртка некоторых элементов внутри модели может быть куда сложнее, а запакованная модель из десятков мешей может и вовсе выглядеть устрашающее, если не знать, что это такое. Вот Вам, к примеру развёртка Сюзанны:

Рисунок3.png

3D модели состоят из вертексов, эджей и полигонов. UV развёртка также содержит все эти элементы, но только на плоскости. К сожалению, нельзя просто взять плоское и натянуть на объемное. Попробуйте обернуть бумагой что-то круглое — бумага просто-напросто помнётся при обёртке. Чтобы этого избежать, модель должна быть нарезана на части по швам. Для нанесения швов в любом 3D пакете, включая Blender есть специальный функционал.

Рассмотрим конкретный приме. Добавим в сцену куб и в режиме редактирования изменим его и придайте ему форму доски.

Рисунок4.png

Теперь выделим всё клавишей A, после нажмем правую кнопку мыши и выберем пункт Mark Seam (пометить швом).

Рисунок5.png

Вы заметите, как все эджи теперь подсвечиваются красным цветом.

Рисунок6.png

Теперь нажмем клавишу U и выберем первый пункт (либо же можно дважды нажать U).

Рисунок7.png

И теперь Вы увидите, что каждый фейс стал отдельной частью на развёртке.

Рисунок8.png

Каждая отдельная взятая часть называется островами или шеллами. Теперь добавим нашему объекту материал и перейдём во вкладку Shading, кликнем сверху «New». Появится обычная структура нодов материала. Теперь найдем в интернете текстуру дерева, разрешение при этом не имеет значения, главное чтобы соотношения сторон были одинаковыми. Теперь добавим эту текстуру, нажмём Shift+A, нажмём «Search» и впишем «Image», выберем ноду «Image Texture». В самой ноде нажмём на символ папки и выберите только что скаченную текстуру. Не забудьте в конце подключить выход ноды из Color в Base Color. Результат должен получится примерно такой.

Рисунок9.png

Теперь вернемся во вкладку с развёрткой, переключим клавишей Z вид вьюпорта с Solid на Material Preview и попробуем взаимодействовать с каждым отдельным шеллом. Кнопки здесь всё те же, G – для перемещения, R — для поворота, S — для масштабирования Вы увидите как меняется текстура на самом объекте. Все действия, что мы сейчас проделали были очень важны для общего понимания того, как именно работает развертка.

Развёртку условно можно поделить на два типа — тайловая и уникальная. И тут различия именно в маппинге — способе расположения шеллов на развёртке. Первый тип применяется чаще всего для крупных объектов, чаще для зданий. А вот для оружия, техники и прочих пропсов применяется уникальный маппинг. Но что это значит? Разберём этот вопрос подробнее.

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

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

Теперь ответим на следующий вопрос: Какой параметр отвечает за качество (чёткость) текстуры? Очевидный ответ будет - разрешение, но не всё так просто. За чёткость текстуры отвечает параметр, который называется текселем. Понятие тексель, означает количество пикселей текстуры на единицу пространства. Давайте вернёмся к нашей «доске» и немного поменяем ноды.

Рисунок10.png

В ноде Checker Texture можете увеличить значение Scale, если Вы вдруг не видите узор в виде шахматной доски на объекте. Теперь попробуйте уменьшить любой из шеллов на развёртке и посмотреть к чему это приведёт.

Рисунок11.png

В зависимости от того, какое разрешение текстуры Вы будете использовать для вашей модели, будет разный тексель. В качестве примера взгляните на изображение ниже. Визуально одинаковый объект с чекером разного разрешения будет давать разный результат.

Рисунок12.png

Значение текселя можно рассчитать с помощью аддонов Texel Density Checker и TexTools. Мы бы порекомендовали использовать TexTools, поскольку кроме определения размера текселя, в нём есть дополнительный функционал по работе с развёрткой.

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

Рисунок13.png

Здесь видно, что каждый отдельный элемент окрашен в разные цвета. Каждый цвет - это будущий текстурный сэт. Текстурными сэтами принято называть набор PBR текстур. Именно те текстуры, которые используются в игровых моделях, а именно Base Color, Roughness, Metallic, Normal Map и т.д. Делается это для того, чтобы достичь примерно одного значения текселя на всю модель. Иначе может получиться так, что даже в одну единственную текстуру 8К всё не уместиться.

Начнём с красной кабины, по своей сути это почти куб. Но если применить на этот меш Auto Shooth, то Вы заметите, что все эджи кроме одного остались острыми. Это первое правило UV развёртки — швы наносятся на Хард Эджи. Заходим в режим редактирования, помечаем все такие эджи как Hard Edge. Это может потребоваться в последующем, если Вы вдруг захотите объединить несколько мешей в один, но у них в настройках Auto Smooth будет стоять разное значение угла. Сделать это довольно просто. В верхнем меню выбираем Select и далее Select Sharp Edges. Далее выбираем в нижнем углу значение угла, которое соответствует углу сглаживания Auto Smooth.

Рисунок14.png

Далее жмём правую кнопку и сначала выбираем Mark Sharp, чтобы пометить эджи как острые, а потом Mark Seam, чтобы отметить швы. После этих манипуляций дважды жмём U и получаем развёртку.

Рисунок15.png

В угловом меню можем настроить параметр Margin - отступ отдельных шеллов друг от друга, который обязательно должен быть. Во всех современных 3D движках есть технология называемая MIP mapping. Чем дальше будет находиться модель от взгляда игрока, тем меньшее разрешение текстуры будет применяться. Это происходит автоматически. И если в развёртке модели будут отсутствовать отступы, это приведёт к нежелательным визуальным артефактам.

Теперь перейдём к колёсам.

Рисунок16.png

Хоть их и шесть, как на изображении выше, но нам совершенно не обязательно разворачивать их все. Это приведёт к тому, что придётся увеличивать разрешение текстуры, чтобы получить требуемый тексель. Именно поэтому мы также применили модификатор Mirror на каждое отдельное колесо. В итоге после развёртки, запекания и текстурирования получим текстуру для колеса, которую можно будет применить для каждого из них.

Возьмём передние колёса, отключим видимость модификатора и перейдём в режим редактирования.

Рисунок17.png

Колесо имеет форму цилиндра. Отметив на развёртке все хард эджи и развернув этот элемент мы получим следующую картину:

Рисунок18.png

Стенки цилиндров ВСЕГДА разрезаются. Нам нужно добавить дополнительный шов. В данном случае это колесо, которое может крутиться, но я всё равно добавил его внизу. Обычно такие швы стараются прятать, нанося их в тех частях модели, которая больше всего будет скрыта от взгляда наблюдателя.

Рисунок19.png

Помимо внешней стенки, есть ещё одно место, в которое стоит добавить шов. Это внутренняя сторона ближе к центру. На изображении ниже, Вы можете увидеть, куда мы нанесли его.

Рисунок20.png

Теперь можно повторно нажать U, результат будет совершенно иной.

Рисунок21.png

Вы можете заметить, что осталось ещё одно кольцо. В случае с боковой частью колеса это может быть оправдано, поскольку можно будет проще нанести особую текстуру. Но исключительно в обучающих целях давайте добавим ещё один шов и попробуем развернуть.

Рисунок22.png

Иии...ничего не изменилось, почему? Это связанно с особенностями алгоритмов. Тут на помощь придёт аддон TexTools, он сильно облегчает работу с развёрткой. После его установки в окне развёртки в N-панели будет вкладка аддона со всеми опциями. Разверните вкладку UV Layout и найдите кнопку Rectify. Теперь выделите клавишей L нужный остров и нажмите на эту кнопку. Кольцо превратилось в полоску.

Рисунок23.png

Упакуем развёртку, то есть доверимся алгоритмам, которые расположат наши шеллы в пределах одного квадрата максимально компактным образом. Выделяем всё, что есть на развёртке. Далее в верхнем меню в пункте UV ищем «Pack Island». В меню, которое всплывёт нас интересуют только два пункта. Первый это Rotation Method, там нужно выставить Cardinal, это будет вращать шеллы только с шагом в 90 градусов. Второй - Margin, это индивидуальные отступы каждого шелла.

Рисунок24.png

В результате получаем следующий результат.

Рисунок25.png

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

Вернёмся к понятию текселя. Тексель — это величина, обозначающая плотность пикселей текстуры на единицу пространства. Как мы можем измерить его? В аддоне TexTools есть функционал, позволяющий определить это значение. Убедимся, что к мешу применён Scale. Без этого, значения будут некорректными. Во вкладке UV Layout в самом низу есть блок, отвечающий за функции определения текселя. Необходимо выбрать разрешения предполагаемой текстуры.

Рисунок26.png

К примеру это будет 1024. И после нажимаем клавишу Pick, чтобы узнать значение. Сверху в этом блоке появится цифра. В нашем случае это 422. Но что она нам даёт? В чём измеряется тексель? Как определить, какой тексель нам нужен? В этом аддоне значения показываются в количестве пикселей на метр(px/m), иногда ещё они могут указываться в пиксель на сантиметр(px/cm) и в таком случае значение было бы равно 4.22. Здесь не важно, в каких именно единицах Вы будете измерять тексель, ведь знания базовой математики легко позволят Вам перевести метры в сантиметры и наоборот. Но давайте вернёмся к вопросу о том, какой тексель нужно подбирать? Главным фактором будет то, на каком именно расстоянии наблюдатель будет видеть модель.

Рисунок27.png

На изображении выше Вы можете увидеть распределение качества текстур в зависимости от удалённости взгляда игрока. Все значения указаны в px/cm. Удалённые объекты имеют средний тексель ~1.26, те, что поближе уже ~2.56, и самые близкие ~5,12. Это усреднённые цифры, и к примеру в шутерах от первого лица величина текселя оружия в руках главного героя может быть 10,24 px/cm и выше. Вообще эта величина является частью технического задания при создании моделей, но логика определения всегда примерно одна.

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

Вернёмся к нашему грузовику. Займёмся его рамной частью.

Рисунок28.png

Во вьюпорте, в режиме Solid включим рандомное присваивание цвета каждому мешу. На этом примере разберём ещё один способ экономии свободного места на пространстве UV развёртки.

Условные бензобаки и часть рамы, которые на изображении можно определить по бежевому и голубоватому цвету имеют модификатор Mirror, скрыв видимость которого мы уменьшим количество мешей для развёртки. А вот центральные «балки» очень похожи друг на друга. И здесь есть одна важная хитрость. Они созданы путём дублирования не через Shift+D, а Alt+D. И таким образом получается, что они все зависимы от самого первого объекта. То есть создав развёртку для одного меша она будет применена для всех остальных.

Отчасти это можно назвать оверлапами (Overlaps). Если мы после всех манипуляций сделаем каждый экземпляр уникальным, то есть уберём эту самую зависимость и вернёмся к развёртке, то мы увидим, что на развёртке все острова как бы лежат друг на друге. Как Вы понимаете это сильно экономит нам свободное пространство. Если не углубляться сильно в детали, чем меньше свободного пространства на UV развёртке тем лучше. Это позволит получать более высокое значение текселя, а такжеиметь меньшее количество текстурных сетов. Все эти действия проделываются ради оптимизации размера текстур моделей. Хотя с каждым годом производительность компьютерного железа возрастает, но его возможности не безграничны.

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

Рисунок29.png

Далее представлены изображения, показывающие развёртку каждого отдельного элемента.

Рисунок30.png

Рисунок31.png

Рисунок32.png

Теперь это всё нужно упаковать. Выделим все меши, перейдём в режим редактирования.

Рисунок33.png

И что мы здесь видим? Вновь недопустимые пересечения. Но это лишь одна из проблем, которую мы можем решить упаковкой. Перед этим добавим чекер-текстуру в систему нод.

Рисунок34.png

Невооружённым глазом видно, что размер чекера разный. Нам хотелось бы, что он стал одинаковым. Для этого в режиме редактирования выделяем все меши, выделяем всё что есть на развёртке и в верхнем меню в пункте UV ищем «Average Island Scale»

Рисунок35.png

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

Рисунок36.png

И казалось бы, теперь мы готовы к упаковке. Но нет. Основная, вытянутая часть рамы слишком длинная, это приведёт к не самому оптимальному заполнению свободного пространства. Как мы можем решить эту проблему? Нанести шов в самое незаметное место этого меша. Самым логичным будет добавить Loop Cut на геометрии через Ctrl+R и нанести на него шов. Да, это нарушит главное правило того, что швы должны наносится на острые углы, ведь тут совсем плоская часть. Но это тоже метод оптимизации. Да, это приведёт к тому, что текстура может лечь не самым лучшим образом, но этот шов будет находиться в том месте, в котором наблюдатель практически не будет его видеть напрямую. И после повторной развёртки и переопределения размера получаем уже куда более приятную картину.

Рисунок37.png

Вот теперь то можно и упаковывать. Давайте рассмотрим альтернативный, более правильный способ упаковки. Нам понадобится аддон UV Packer. Его установка чуть сложнее, чем обычно, но не должна вызвать серьёзных трудностей. На сайте аддона есть простая и понятная инструкция. Давайте быстро разберём, какие именно инструменты имеются в N-панели этого аддона.

Рисунок38.png

Красным отмечен первый важный блок. Сперва идут два чекбокса. Первый чекбокс включен по-умолчанию. В данном случае все объекты будут упаковаться в рамках одной карты. Если же выключен, то каждый объект будет упакован отдельно. Но нам как раз таки нужен первый вариант. Второй чекбокс не активирован. Из его названия можно понять, что при его активации будут упаковываться только выделенные шеллы, нам это так же не нужно. Далее мы видим кнопки, в которых можем выбрать предполагаемое будущее разрешение и ниже padding, это же отступ шеллов друг от друга. Укажем разрешение 1024 и отступ 8. В зелёном блоке идёт тип упаковки, на выбор есть два: «Эффективный» и «Высокое качество». По личным наблюдениям разницы почти нет. Два следующих чекбокса отвечают за изменение масштаба шеллов и вращение. Изменять масштаб на не нужно, а вот вращать как раз таки нужно. Ниже укажем величину вращения 90 градусов. Если Вы играли в тетрис, то понимаете, что прямоугольные блоки идеально комбинируются только под углом 90, если угол будет другой, то это приведёт к массе проблем, как увеличению свободного пространства, так и к некоторым искажениям. Но всё это по большей части относиться к твердотельным. Ниже есть пункт, который касается количеста занимаемых тайлов, но это более продвинутая техника, которая касается темы UDIM, её мы не будем касаться в этой статье. Когда все пункты настроены и время нажать кнопку Pack.

Рисунок39.png

После этого видим в начале красного блока информацию по занятому пространству и затраченному времени на упаковку. И если второе значение нас не сильно интересует, то вот занятое свободное пространство важный параметр. При развёртке нужно стараться достигать максимально возможного значения занятого пространства. В нашем случае вышло ~58%. Идеально, когда это значение равно 70% или выше. Но всегда нужно искать баланс между количеством швов на развёртке и плотностью упаковки.

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

Ошибки которые могут возникнуть при развертке

1. Растяжки. Чтобы их увидеть, нужно воспользоваться опцией «Display Stretch». На скриншоте Вы видите где именно находится эта опция в Blender.

Рисунок40.png

Теперь визуально цветами мы можем увидеть растяжки. На примере всё залито синим цветом. И чем больше будут растяжки, тем ближе к красному цвету они будут становится. Можете вручную подвигать любую точку чтобы увидеть изменения цвета. Если на объекте будет чекер, на нём это также будет отражаться — он будет сильно искажён.

Рисунок41.png

Красный цвет, это максимальный предел искажения, который редко встречается на практике. Недопустимыми значениями чаще всего являются зелёный и жёлтый цвет. Голубой цвет вполне допустим. Небольшие искажения могут быть компенсированы алгоритмами наложения текстуры. А вот при тайловом текстурировании мельчайшее растяжение будет бросаться в глаза.

2. Пересечение шеллов. Это вполне понятная и очевидная проблема, которую легко исправить грамотной упаковкой. Для уникального маппинга это недопустимо. В статье мы уже упоминали, что между островами всегда должно быть расстояние. Это нужно для технологии Mip Mapping. Повторимся, эта технология понижает разрешение текстур в зависимости от взгляда наблюдателя. И если отступа не будет, или он будет недостаточным, это приведёт к визуальным артефактам. Вот вам небольшая шпаргалка, показывающая необходимое значение отступа в зависимости от разрешения текстуры.

3. Развёртка цилиндра и кольца. Стенки цилиндров всегда разрезаются минимум с одним швом, как впрочем и кольца. Это поможет сократить свободное занимаемое пространство и избавить от возможных искажений текстуры. Вот как пример. 4 одинаковых фигуры, сделанные из цилиндра. Если кольца не развернуть, то получаем 66% занятого пространства.

Рисунок43.png

А вот при развернутых в полоску кольцах получаем значение порядка 77%

Рисунок44.png

Если каждый остров крупнее, то и тексель больше. А как следствие этого и качество получаемой текстуры.

4. Харды и софты. Если после каких-либо манипуляций хард эдж станет софтом, то это может повлечь за собой целый ворох проблем, от банально некорректного шейдинга, до того, что запекаемая текстура будет совершенно некорректной. Минимальный угол, который можно считать хардом это 60 градусов. Но всегда есть исключения. Главное помните - если есть хард эдж, то на нём обязательно должен присутствовать шов. Остальные швы наносятся по ситуации в каждом конкретном случае.

В этой статье мы постарались максимально разобрать все основные моменты относящие к основам развёртки. Показали всё на примерах и обозначили ключевые термины, без которых невозможно стать профессионалом в сфере 3D. После того, когда приходит понимание того, как именно создаётся развёртка это станет очень простой рутиной. Но без этой рутины нельзя создать полноценную модель.
С Вами была команда MFG, до связи!