Запекаем карты нормалей в текстуру и ленивое текстурирование 3D модели через авторазвертку и запекание текстуры в Blender для игрового движка Unity3D

В данной статье описывается способ запекания карты нормалей в текстуру с одной 3D модели на другую 3D модель в случае, если была утеряна высокополигональная 3D модель, а на низкополигональной модели изменилась uv развертка. Во второй части статьи рассматривается простое создание uv развертки автоматически, без выделения швов на 3D модели, при помощи инструмента Smart UV Project в Blender для дальнейшего использования в игровых движках на примере Unity 3D.

Об описываемой в данной статье возможности запекания карт (дуффузных, нормалей, отражений, затенений и т.д.) в текстуру с одной модели на другую я упомянул в обзоре программы для цифровой скульптуры Sculptris от Pixologic.

Бывает, что у разработчиков игр и 3D художников возникают ситуации, когда для низкополигональной модели (low poly) осталась карта нормалей или текстура (диффузная карта) от высокополигональной 3D модели (high poly), однако uv развертка low poly модели и uv развертка, по которой была запечена карта нормалей, отличаются. Такое может случиться, если у вас потерялась high poly моделька (а вы по каким-то соображениям изменили развертку low poly 3D модели), но осталась low poly модель. Этот же способ отлично подойдет для запекания карты нормалей с существующей лоуполи модели на другую новую 3D модель или болванку персонажа, которые схожи своей геометрией. Данный способ позволяет избежать мытарства в GIMP’е с вырезанием кусков текстуры (карты нормалей и пр.) и перенесением их на новые карты другой 3D модели. В некоторых случаях, конечно, не обойтись без использования NDO painter и DDO Painter из набора Quixel SUITE или GIMP‘а, чтобы подправить получившиеся  перезапеченные карты, да и просто для того, чтобы добавить какие-то отличительные штрихи своей 3D модели. Также способ запекания карт с одной модели на другую (или запекание диффузной карты из наложенной в Blender’е текстуры на эту же 3D модель) в совокупности с автоматическим созданием uv развертки является отличным способом «ленивого» текстурирования.

Поскольку напрямую (через меню Bake) запечь с high poly модели на low poly 3D модель карту нормалей нет возможности, а запекание карты нормалей в карту нормалей невозможно, то выходом из ситуации является запекание карты нормалей с одной 3D модели на другую 3D модель, причем, какая развертка у обоих персонажей — абсолютно не важно.

Давайте разместим  на сцене 3D модели: с которой будем запекать карты и 3D модель, на которую будет производиться запекание.

uvdifferent

На рисунке показаны две модели с разными uv развертками.

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

Теперь давайте подготовим 3D модель-донора. Создайте материал 3D модели-донору, с которой будет запекаться карта нормалей, если он не был создан ранее. Назначьте модели-донору имеющуюся у вас карту нормалей в качестве текстуры (не в качестве карты нормалей, как обычно это делается).
materialtexturecreationaaigning

На рисунке показан процесс добавления материала и текстуры 3D модели-донору. В данном случае, в качестве текстуры (диффузной карты) используется карта нормалей.

Для того чтобы посмотреть назначенную 3D модели текстуру в одном из окон 3D вида, поместите курсор мыши (не 3D курсор) в окно 3D вида, в котором хотите увидеть затекстуренную модель, и нажмите сочетание клавиш Shift+Z, чтобы включить в окне 3D вида отображение шейдеров, полностью “отрендеренную” 3D модель.

shaded3dmodel

На рисунке показана визуализация 3D модели с использованием шейдеров Rendered (справа вверху), справа внизу 3D модель отображается с применением материалов (Material) слева вверху показано отображение 3D модели в режиме Solid и Wareframe, а слева внизу показана uv развертка целевой 3D модели, для которой будет запекаться карта нормалей в текстуру. Режимы отображения 3D модели вы можете переключить, если нажмете на иконке сферы, расположенной под каждым из окон 3D вида.

Чтобы открыть окно uv развертки в одном из окон 3D вида, выберите иконку пейзажа слева под желаемым окном для отображения uv развертки и выберите в открывшемся меню Типа Редактора (Editor Type) UV/Image Editor.

Также для успешного запекания карт необходимо изображение, в которое карты и будут запекаться. В меню создания нового изображения (New Image) введите имя и параметры изображения, в которое будет производиться запекание. После создания изображения фон uv плоскости зальется черным цветом.

Выберите 3D модель, на которую будет запекаться текстура карты нормалей, перейдите в режим редактирования меша (клавиша ‘Tab’), выберите все составные элементы меша (клавиша ‘A’), чтобы показать uv развертку в окне редактора развертки.
Если у вашей целевой модели есть uv развертка, вы увидите ее в окне UV/Image Editor, если нет вы либо ничего не увидите, либо увидите нагромождение вершин и ребер, так что вам придется сделать для своей целевой модели uv развертку (можно даже автоматически созданную).

exportandautouv

На рисунке показано меню экспорта uv развертки (слева), а справа показано меню создания развертки и параметры для настройки “автоматической” развертки.

Чтобы открыть меню uv преобразования (UV Mapping) , нажмите клавишу ‘U’ и в открывшемся меню выберите “Unwrap”, чтобы создать uv развертку или “ Smart UV Project”, чтобы создать автоматическую uv развертку, например, в зависимости от угла между полигонами.

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

Чтобы 3D модель-донор покрывала целевую 3D модель, вы можете немного увеличить масштаб 3D модели-донора (клавиша ‘S’) и/или подогнать ее геометрию в режиме редактирования объекта (‘Tab’).
Масштабирование выбранных составляющих 3D модель элементов -вершин/ребер/полигонов или модели/объекта – та же клавиша ‘S’. Выбор всех элементов одного меша возможен путем наведения курсора на желаемый для выделения меш с последующим нажатием клавиши ‘L’, добавление еще одного меша к ранее выбранному — Shift+’L’. Выбор элементов меша прямоугольным выделением — клавиша ‘B’, подтверждение выделения — Левая Кнопка Мыши. Добавление элементов/объектов к ранее выбранным осуществляется путем выделения с зажатой клавишей ‘Shift’. Выделение окружностью — клавиша ‘C’. За перемещение выделенных элементов/модели отвечает клавиша ‘G’.

После того как вы совместили 3D модели и подогнали модель-донора под целевую модель или наоборот, целевую модель под модель донора (последний вариант иногда предпочтительней, поскольку карта нормалей не будет деформирована при изменении геометрии high poly модели, но еще лучше подгонять как low poly, так и high poly, так сказать, навстречу друг другу, как решения задач по физике из учебника с ответами), пришло время запечь текстуру.
Обратите внимание, что если вы изменяли геометрию целевой 3D модели в режиме редактирования меша, то вам, возможно, потребуется обновить ее uv развертку, «переразвернуть» ее, поскольку в противном случае запеченная карта нормалей может запечься с искажениями на целевую модель. Если же вам нравится созданная uv развертка и компоновка uv островов целевой модели, то перед обновлением развертки закрепите/запиньте ее вершины (от слова pin — прикалывать), выделив все вершины развертки в окне UV/Image Editor и нажав клавишу ‘P’. Отменить закрепление вершин развертки – Alt+P. Закрепленные вершины развертки маркируются красным. Вы можете закреплять не только все вершины развертки, но и uv острова и отдельные вершины или группы вершин.

pinoverlap

На рисунке показаны совмещенные 3D модели, подготовленные для запекания карт/текстур. Вершины uv развертки целевой модели “запинены”. Также на рисунке зеленым контуром выделена кнопка переключения режима редактирования uv развертки, позволяющая включать режим синхронного редактирования развертки, т.е. uv развертка будет отображаться без необходимости выделения вершин 3D модели в окне 3D вида.

Для запекания текстуры с одной модели на другую необходимо в режиме объектов выделить сначала 3D модель-донор, а затем с зажатым Shift’ом выделить
целевую модель. После этого нажмите клавишу ‘Tab’, чтобы перейти в режим редактирования меша целевой 3D модели (и если у вас отключен синхронное редактирование uv развертки, выделите все ее вершины в окне 3D вида), чтобы видеть, как будет запекаться карта.

Чтобы запечь что-то с чего-то на что-то, например, карту нормалей, как в данном случае, с одной 3D модели на другую, откройте вкладку Renderer в меню свойств (на рисунке ниже выделено оранжевым), и в нижней части открывшегося окна выберите вкладку Bake. Выберите Texture в раскрывающемся списке. Выставьте значение параметра Margin, отвечающего за размер контура вокруг запекаемой текстуры таким (по умолчанию 16 пикселей), чтобы запеченная текстура выступала за края островов uv развертки, но не залезала на другие острова.

bakingparameters

На рисунке показано меню запекания карт с выставленными параметрами для запекания текстуры с одной 3D модели на другую 3D модель.

Нажмите кнопку Bake, чтобы запечь карту нормалей в текстуру с модели-донора на целевую модель. Вы увидите, как сетка uv развертки начнет заполняться картой нормалей. В верхней части Blender’а вы увидите состояние данного процесса в процентах.

normalmapsbeforeafter

На рисунке показана карта нормалей с которой производилось запекание (слева) в текстуру (справа).

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

bakedsaveasimage

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

Blender не сохраняет автоматически ничего, включая изменения в геометрии 3D модели, ее положение и ориентацию в трехмерном пространстве, запеченные карты (диффузную карту, карту нормалей, ambient occlusion…) и т.д., причем  запеченные карты и результаты раскрашивания в Blender’е (hand painted texturing) необходимо сохранять в окне редактирования UV/изображения (UV/Image Editor), как показано на рисунке выше, поскольку сохранение файла сцены через Ctrl+S не сохраняет упомянутые изменения. Настройки материалов с назначенными текстурами, геометрию меша, его позицию, модификаторы, настройки освещения и камер — это да, а изменения и создание самих текстур — нет. Обычно, двух-трех потерянных текстур, отрисованных вручную, хватает, чтобы запомнить про необходимость сохранять их отдельно.
Итак, новая карта нормалей сохранена, осталось лишь использовать ее на оригинальной low poly модели.
ready_normalmap

На рисунке: слева – оригинальная 3D модель, справа – 3D модель с перезапеченной картой нормалей.

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

bakedtexture

На рисунке показана визуализированная 3D модель в Blender’е, для которой была перезапечена текстура с одной 3D модели в текстуру другой.

diffusebeforandafter

На рисунке показаны две текстуры: оригинальная и перезапеченная.

ready_diffuse

На рисунке: слева – оригинальная 3D модель, справа – 3D модель с перезапеченной диффузной картой (Albedo).

Помимо описанного метода существует ещё один способ восстановления карты нормалей для 3D-модели — через превращения карты нормалей в карту высот с последующим её использованием на низкополигональной модели в качестве карты смещений (displacement map). Данный метод будет описан в отдельной статье///.

 

P.S. Про ленивое текстурирование.

Blender позволяет использовать текстуру на 3D модели без uv развертки.

pillarshadedwithoutuv

На рисунке показана 3D модель столба, затекстуренного в Blender без создания uv развертки.

В отличие от Blender’а Unity3d не рендерит текстуру на 3D модели без uv развертки. Об этой особенности Unity 3D и о других артефактах, возникающих при рендере 3D моделей в Unity можно почитать в статье Ошибки в отображении 3D моделей в Unity 3D. Розовый, черный, белый цвет 3D модели в Unity. Проблемы с материалами, шейдерами, uv разверткой и кешем.

 pillarnouvunity3d

На рисунке показана 3D модель колонны без развертки в Unity3D. Обратите внимание на правую часть экрана — текстура 3D модели назначена, но из-за отсутствия uv развертки текстура на ней отображается, мягко говоря, не аллё .

Итак, в Blender’е можно создать материал для 3D модели без uv развертки и назначить ему текстуру. И все будет отлично отображаться. Но как же перенести 3D модель в Unity, затратив на это минимум усилий? В Blender можно воскользоваться одним из инструментов создания автоматической uv развертки “Smart UV Project”. Поиграв некоторое время с параметрами данного типа uv развертки, вы, в конечном счете, подберете нужные.

pillarsmartuvblendernew

На рисунке показана созданная uv развертка при помощи инструмента Smart UV Project. Также обратите снимание на правую часть рисунка, в которой показано меню способа наложения текстуры, т.е. согласно каким координатам: оконным, uv, объекта и т.д. А под этим меню есть еще одна волшебная опция — это способ проецирования текстуры, включающий плоское проецирование текстуры, цилиндрическое/Tube, кубическое и сферическое. Благодаря таким настройкам текстуру можно разместить почти всегда так, как хочется. Если хотите, чтобы текстуры накладывались без разрывов и стыков, то ваш путь лежит к изучению текстурирования или использованию упомянутых в начале статьи пакетов для текстурирования и работы с изображениями, а также продуктов от Adobe, Allegorithmic и других.

3D модель уже можно экспортировать для использования в Unity3D, а можно еще и запечь, примененную к 3D модели текстуру, ведь в Unity по умолчанию вы можете использовать лишь один способ наложения текстуры на 3D модель – согласно uv координатам. Но вы можете в Blender’е выбрать наиболее подходящий способ расположения текстуры на поверхности 3D модели (способ по оконным координатам/Window является очень интересным) и запечь отображаемую на 3D модели текстуру так, как вы ее видите.

pillarbakingtexture

На рисунке показано меню запекания текстуры. Отличие от предыдущего метода заключается в том, что текстура натягивается на саму 3D модель и флажок рядом с опцией запекания с одной 3D модели на другую “Selected to Active” должен быть снят.

Осталось лишь экспортировать 3D модель и использовать ее в Unity3D.

pillarsmartuvunity3d

 

P.P.S. Если в 3D редакторе у вас нет желания создавать uv развертку, а проще пользоваться функционалом, предоставляемым Unity 3D, то вы можете использовать методы GeneratePerTriangleUV и GenerateSecondaryUVSet класса Unwrapping в UnityEditor.

 

Автор Максим Голдобин (aka MANMANA)

goldmaxval@gmail.com

2 Comment

  1. Дмитрий says: Ответить

    Спасибо, человеческое за урок.

    1. Maxim Goldobin says: Ответить

      Я всегда рад, когда меня хвалят, но и не против критики.
      Спасибо!
      Список всех статей вы можете посмотреть здесь: Статьи и уроки 3D blender, 3ds Max, Unity3D и других игровых движков
      А здесь: Новости игрового мира, IT, патентования, а также обзоры новых игр

Добавить комментарий