Процесс создания игровой 3D модели Hard Surface

426c43ac53d981514257027584a43ad2.jpg

Глава 1. Вступление

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

Небольшое отступление, я не буду рассказывать тут как правильно моделировать, или раскрашивать модель, объяснять те или иные решения по дизайну и сетке и т.п. Так же тут не будет информации по анимации, риггинге и т.п. Для этого есть специализированные статьи, и когда будет необходимо, я буду ссылаться на это. Эта статья рассчитана больше для на начинающих, тех кто уже познал основы моделирования, но не особо понимает как выглядят все ступени создания игровой модели. Тут будет много информации, иногда она будет не полной, но это будет толчком в нужном направлении, чтобы поискать более полную информацию и поглубже изучить определённые темы. Здесь я расскажу о конкретно моём общем процессе создание модели. Я не претендую на истину в последней инстанции, это то как именно я делаю, то что я наработал за несколько лет работы. Есть десятки других способов делать всё что я тут описываю, и делать быстрее, но база у всех одна, отличаются лишь методы, программы и т.п. Это довольно долгий способ, но универсальный, подходит как для простых моделей, так и для сложных, с минимальными проблемами в процессе. После практики, по скорости будет конечно немного уступать другим, но не сильно, на эту модель ушло 1.5–2 недели, включая разработку дизайна. Тут в основном будет только техническая часть (или как это лучше назвать), проще говоря, что, как и где нажать чтобы получился определённый результат, и за что отвечают определённые кнопки, функции, определения и т.п. Буду стараться объяснять всё подробно. И да, я никогда не писал подобные статьи, это моя первая работа и думаю что последняя, просто был некий порыв написать это. Что-то вроде благодарности, за то что я в своё время учился на таких-же статьях, как на этом сайте, так и на десятке других. И так как учился я в основном на обрывках информации, тут я решил улучшить несколько старых техник и максимально всё собрать вместе. Из-за такого обучения терминология у меня может хромать, хоть и понятна. Так что заранее извиняюсь если будет некомфортно вместо «текстурирование» читать «раскрашивание» и т.п. вещи. И ещё, если с названием «Рис» есть знак »+», то его можно приблизить.

Программы которые я использую — 3ds Max 2017, Substance Painter, Substance Designer, Adobe Photoshop, UVLayout, xNormal и Marmoset Toolbag, хотя последнюю я рассматривать не буду, там лишь будет просмотр (проверка) модели.

Я уже сделал Low Poly модель, прикинул дизайн, и пожалуй с этого момента и начнём. Вышло примерно так (Рис 1). Далее немного изменю, добавлю пару деталей.

Рис 1Рис 1

Далее, я сделал Hight Poly модель (она нужна для создания карт дополнительной детализации), хотя можно и наоборот, кому как удобнее, но я в начале делаю Low poly, чтобы потом не подгонять части друг к другу. Собственно получилось так (Рис 2).

Рис 2Рис 2

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

Потом я начал готовить Low Poly модель для развёртки, настроил каждую деталь (их вышло около 60), сделал группы сглаживания с прицелом ну будущую UV развёртку, чтобы швы на развёртке приходились как раз на границу между группами сглаживания, так швы будут практически незаметны. Если же делать так чтобы на границе не было шва, то при запекании карты нормалей, часто может возникнуть подобная проблема. (Рис 3). И это не самый худший вариант.

Рис 3Рис 3

Но тут ещё нужно думать о оптимизации. Дело в том, что на развёртке, в том месте где идёт шов, вершины дублируются на обе стороны, что будет давать дополнительную нагрузку на ПК. Попробую нарисовать как это примерно работает (Рис 4).

Рис 4Рис 4

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

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

Да и перед тем как делать развёртку, я на всякий случай делаю сброс параметров размера модели и нормалей. Я не программист, и записал свои действия в программе в скрипт, который сохранил, и любой в теории может его скопировать, вставить в программу и воссоздать его. Иногда, правда, он не срабатывает, потому что макс немного глючный (у меня 2017), тогда нужно сделать в ручную. Постараюсь максимально просто описать что нужно сделать и как это работает. Выделяем все полигоны в модели, ищем кнопку «Flip», жмём на неё, полигоны вывернуться. На деталь накидываем модификатор «EditNormals», переходим в модификатор, выделяем всё «Ctrl+A», ищем кнопку «reset» тем самым закрепив нормали. Тут можно либо сделать конвертацию в Edit Poly, либо правой кнопкой по модификатору и нажать на Collapse to. Это можно и не делать сейчас, но я делаю на всякий случай. Далее переходим на вкладку «Utilites» (Рис 5)

Рис 5Рис 5

Ищем там кнопку «Reset XForm» Жмём «Reset Selection», далее жмём правой кнопкой мыши на модели, и жмём Convert to Editable poly. И всё это с момента выворачивания полигонов нужно проделать ещё раз, чтобы обратно вывернуть полигоны, и зафиксировать всё. Я долго искал способ справиться с проблемами макса, и это самый лучший способ который я смог придумать, на тот момент никто из тех с кем я общался не знал как решить эту проблему, точнее она решалась, но всегда по разному, то есть не было 100% рабочего способа, да и способы эти были мягко говоря извращёнными (хотя мои способы тоже так можно назвать). В целом это и есть описание скрипта. Сам скрипт чуть ниже. Чтобы добавить его себе, нужно на вкладке «Utilites» найти MAXSсript, нажать на New Sсript. Вставить весь скрипт в открывшееся окно, выделить весь текст, и просто перетащить его на Main Toolbar — это там где кнопки привязок, слоёв, выделения перемещения и т.п. Появиться кнопка, её можно немного настроить, через правую копку мыши «Edit Bottom Appearance». Всё, теперь при выделении детали, можно нажать на появившуюся кнопку, и скрипт по идее должен сработать, но как я и говорил, не всегда он работает. Ещё, если в модели больше 100000 полигонов, эту цифру в скрипте можно изменить, я добавил 100000 так как это максимальное количество полигонов которое я когда либо использовал для Low Poly. К слову, скрипт в основном был создан для борьбы с импортом моделей из формата .OBJ. После импорта, было невозможно изменить группы сглаживания, скрипт решает как эту проблему, так и множество других, связанных с багами макса.

Вот и сам скрипт:

(
subobjectLevel = 4
actionMan.executeAction 0 "40021"
$.EditablePoly.SetSelection #Face #{1..100000}
$.EditablePoly.flipNormals 1
modPanel.addModToSelection (Edit_Normals ()) ui:on
actionMan.executeAction 0 "40021"
$.modifiers[#Edit_Normals].EditNormalsMod.SetSelection #{1..100000}
$.modifiers[#Edit_Normals].EditNormalsMod.Reset ()
modPanel.addModToSelection (XForm ()) ui:on
macros.run "Modifier Stack" "Convert_to_Poly"
subobjectLevel = 4
actionMan.executeAction 0 "40021"
$.EditablePoly.SetSelection #Face #{1..100000}
$.EditablePoly.flipNormals 1
modPanel.addModToSelection (Edit_Normals ()) ui:on
actionMan.executeAction 0 "40021"
$.modifiers[#Edit_Normals].EditNormalsMod.SetSelection #{1..100000}
$.modifiers[#Edit_Normals].EditNormalsMod.Reset ()
macros.run "Modifier Stack" "Convert_to_Poly"
modPanel.addModToSelection (XForm ()) ui:on
macros.run "Modifier Stack" "Convert_to_Poly"
clearSelection()
)

Глава 2. Создание развёртки

Развёртку я делаю в программе UVLayout. Для развёртки я удаляю те части которые повторяются (позже более подробно опишу это), после подготовки модели к покраске, я всё снова размножу. Чтобы импортировать туда модель, использую плагин UVPipe для 3Ds Max, так гораздо проще, без ручного экспорта/импорта модели. Помимо всего прочего, при создании развёртки обязательно нужно учитывать расстояние между островками на UV, так как в будущем мы будем делать Padding (отступ), чтобы текстуры слегка выходили за свои границы, впрочем позже поясню для чего это всё, но для развёртки размером в 4К, достаточно отступа примерно в 20 пикселей. Вот что вышло у меня. (Рис 6+).

Рис 6Рис 6

Я всегда оставляю на развёртке немного свободного места (но без энтузиазма), чтобы потом, если понадобиться, добавить пару небольших деталей, и как позже выясниться, это место ещё пригодиться. Да, да, я знаю что развёртка слабовата, можно было на 15–20% сильнее всё ужать, но мне и этого хватает, а вообще по хорошему нужно максимально практично использовать место на UV. После автоматической сборки, лучше руками всё подкорректировать (если нужно). И масштабировать нужно не отдельными островками, а искать островки от какой либо детали, и уже их все вместе масштабировать, иначе будет неестественно смотреться. В общем на этом этапе, уже нужно знать хотя бы примерно, как будет выглядеть модель, где какие текстуры будут, хотя бы в общих чертах, чтобы на основе этого планировать развёртку.

После создания UV, нужно просто нажать на Send, и в максе на каждую часть модели наложится модификатор «UVLayout UV’s» (Рис 7+), после этого нужно просто конвертировать модель в Edit Poly, или же нажать правой кнопкой на модификатор и выбрать Collapse To. После, чтобы проверить можно наложить на все части модели модификатор Unwrap UVW, открыть редактор и увидеть, что всё нормально (Рис 8+), после этого можно как удалить модификатор Unwrap UVW, так и сделать тоже что и с прошлым. Я конвертирую, на всякий случай, мало ли.

Рис 7Рис 7Рис 8Рис 8

А если нет плагина, то из 3Ds Max нужно экспортировать модель в формате OBJ. с настройками как на (Рис 14). Импортировать её в UVLayout, в настройках загрузки переключить UVs на New если стоит Edit. После работы сохранить модель можно в тот же OBJ. файл и импортировать обратно в 3Ds Max, после чего использовать на модели скрипт, который я описал выше, и по новой назначить группы сглаживания, так как они часто слетают, точнее они остаются такими же как и были, но если попробовать их поменять, то цифры изменяться, а результата не будет, если оставить всё как есть, не известно как это повлияет на дальнейшую работу.

Глава 3. Подготовка к запеканию текстур

Далее буду запекать карты Normal, Curvature и Ambient Oclusion. С одной фишкой, я много экспериментировал в своё время, и придумал один способ, как можно качественно запечь много объектов за минимальное время с хорошим результатом. Возможно сейчас есть способы и лучше, в других программах, с другим подходом, но я годами пользовался этим способом, и мне легче делать так. Если есть что-то проще, быстрее и качественнее, прошу поделиться в комментариях, надо будет изучить.

В общем, вот что я придумал, ну точнее когда я обучался, было несколько техник в интернете, я их совместил и усовершенствовал. Для начала я делю модель на несколько групп, и объединяю каждую в единый объект. На всякий случай поясню. У меня есть 10 частей Low Poly модели, я их объединяю в 1, тоже делаю и с Hight Poly и Cage, о последнем расскажу далее. Обычно это большие, средние и мелкие части, но есть и те, с которыми есть проблемы, они пекутся отдельно, далее поясню почему, и те которые не нужно печь вообще, так как у них нет рельефа, это просто плоскость без углов. Вот как выглядит разделение (Рис 9).

Рис 9Рис 9

Помимо Low и Hight poly, ещё нужна Cage модель. Cage, как ясно из названия это клетка для печки. Вообще можно печь без клетки, так даже проще, иногда страдает качество, но редко, когда отдельных частей не много, этот способ наверное лучший, но для больших моделей лучше делать пачкой. В общем кому интересно, в сети есть несколько статей о том как запекать сразу все детали. Я пробовал так, но качество оставляло желать лучшего. Cage модель делается из Low Poly модели. Есть специальный модификатор, который может сделать клетку, называется «Projection», но его не особо удобно настраивать, и это было бы дольше. Так же лучше использовать контрастное разделение цветов, чтобы перекрытия были лучше видны, я обычно использую белый для Low Poly, зелёный для Hight poly, и синий для Cage. Сейчас быстро попробую объяснить как работает Cage.

Cage, работает как ограничитель проекции. Если печь без неё, то лучи проецирования будут идти со всех сторон, и всё что попадёт под эти лучи, запечётся на Low Ploly модели, то есть если несколько деталей поставить рядом, и одна будет хотя бы по одной из осей как-то заслонять обзор нужной детали, то она тоже запечётся. Когда есть клетка, лучи проекции идут уже от неё, и печь можно сразу много деталей, без предварительной настройки расстояния. Надеюсь понятно объяснил и не запутал ещё больше. По сути Cage это Low poly модель, но больше, она должна располагаться так, чтобы в неё входили Low и Hight poly модель, так, чтобы за её границы ничего не вылезало. Важно, Cage не должна отличаться от Low poly модели ни по полигонам, ни по вершинам, иначе в программе будет ошибка. Создаю я Cage при помощи модификатора Push. Клонирую Low poly (лучше это делать командой Clone через правую кнопку мыши) и накладываю модификатор Push, расширяю его так, чтобы хотя бы одна часть модели полностью была закрыта. Как правило и другие части будут практически закрыты, именно для этого я делю модель на примерно равные по габаритам части. Теперь нужно лишь через правую кнопку мыши по модификатору сделать «Collapse To», примерно так выглядит у меня 1 итерация модификатора (Рис 10).

Рис 10Рис 10

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

Рис 11Рис 11

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

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

Рис 12Рис 12Рис 13Рис 13

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

Я экспортирую обычно так, имя модели, затем Low, Hight или Cage, а потом цифра если нужно. Так никогда не запутаешься что к чему.

Пример:

Electric_Low_1

Electric_Hight_1

Electric_Cage_1

Назвали все части, и далее экспортируем их, я делаю это с такими настройками, (Рис 14).

Рис 14Рис 14

Глава 4. Запекание текстур

Пеку я в программе xNormal, я много где пробовал печь, и мой выбор пал на эту программу. Я не говорю что она лучшая, но меня она устраивает на все 100%. Для тех кто не пробовал печь тут, опишу как запекать карты в xNormal. В целом всё, просто, на вкладку Hight definition meshes перетаскиваем Hight poly модель, а в Low definition meshes — Low Poly модель что логично. Чтобы добавить Cage, нужно нажать правой кнопкой по Low poly модели, выбрать пункт Browse external cage file и выбрать нашу клетку. Далее на вкладке Baking options нужно выбрать папку, куда будет сохраняться рендер, выставить размер карт, выбрать сами карты, я запекаю только Normal, AO (Ambien Occlusion) и Curvature, (карты Normal и Curvature я пеку одновременно и отдельно от Ambien Occlusion), остальные пока не нужны. Эти карты лучше запекать в формате .TGA. Нужно это для того, чтобы сохранился альфа канал, а он нужен для того, чтобы можно было собрать полную карту в Substance Designer через вычитание альфа канала без лишних манипуляций. И при запекании нужно ставить хотя бы небольшой padding (отступ), Edge padding можно выставить на 2–4 для 4К текстур, в принципе это не обязательно, можно и на 20 ставить, но в дальнейшем может понадобиться альфа канал без отступа, и взять его можно будет от сюда. А вообще отступ подойдёт и минимальный, для дальнейшей работы в Substance Painter, нормальный отступ нужен для дальнейшей работы в самом движке игры для mip mapping (объяснять что это довольно долго, потому как будут затронуты ещё несколько тем, так что лучше почитайте тематические статьи), и его мы добавим при экспорте карт уже из Substance Painter. Antialising ставим на максимум (4х). В целом всё, с Cage моделью можно запекать нажав на — Generate Map. К слову, если вылезет ошибка связанная с Cage файлом, нужно проверить его и Low Poly модель на предмет двойных вершин, вывернутых полигонов, использовать скрипт от багов. И заново экспортировать, и Cage и Low Poly. Но если Cage не используется, то нужно ещё зайти на вкладку Tools, нажать на Ray distance calculator, нажимаем на Go, ждём секунд 10–15, жмём на Stop, потом на Copy results и после этого уже можно запускать Generate Map.

И так, карты Normal и Curvature запечены и готовы к работе, всё прошло без осложнений, к слову модель я проверяю в программе Marmoset Toolbag. Но, я решил показать что будет, если Cage пересечёт основную модель (Рис 15, 16).

Рис 15Рис 15Рис 16Рис 16

А вот та проблемная деталь, запечённая без Cage, есть пара незаметных проблем, но в целом очень неплохой результат (Рис 17, 18).

Рис 17Рис 17Рис 18Рис 18

И быстренько покажу как объединить карты в Substance Designer. Далее я разберу всё более подробно, когда буду экспортировать карты из Substance Painter, а сейчас просто покажу пример. И благодаря тому что я запекал текстуры в формате TGA. ничего в программе не нужно будет настраивать, просто закинуть текстуры, соединить и сохранить.

Нам понадобиться создать новый проект File — New Substance. Тут можно ничего не трогать и нажать на OK. Если что-то создалось на сетке, то это можно удалить. Далее перетягиваем на сетку все текстуры одной карты, то есть, к примеру у меня вышло 2 карты по 4 текстуры на карту, вот как раз эти 4 текстуры одной карты и нужно перетащить на сетку. Далее создаём Node — Blend, Правой кнопкой мыши на сетке Add Node — Blend. Создаём столько, сколько нужно, и Node — output. Тянем в 2 верхних канала Blend две текстуры, получиться 1 смешанная текстура, так же делаем и с другими двумя. После, то что у нас получилось соединяем так же в следующей Node — Blend, а её уже тянем в Node — output и выделив её двойным щелчком мыши, сохраняем. В целом это всё, так же делаем с другими картами если нужно. На всякий случай вот схема, как это выглядит (Рис 19+).

Рис 19Рис 19

Пришло время запекать AO (Ambient occlusion), тут будет чуть сложнее чем с прошлыми картами. Я экспериментировал, и придумал один способ, но по любому это уже кто-то до меня придумал, а я просто решил не искать информацию и методом проб и ошибок вывел его. Вот что у меня вышло. В общем постараюсь описать подробно, но некоторые вещи возможно опущу. Если по простому, то карта печётся в целом так-же как и Normal. При запечке, создаётся источник света, освещает модель и на основе этого создаётся самозатенение, ну по крайней мере когда я изучал эту тему понял именно так. Карта так-же печётся с Hight poly на Low poly модель, если понять принцип, то будет гораздо проще. Запекаю я эту карту так-же в программе xNormal. С параметрами карты можно поиграть и посмотреть результат, у меня они стоят почти по стандарту, я лишь изменил рендер на OpenRL map renderer, с ним результат мягче и быстрее, количество лучей поставил больше и изменил немного угол, ещё убрал галку с Allow 100% occlusion, и выставил разрешение меньше итогового, чтобы тестовые результаты были быстрее (Рис 20+).

Рис 20Рис 20

Важно перед этим шагом, уже знать как будет выглядеть итоговая модель, так как сейчас нужно будет размножить те детали что мы удаляли перед развёрткой, сейчас самое время хорошенько подумать что и где будет и расставить всё по местам, потом это будет сложнее. Я сделал 2 варианта файлов 3Ds max, в 1 я оставил модель без повторяющихся деталей, а во 2 файле я копировал всё что хотел, важно копировать Low и Hight poly части вместе, я их просто выделяю вместе и копирую сразу вместе, так будет меньше проблем в будущем. Из 1 файла, я беру Low poly модель, а из 2 файла High poly именно с неё я буду запекать, так не будет ненужных артефактов. Выглядит как-то так (Рис 21). Естественно Hight Poly должна быть в тех же координатах что и Low Poly, собственно как и при любой печке, а это просто как пример как они у меня выглядят, чтобы не запутаться. Важно, эту карту печь лучше в формате .PNG, далее распишу проблему связанную с этим, возможно эта проблема возникает у единиц, но всё же будет полезно почитать, если будет та-же проблема. Пояснение в конце этой части.

Рис 21Рис 21

Вышло вот так (Рис 22), да не особо хорошо, но, это будет основой, на которую я буду накладывать отдельные части.

Рис 22Рис 22

После я просто брал те части моделей, которые хотел лучше пропечь, и выпекал отдельно. Вообще после запечки основной модели есть 3 варианта. 1 — оставить как есть (многие так и делают), 2 — при определённом опыте, можно самому всё доработать в фотошопе, раньше я так и делал, но решил эту модель пропечь как нужно. И 3 вариант — запечь частями, потом соединить всё в фотошопе. Короче говоря, я запёк несколько деталей отдельно, не буду показывать какие и как, так как это только запутает. Главное помнить, что источник света освещает Hight poly модель, и тень от неё отпечатывается на Low Poly, примерно так эта карта и печётся, имея эту информацию, можно примерно рассчитать какие детали нужно пропечь лучше, а какие вообще лучше не пропекать. Как пример могу показать 1 часть модели (Рис 23).

Рис 23Рис 23

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

Рис 24Рис 24

Уже лучше, но всё равно не то, однако, более менее нормальный результат получиться после обработки в фотошопе (да, чтобы получить нормальный результат без него не обойтись).

В конце главы расскажу как я собираю части текстур в одну в фотошопе.

После того как карта готова и собрана, лучше сделать очень тёмные места посветлей, усреднить их, я делаю так чтобы в целом цвет был примерно одинаковый, но естественно там где была зона сильного затемнения, я делаю всё же темнее чем другие места. Далее, я удалил артефакты, иногда появляются проблемные места, тень от некоторых частей модели, которая не туда попала, или пересечение нескольких деталей может дать тоже плохой эффект, их я правил вручную. Потом сделал размытие по Гауссу, на 3–4 единицы, тут можно поиграть с параметрами, мне хватило 3 единиц. По итогу, вот какой получился конечный результат. Карта и то как это выглядит на модели (Рис 25 и 26). Слева с включённой картой, справа выключена. Да, сейчас это не сильно заметно, но карта важна для текстурирования, да и в сочетании с другими картами она усиливает реалистичность модели.

Рис 25Рис 25Рис 26Рис 26

Здесь я поделюсь парой проблем которые возникли при запечке карты AO. Дело в том, что после того как я всё подготовил и импортировал модель в Substance Painter, я увидел на границах швов такую вот проблему (Рис 27).

Рис 27Рис 27

Я потратил часов 5 чтобы решить проблему. И даже когда я перепёк все части со стандартным рендером, вместо OpenRL (да в первый раз я забыл сменить настройки с печки Normal карты и даже отступ я случайно убрал на 0 и не заметил), всё равно проблема оставалась. Тогда я решил найти, как можно сделать тот же отступ в фотошопе, но за час поисков в сети ничего не нашёл, и почти опустил руки, но вспомнил мотивирующие слова из одного мультфильма (есть проблема, реши её!), да я часто вспоминаю эту фразу, особенно когда хочу сдаться. В общем пришлось самому методом проб и ошибок решать проблему, и я её всё же решил. Я пока не особо уверен в этом способе, он сработал тут, но в другой ситуации возможно не сработает, всё нужно ещё тестировать. Но лучшего я пока не придумал. Если у вас есть решение этой проблемы, жду в комментариях. Чтобы сделать Padding в фотошопе, я сделал так, перешёл в альфа канал (Рис 28+).

Рис 28Рис 28

Если по простому, альфа канал это по сути маска, по которой идёт наложение текстуры, там где белое, текстура проходит, чёрная — нет, в разных программах отличается пропуск текстур, в некоторых наоборот чёрный цвет пропускает, а белый — нет. Так вот, я выделил по цвету всю маску, то есть белый цвет (Рис 29+).

Рис 29Рис 29

Далее я перешёл обратно в RGB канал (просто щёлкнуть левой кнопкой мыши по верхнему каналу RGB), и сделал границу на 20 пикселей (получается по 10 каждой стороны) (Рис 30+).

Рис 30Рис 30

И наконец то, что я нашёл методом проб и ошибок (Рис 31+).

Рис 31Рис 31

Там я ставлю значение радиуса также на 20 пикселей, и всё, отступ на 10 пикселей готов (Рис 32+).

Рис 32Рис 32

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

А моя проблема была как раз в альфа канале, так как раньше я пёк карту в .PNG формате, и почти не обрабатывал её, я не сразу заметил это. И дошёл я до этого, когда на той карте без отступа, сделал уже большой padding и всё равно ничего не работало, я решил просто залить часть границы чёрным цветом, очень сильно выйдя за границы основной текстуры, чтобы точно видеть сработает или нет. И нет, белые линии всё ещё были видны. Но когда я изменил формат изображения с TGA на PNG, всё стало нормально. Я несколько раз всё перепроверил и действительно всё было из-за альфа канала. Из этого можно вывести небольшой итог, что печь лучше хотя бы с небольшим отступом, если печь в .TGA формате, так альфа канал тоже будет с отступом, и проблем не будет.

Да, и вот ещё одна фишка, которая мне помогает. Это касается сбора текстуры в фотошопе. Если на основную текстуру нужно добавить множество небольших частей идеально ровно. Она не то чтобы очень уж полезна (хотя для огромного текстурного атласа вполне себе полезна), но если важна максимальная точность и скорость, проще делать так. Берём небольшую часть текстуры, которую нужно добавить в основную, и как раньше, выделяем альфа канал по белому цвету, переключаемся на RGB вырезаем всё, и уже можно было бы вставить это в основную текстуру, но скопируется это не точно, и нужно будет ставить вручную на нужное место. Чтобы скопировать всё точно и не подгонять в нужное место, я на альфа канале делаю по углам очень маленькие белые точки, перед выделением по цвету, с ними ставиться всё ровно (Рис 33+), а потом просто можно закрасить их фоновым цветом.

Рис 33Рис 33

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

Глава 5. Подготовка модели к покраске

Теперь последний шаг перед покраской. Тут всё довольно просто. Нужно разделить модель на части по Material ID, чтобы в (Substance Painter далее буду называть его SP) было проще работать. Некоторые говорят что лучше делать покраску без тех частей, которые нужно копировать, но чтобы видеть всю картину я буду делать покраску на полной модели. Для этого, в начале нужно объединить все части модели в 1, по другому я не пробовал, но думаю если и можно оставить как есть, то это будет не очень удобно, как минимум применять Material ID. Потом нужно решить, как и на сколько частей будет разделена модель. Это делается для того чтобы в SP работать над отдельными частями скрывая другие части модели, то есть чтобы ничего не мешало красить модель с разных сторон. Конечно можно красить и по UV без разделения на Material ID, и так даже лучше делать если модель небольшая, и не анимируется, но для относительно больших моделей и особенно тех что будут анимироваться лучше делить. Конечно выбирать вам, как удобнее, для меня разделение удобнее всего, хоть с разделением и приходит потом головная боль, которую я конечно решил, но если не знать способа объединения текстур, то головная боль будет обеспечена. И так, чтобы присвоить определённой части модели свою Material ID, в 3Ds Max нужно у модели на уровне элементов или полигонов найти пункт — Polygons — Material IDs, выделить нужные части и назначить им группу, лучше делать это так, чтобы их было чётное число, далее в Substance Designer будет проще работать. Потом нужно создать мульти материал в Slate Material Editor. Созда

© Habrahabr.ru