Создать карту normal для 3д макса

Обновлено: 07.07.2024

Если Вы обращали внимание на технологию видеоигр, Вы слышали о термине "Карты нормалей". Игры подобные Doom 3, Half-Life 2, и F.E.A.R. все используют эту технику, чтобы показать так много деталей, как только возможно без причинения вреда компьютеру от перегрузки. В это уроке Вы узнаете все об основах карт нормалей и их применении в движке Torque Shader Engine. Прежде чем мы начнем, важно узнать и понять Что есть карты нормалей?

Normal Mapping в Nut Shell

Предположим, что Вы испльзуете 3DS Max достаточно давно, чтобы заинтересоваться техникой карт нормалей, следовательно достаточно уверенно чувствуете себя в 3D пространстве. Вершины в этом пространстве описываются координатами вдоль осей X,Y и Z. Когда Вы применяете 2D текстуры к Вашим 3D моделям, Вы приписывате им UVW координаты. UVW координаты основываются на полигонах, где U и V наиболее важные, т.к. они представляют X и Y, в то время как W представляет как текстура будет обертываться вокруг нескольких полигонов на модели в 3D пространстве.

В карте нормалей, RGB картинка кодирует и XYZ и UVW координаты. Она содержит размещение текстуры, куда Вы ее развернули в UVW, но каждый пиксель представляет XYZ координаты своим цветом. Любой красный пиксель будет транслироваться в X координату, зеленый в Y, а синий в Z. Результат сводится к смеси этих трех цветов, так что пристально рассмотрим пример карты нормалей, чтобы почувствовать как она будет транслироваться.


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

Давайте начнем.

Т.к. это урок не по моделированию, я предполагаю, что Вы уже имеете и высокополигональную и лоуполи сетку и готовы сделать карту нормалей. Еще раз мы будем работать в 3ds max, но все сказанное может быть легко приспособленно для других программ трехмерного моделирования. Для этого урока я построил очень простую стенную панель, приспособленную для мозаичного повторения, и импортировал ее в TSE. Вам нужно проверить, что Ваша модель центрирована для уменьшения трудов при создании карты нормалей. Также всегда помните одну вещь: НАЗЫВАЙТЕ ВАШИ ОБЪЕКТЫ! Я не могу достаточно объяснить насколько легче все будет, если Вы все соответственно назовете. Здесь я имею основной план высокополигональной модели справа и рядом лоуполи (Это просто чтобы их показать они обе здесь, по настоящему они наложены друг на друга, что Вы далее увидите).


Ваша первая задача сделать развертку (unwrap) вашей лоуполи модели. Есть другие уроки, которые описывают этот процесс, так что я пропущу эту часть. Ok, Вы имеете обе модели и развертку низкополигональной модели. Что дальше? Выберите лоуполи модель, нажмите "0" или выберите Rendering-> Render to Texture. Следующие несколько скриншотов показывают что описывается, так что попытайтесь следовать им так аккуратно, как возможно или Ваш результат может оказаться не таким как надо.


Нажмите Setup (Установка) в Render Settings (Установки визуализации).


На закладке Renderer включите Enable Global Supersampler.


Закройте установки визуализатора и перейдите ниже к свитку Projection Mapping. Включите разрешение (enable) Projection Mapping (Картирование проекций) и нажмите Pick (Взять) для указания высокополигональной модели.


Укажите хайполи модель и нажмите Add (Добавить).


Пройдите дальше вниз в окне Render to Texture и нажмите Add в свитке Output (Выход). Затем нажмите NormalsMap и Add Elements.


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


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


Здесь как клетка должна выглядеть когда Вы закончите; полностью охватывает обе сетки.


Окончательно вернитесь в окно Render to Texture и перейдите в самый низ. Проверьте что Вы в правильном окне для визуализации переда сетки. Нажмите Render для визуализации Вашей карты нормалей.


Пофвится подобный диалог. Нажмите Continue (Продолжить).


Вы наверное рассердитесь. "Это только визуализация Вашей глупой сетки! Она не выглядит как карта нормалей, которую Вы показывали ранее!" Ну это потому что это не карта нормалей. Перейдите в Вашу папку, куда установлен 3dsmax и посмотрите в папке Images. И - ага, там есть прекрасная карта нормалей.


Скройте Вашу хайполи сетку. В редакторе материалов создайте новый стандартный материал и примените его к лоуполи сетке. Нажмите на карте Bump и выберите Normal Bump. В поле Normal выберите Bitmap и найдите Вашу только что созданную текстуру.

Поместите светильник Omni в сцену и Вы увидите результат что-то вроде этого:


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

Создание LowPoly модели

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

karta-normalej-1

В данном случае хватит всего 14 полигонов что бы сделать основу (Box002) для наложения карты нормалей с Box001.

karta-normalej-2

Настройка визуализации карты нормалей

Выделив Box002, нажимаем на вкладку Rendering/RenderToTexture (горячая клавиша «0»).

karta-normalej-3

Перед нами открылось окно Render To Texture. В параметрах Projection Mapping ставим галочку напротив Enabled, нажимаем Pick…, выделяем HighPoly модель и кликаем Add.

karta-normalej-4

Вокруг объекта появился контейнер проецирования, который надо подогнать так, чтобы в него поместилась вся HighPoly модель. Для этого переходим на вкладку Modify/Projection/Cage, нажимаем Reset, если контейнер был автоматически создан с искаженной формой, и изменяем параметры Amount и Percent, увеличивая контейнер до нужного размера.

karta-normalej-5

В окне Render To Texture, в параметрах Output нажимаем Add… Если вы рендерите с помощью Vray, то выберите Vray Normals Map и нажмите Add Elements. Если используете стандартный рендер, то выберите Normals Map.

Есть возможность изменить имя карты (Name), путь для сохранения карты нормалей (File Name and Type), тип слота материала (Target Map Slot), а также размер карты (Width/Height).

karta-normalej-6

Нажимаем Render и видим результат.

karta-normalej-7

P.S.: Карта нормалей сохраняется автоматически. Стандартный путь сохранения: C:\Users\Документы\3dsMax\sceneassets\images.

Применение карты нормалей к LowPoly модели

Выделяем ранее созданную LowPoly модель.

На панели Modify выбираем модификатор Automatic Flatten UVs, который был создан автоматически в процессе создания карты нормалей. Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/SaveUVs…, и сохраняем развёртку.

Открываем редактор материалов MaterialEditor (горячая клавиша М), создаём материал VRayMtl. В слот Bump выбираем карту Normal Bump.

karta-normalej-9

Заходим в параметры карты Normal Bump. В слот Normal выбираем карту Bitmap, и открываем ранее созданную карту нормалей. Применяем созданный материал к LowPoly модели.

karta-normalej-10

На панели Modify добавляем модификатор Unwrap UVW. Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/LoadUVs… и загружаем сохранённую развёртку.

karta-normalej-11

В окне Edit UVWs, в правом верхнем углу, открываем свиток текстур и выбираем созданную нами карту нормалей.

karta-normalej-12

Запустив Render, мы увидим, что LowPoly модель имеет те же детали, что и HighPoly. Детали можно сделать более или менее выраженными, меняя значения параметра Bump в используемом материале.

alt

Изучая полигональное моделирование, постоянно встречается упоминание о «нормалях». При этом увидеть их нигде не получается. Но благодаря модификатору Edit Normals эти скрытые элементы можно не только увидеть, но и редактировать.

1. Нормали и что они делают

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

Vertex

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

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

Именно из-за правильного отражения света объект выглядит сглаженным или неровным даже при малом числе полигонов.

Нормали

2. Edit Normals

Все указанные действия совершаются в модификаторе Edit Normals. Чтобы им пользоваться, нужно создать любой геометрический объект и перейти в Modify – Modifier List – Edit Normals. В зависимости от объекта и его сглаженности, нормали могут располагаться иначе.

Select By – режимы выбора нормалей.

Normal – выбор каждой отдельной нормали.

Vertex – выбор всех нормалей, принадлежащих одной точке.

Edge – выбор всех нормалей, принадлежащих одному ребру. Если у точки несколько нормалей, то выбираются не все.

Face – выбор всех нормалей, принадлежащих фейсам (Face). Если у точек несколько нормалей, то выбираются не все.

Ignore Backfacing – игнорирование задних нормалей при выделении.

Show Handles – отображение маркеров на вершинах нормалей.

Display Length – значение длины прямой, отображающей нормаль.

Display Length

Unify – усредняет направление всех нормалей в точке. Общее направление задается относительно прилежащих полигонов. Включение функции Unify/Break to Average усредняет нормали по их среднему направлению. Полигоны в этом случае не влияют.

Break – разделяет одну нормаль на шесть. Все они будут направлены так, чтобы быть перпендикулярными своим полигонам. Включение функции Unify/Break to Average также разделяет нормали, но сохраняет их направление.

Break

Average – инструмент усреднения нормалей.

Selected – устанавливает все выбранные нормали в одно, общее положение.

Use Threshold

Target – усреднение двух нормалей с помощью целевого выбора. Включив функцию Target, нажмите сначала на одну нормаль, затем на вторую. Обе нормали усредняются по общему для них значению. Pixels – дальность в пикселях между курсором и нормалью. Это значение регулирует точность наведения курсора на нормаль в режиме Target.

Target

Copy Value – копирование направления выбранной нормали.

Paste Value – присвоение скопированного направления новой, выделенной нормали.

Specify – присваивает нормали тип Specified.

Нормали такого типа не учитывают группы сглаживания, присвоенные объекту.

Reset – восстанавливает изначальное положение нормали.

Make Explicit – присваивает нормали тип Explicit.

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

Make Explicit

3. Передвижение и вращение нормалей

Нормали, как и другие подобъекты, можно перемещать и вращать. Для этого их нужно просто выделить и воспользоваться инструментом Select and Move/Rotate на панели Main Toolbar. Тип Explicit, необходимый для подобных изменений, будет назначен автоматически.

Select and Move/Rotate

Редактирование нормалей – инструмент тонкой настройки объекта. Обычно им пользуются косвенно через функцию или модификатор Smooth, через Smoothing Groups. Тем не менее, нормали несут очень важную информацию – способ отображения поверхности объекта. Поэтому даже если не приходится их редактировать, обязательно нужно понимать принцип их работы.

Это моя первая статья на 3DDD так что не судите строго.

Итак что мы имеем: 2 вида гаек, один высокополигональный переименуем его в Hi:


и 2-й вид низкополигональные модели, их 3 штуки для 3-х способов, переименуем их в Low, Low_a1 и Low_a2, соответственно:


Итак 1 способ который предлагался в теме на форуме: Это запекание карты нормалей с единственной группой сглаживания и с развёрткой имеющей минимальное количество швов. Для этого выделяем объект Low, нажимаем на кнопку Smoth, панели Ribbon:


И получаем вот такую гайку:


Далее накидываем модификатор Unwrap UVW и выделяем грани которые будут являться швами, после чего нажимаем на кнопку Convert Edge Selection to Seams (Номер 1 на картинке), а затем нажимаем цифру 3 (режим работы с полигонами), Ctrl+A (выделить всё),после чего нажимаем на кнопку Quick Peel (Номер 2 на картинке).


Получаем вот такую развёртку:


Модель подготовлена! Теперь необходимо установить в те же координаты высокополигональную модель и наконец приступить к настройке.

1-е что необходимо сделать это установить источник освещения типа Skylight из свитка Standart. Затем выделить объект Low. (Вообще данный пункт не обязателен для запекания карты нормалей, ибо там не учитывается освещение, устанавливать источник освещения требуется только если с картой нормалей вы запекаете другие карты, к примеру АО, но так как я обычно запекаю несколько карт, данный пункт появился по привычке)

2-е. Нажать на цифру 0(вызов окна Render To Texture по умолчанию)на клавиатуре.

В открывшимся окне включить чекбокс Enable (номер 1 на картинке), этим чекбоксом активируется проецирование выбранного объекта на текстуру. Затем следует нажать на кнопку Pick. (номер 2 на картинке), в появившемся окне выбрать обьект с именем Hi (номер 3 на картинке), после чего подтвердить свой выбор нажав на Enter.

Далее выберите Use Existing Channel (номер 4 на картинке), таким образом вы указываете 3ds max что у вас уже есть развёртка после чего можете выбрать на каком канале находится нужная. Затем нажмите на кнопку Add. (номер 5 на картинке):


В появившемся окне выберите Normal Map (номер 1 на картинке), затем нажмите Add Elements (номер 2 на картинке) и установите Target Map Slot на Bump (номер 3 на картинке), после чего нажмите на кнопку 1024х1024 (номер 4 на картинке), это позволит вам выбрать разрешение будущей карты. Если размер вам не подходит можно указать его в соответствующем окне немного правее, ограничение - квадрат 8192х8192px.


Далее, если хотите, можете указать путь, формат и имя будущей карты нажав на кнопку со знаком . рядом со слотом File Name and Type.

Здесь настройка завершена, однако не стоит закрывать окно, просто отодвиньте его чтобы не мешалось. Теперь выделяем объект Low и видим что появился новый модификатор Projection, открываем в нём свиток Cage, затем включаем чекбокс Shaded (это позволяет видеть границы запекаемого объекта, пересечение с которым приведут к появлению красных зон на будущей текстуре), затем в разделе Percent укажите -100 это позволит вам сбросить Cage до границ низкополигональной модели, а затем, поиграйте со значением Amount - вам потребуется установить такое значение чтобы граница между Low poly и Hi Poly моделью была минимальной, но при этом чтобы не было пересечений, если же подобными махинациями не удаётся достичь требуемого результата можно поработать с Cage на уровне вершин и полигонов выбрав соответствующую иконку в свитке Selection.


Далее возвращаемся в окно Render to Texture и нажимаем окно Render в самом низу. Сразу замечу что 3DS max не отображает карту которую рендерит, а отображает карту Diffuse слота даже если она не установлена на рендер, то есть если ваша высокополигональная гайка была красного цвета, то в окне вы увидите развёртку залитую красным цветом.


Открыв текстуру в фотошопе видим следующее:


Затем если мы подгрузим лоуполи модель с данной текстурой в Marmoset toolbag увидим следующее:


Как бы неплохо, но с косяками. Теперь перейдём ко второму, правильному, способу:

1. Выберите объект Low_a1, нажмите 2 на клавиатуре и выберите все те эджи которые, по вашему мнению, должны быть жёсткими, то есть иметь разные группы сглаживания по разным сторонам эджа. У меня вышло вот так:


2. Нажмите на кнопку Hard (номер 1 на картинке), это позволит вам получить эффект описанный выше.

3. Теперь нам нужно сделать развёртку делая швы аккурат в том месте где у нас проходят Hard эджи, для лучшего ориентирования включите их отображение кликнув по чекбоксу Display Hard Edges(номер 2 на картинке). Чуть левее вы можете выбрать цвет отображения Hard эджей.

4. Накидываем модификатор Unwrap UWV, выделяем все наши хард эджи, а также 1 грань внутри гайки. После чего нажимаем на Convert Edge Selection to Seams, а после на Quick Peel. Получив развёртку нажмите на кнопку Pack: Custom (подчёркнута на изображении ниже)


Данную развёртку можно упаковать и лучше, но для примера.


5. Повторяем все те же действия что и на 1 способе:




Нажав рендер получаем вот такую карту нормалей:


А подгрузив всё в мармосет вот такую модель:


Теперь эксперемента ради рассмотрим третий способ возьмём третью гайку Low_a2, повторим действия с хард эджами и накинем на неё развёртку от гайки Low, что получится? И так ли важна развёртка?

После всех махинаций получаем вот такую карту нормалей:


А в мармосете мы видим вот такую модель, с косяками на хард эджах:


Итак мы приходим к выводам: 1) можно использовать сколько угодно групп сглаживания 2) швы развёртки должны располагаться на хардэджах.

Читайте также: