Как проверить нормали в 3ds max
Если Вы обращали внимание на технологию видеоигр, Вы слышали о термине "Карты нормалей". Игры подобные 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).
Здесь как клетка должна выглядеть когда Вы закончите; полностью охватывает обе сетки.
Окончательно вернитесь в окно Render to Texture и перейдите в самый низ. Проверьте что Вы в правильном окне для визуализации переда сетки. Нажмите Render для визуализации Вашей карты нормалей.
Пофвится подобный диалог. Нажмите Continue (Продолжить).
Скройте Вашу хайполи сетку. В редакторе материалов создайте новый стандартный материал и примените его к лоуполи сетке. Нажмите на карте Bump и выберите Normal Bump. В поле Normal выберите Bitmap и найдите Вашу только что созданную текстуру.
Поместите светильник Omni в сцену и Вы увидите результат что-то вроде этого:
3d графика и дизайн
Карта нормалей спасает в ситуации, когда нам нужна модель с малым количеством полигонов, но с хорошей детализацией. Наложив карту нормалей на lowpoly (низкополигональную) модель, мы увидим результат только на рендере. Такой способ применяется в создании игр, когда каждый лишний полигон требует большей производительности компьютера, а просчёт карты нормалей требует значительно меньше ресурсов ПК.
Создание LowPoly модели
Изначально у нас есть HighPoly модель Box001 (с большим количеством полигонов). У нас стоит задача сделать LowPoly модель, которая будет повторять основные формы заданной модели.
В данном случае хватит всего 14 полигонов что бы сделать основу (Box002) для наложения карты нормалей с Box001.
Настройка визуализации карты нормалей
Выделив Box002, нажимаем на вкладку Rendering/RenderToTexture (горячая клавиша «0»).
Перед нами открылось окно Render To Texture. В параметрах Projection Mapping ставим галочку напротив Enabled, нажимаем Pick…, выделяем HighPoly модель и кликаем Add.
Вокруг объекта появился контейнер проецирования, который надо подогнать так, чтобы в него поместилась вся HighPoly модель. Для этого переходим на вкладку Modify/Projection/Cage, нажимаем Reset, если контейнер был автоматически создан с искаженной формой, и изменяем параметры Amount и Percent, увеличивая контейнер до нужного размера.
В окне Render To Texture, в параметрах Output нажимаем Add… Если вы рендерите с помощью Vray, то выберите Vray Normals Map и нажмите Add Elements. Если используете стандартный рендер, то выберите Normals Map.
Есть возможность изменить имя карты (Name), путь для сохранения карты нормалей (File Name and Type), тип слота материала (Target Map Slot), а также размер карты (Width/Height).
Нажимаем Render и видим результат.
P.S.: Карта нормалей сохраняется автоматически. Стандартный путь сохранения: C:UsersДокументы3dsMaxsceneassetsimages.
Применение карты нормалей к LowPoly модели
Выделяем ранее созданную LowPoly модель.
На панели Modify выбираем модификатор Automatic Flatten UVs, который был создан автоматически в процессе создания карты нормалей. Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/SaveUVs…, и сохраняем развёртку.
Открываем редактор материалов MaterialEditor (горячая клавиша М), создаём материал VRayMtl. В слот Bump выбираем карту Normal Bump.
Заходим в параметры карты Normal Bump. В слот Normal выбираем карту Bitmap, и открываем ранее созданную карту нормалей. Применяем созданный материал к LowPoly модели.
На панели Modify добавляем модификатор Unwrap UVW. Нажимаем кнопку Open UV Editor… В открывшемся окне выбираем File/LoadUVs… и загружаем сохранённую развёртку.
В окне Edit UVWs, в правом верхнем углу, открываем свиток текстур и выбираем созданную нами карту нормалей.
Запустив Render, мы увидим, что LowPoly модель имеет те же детали, что и HighPoly. Детали можно сделать более или менее выраженными, меняя значения параметра Bump в используемом материале.
Это моя первая статья на 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-е. Нажать на цифру (вызов окна Render To Texture по умолчанию)на клавиатуре.
В открывшимся окне включить чекбокс Enable (номер 1 на картинке), этим чекбоксом активируется проецирование выбранного объекта на текстуру. Затем следует нажать на кнопку Pick. (номер 2 на картинке), в появившемся окне выбрать обьект с именем Hi (номер 3 на картинке), после чего подтвердить свой выбор нажав на Enter.
Далее выберите Use Existing Channel (номер 4 на картинке), таким образом вы указываете 3ds max что у вас уже есть развёртка после чего можете выбрать на каком канале находится нужная. Затем нажмите на кнопку Add. (номер 5 на картинке):
Далее, если хотите, можете указать путь, формат и имя будущей карты нажав на кнопку со знаком . рядом со слотом File Name and Type.
Далее возвращаемся в окно 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) швы развёртки должны располагаться на хардэджах.
На протяжении нескольких лет я пытался разобраться в картах нормалей и в проблемах, которые обычно возникают при работе с ними.
Большинство найденных объяснений было слишком техническим, неполным или чересчур сложным для моего понимания, поэтому я решил попробовать объяснить собранную мной информацию. Я понимаю, что эти объяснения могут быть неполными или не совсем точными, но всё равно попробую.
Первые созданные человеком 3D-модели выглядели примерно так:
Это замечательно, но у такой модели есть очевидное ограничение: она выглядит слишком полигональной.
Наиболее очевидное решение: добавить больше полигонов, сделав поверхность более равномерной и гладкой, вплоть до того, чтобы полигоны казались единой гладкой поверхностью. Но оказывается, для того, чтобы сделать поверхности наподобие сфер гладкими, нужно огромное количество полигонов (особенно сегодня).
Требовалось другое решение, и так были изобретены нормали. (Всё происходило не совсем так, но так проще объяснять и понимать.)
Давайте проследим за линией из центра полигона, перпендикулярной его поверхности. Мы дадим этой линии очень непривычное название: нормаль. Цель нормали — контролировать, куда указывает поверхность, чтобы когда свет отразиться от этой поверхности, она могла использовать нормаль для вычисления получившегося отражения. Когда свет падает на полигон, мы сравниваем угол луча света с нормалью полигона. Луч отражается под тем же углом относительно направления нормали:
Другими словами, отражение света будет симметрично относительно нормали полигона. Именно так работает большинство отражений в реальном мире. По умолчанию лучи света отражаются от всех полигонов совершенно перпендикулярно к их поверхности (как должны это делать в реальной жизни), потому что нормали полигона по умолчанию перпендикулярны к поверхности полигона. Если в нормалях будут пробелы, то мы увидим их как отдельные поверхности, поскольку свет отразится в одном или другом направлении.
Если две грани соединены, то мы можем попросить компьютер сгладить переход между нормалью одного полигона к другому, чтобы нормали постепенно выстраивались в соответствии с ближайшей нормалью полигона. Таким образом, когда свет попадёт ровно в центр одного полигона, то он отразится прямо, в соответствии с направлением нормали. Но между полигонами это направление нормали сглаживается, изменяя отражение света.
Мы будем воспринимать переход как единую поверхность, потому что свет будет отражаться между одним и другим полигоном плавным образом, и между ними не будет пробелов. По сути, свет отражается от этих полигонов плавно, как будто у нас имеется множество полигонов.
Именно этим мы управляем, задавая smoothing groups (3ds Max, Blender) или указывая рёбра как hard или smooth (Modo, Maya): мы сообщаем программе, какие переходы между гранями должны быть плавными, а какие — жёсткими.
Вот сравнение одной сферы из 288 полигонов с жёсткими и плавными переходами:
Потенциально мы можем задать нечто вроде параллелепипеда, чтобы все его вершины имели усреднённые нормали. 3D-редактор будет стремиться сгладить его поверхность, чтобы она выглядела как единая плавная поверхность. Для 3D-редактора это вполне логично, но выглядит очень странно, потому что у нас есть объект, который очевидно должен иметь несколько отдельных поверхностей (каждая грань параллелепипеда), однако программа пытается показать их как одну плавную поверхность.
Именно поэтому в 3D-редакторах обычно есть параметр углов сглаживания: если у нас есть два связанных полигона под углом, превышающем угол сглаживания, то их переход будет плавным, а соединение полигонов под углом меньше угла сглаживания будет жёстким. Благодаря этому крутые углы между поверхностями будут отображаться как разные поверхности, как это и бывает в реальном мире.
Итак, мы использовали нормали для контроля над переходами между гранями модели, но можно пойти ещё дальше.
Так как мы меняем способ отражения света от объекта, можно также сделать так, чтобы очень простой объект отражал свет, как сложный. Это называется картой нормалей. Мы используем текстуру для изменения направления света, отражающегося от 3D-объекта, заставляя его выглядеть сложнее, чем он есть на самом деле.
Примером из реального мира могут служить голограммы, которые раньше вручали в подарок при покупке картофельных чипсов (по крайней мере, у нас, в Испании). Они совершенно плоские, но отражают свет так, как бы это делал 3D-объект, благодаря чему становятся сложнее, чем на самом деле. В мире 3D-графики это работает даже лучше, но всё равно имеет свои ограничения (поскольку поверхность остаётся плоской).
Хоть мы и применяем нормали полигонов для реализации какой-то чёрной магии, на самом деле мы не контролируем сглаживание поверхности модели при помощи нормалей полигонов. Мы используем нормали вершин для контроля сглаживания нормалей. По сути, идея та же, но немного более сложная.
С каждой вершиной может быть связано одна или несколько нормалей. Если она имеет одну нормаль, то можно назвать её усреднённой нормалью вершины, а если несколько — то разделённой нормалью вершины.
Давайте возьмём два полигона, соединённых ребром. Если переход между двумя гранями плавный (если мы указали его как плавный в Maya/Modo, или обе имеют одинаковую smoothing group в Max/Blender), то каждая вершина имеет одну нормаль, которая является средней нормалей полигонов (поэтому она и называется усреднённой нормалью вершины). Важное примечание: до недавнего времени каждый 3D-редактор использовал собственный способ вычисления усреднённых нормалей вершин, то есть карты нормалей, вычисленные в одной программе, в другой могли выглядеть совершенно иначе. Подробнее об этом я расскажу во второй части туториала.
Если переход жёсткий (hard edge или разные smoothing groups), то каждая вершина имеет несколько нормалей: по одной для каждой соединённой вершины, выровненной по их нормалям. При этом между нормалями образуется пробел, который выглядит как две разные поверхности. Именно это называется разделённой нормалью вершины.
Как вы могли догадаться, контроль нормалей вершин очень важен, если мы хотим контролировать карты нормалей. К счастью, нам не обязательно изменять нормали напрямую или даже видеть их, но понимание того, как это работает, поможет вам понять, почему мы выполняем работу именно так и больше разбираться в проблемах, с которыми мы можем встретиться.
При запекании карты нормалей мы по сути говорим программе изменить направление, которому следуют нормали lowpoly-модели, так, чтобы они соответствовали направлению в highpoly-модели; поэтому lowpoly-модель будет отражать свет так же, как highpoly. Вся эта информация хранится в текстуре под названием «карта нормалей». Давайте рассмотрим пример.
Допустим, у нас есть вот такая низкополигональная модель (lowpoly). Плоская поверхность с четырьмя вершинами и настроенными UV, которые программа запекания будет использовать для создания карты нормалей.
И она должна получить информацию о нормалях от этой высокополигональной (highpoly) модели, нормали которой сложнее.
Помните, что мы переносим только информацию о нормалях, то есть UV, материал, топология, преобразования и т.п. к делу не относятся. Проверенное правило: если highpoly-модель выглядит хорошо, то её нормали тоже хороши и вполне должны подходить для запекания.
Программа запекания берёт lowpoly-модель и испускает лучи, следуя по направлениям нормалей lowpoly (именно поэтому нам нужно контролировать нормали lowpoly). Эти лучи имеют ограниченную длину чтобы не получать информацию нормалей от далёких граней (обычно это расстояние называется bake distance или cage distance). Когда эти лучи сталкиваются с highpoly, программа запекания вычисляет, как отразить эти лучи, чтобы они следовали по направлению нормалей highpoly, и сохраняет эту информацию в карту нормалей.
Вот результат запекания для нашего примера:
У нас есть текстура, которую движок использует для изменения нормалей lowpoly, чтобы свет отражался от этой lowpoly-модели так же, как он отражался бы от highpoly-версии. Не забывайте, что это только текстура, которая не влияет на силуэт lowpoly-модели (невозможно изменить способ отражения света от модели, если свет не падает на эту модель).
Хотя понятно, что можно «считать» внешний вид highpoly по внешнему виду карты нормалей, очевидно, что карты нормалей — это не обычные текстуры, потому что они хранят информацию не о цвете, а о нормалях. Также это значит, что карты нормалей нельзя рассматривать как обычные текстуры; к тому же, как мы увидим, они обладают особыми параметрами сжатия и гамма-коррекции.
Можно воспринимать карту нормалей как набор из трёх текстур в оттенках серого, хранящийся в одном изображении:
Первое изображение сообщает движку, как эта модель должна отражать свет, падающий справа; оно хранится в красном канале текстуры карты нормалей.
Второе изображение сообщает движку, как модель должна отражать свет, падающий снизу*; оно хранится в зелёном канале текстуры карты нормалей.
*В некоторых программах свет падает не снизу, а сверху, то есть могут быть «левосторонние» и «правосторонние» карты нормалей. Как мы увидим позже, это может вызывать некоторые проблемы.
Третье изображение сообщает движку, как модель должна отражать свет, падающий спереди; оно хранится в синем канале текстуры карты нормалей. Так как большинство объектов при освещении спереди выглядят белыми, карты нормалей обычно кажутся синеватыми.
Когда мы комбинируем все три изображения в одно, то получаем карту нормалей. Помните, что это объяснение не полностью корректно, но надеюсь, что оно позволит вам понять информацию, хранящуюся внутри карты нормалей, и лучше разобраться, что она делает.
Нормали — это векторы, которые используются для определения того, как свет отражается от поверхности. Их можно использовать для контроля над переходом между гранями (усреднением нормалей соединённых вершин для создания плавного перехода или разделением их для создания жёсткого перехода), но также их направление можно изменять, чтобы lowpoly-модель отражала свет так же, как более сложная модель.
Эта информация хранится в трёх отдельных каналах изображения, и 3D-редактор считывает её, чтобы понять, в каком направлении должна смотреть поверхность модели.
В следующей статье цикла мы поговорим о том, как можно запекать эти детали из highpoly-модели в lowpoly.
Перед вами перевод моей статьи для Sketchfab. Статья посвящена созданию 3D-сценки, в которой я постарался собрать все возможные приёмы использования «вывернутых нормалей». Из русской версии текста убрано всё не относящееся напрямую к модели. Оригинал статьи, кому интересно, тут
Приветствую! Меня зовут Андрей, уже три года я от имени Anji Games создаю и выпускаю игры, и иногда в качестве хобби делаю модельки. На Sketchfab можно найти множество очаровательных работ, которые выглядят, как рисунок. Вот одна из моих любимых.
Мне стало интересно бросить себе вызов и воспроизвести нечто подобное без каких-либо шейдеров и эффектов — только фалтовые материалы и геометрия. В качестве основы я выбрал свою игру Fury Turn с очень простым визуальным стилем.
В рамках работы над этой сценой, я решил попробовать использовать вывернутые нормали и псевдо-отражения (как в старых играх) на полную катушку. Всё это можно сделать в любом 3D-редакторе, лично я использовал 3ds Max.
Всё началось с батарейки. У меня было изображение того, как батарейка выглядит в игре, и я постарался как можно точнее воссоздать её в 3D-редакторе. Для передачи мультяшных бликов использовались несколько слоёв цилиндров с вывернутыми нормалями - так получилось достичь практически нужного эффекта. Для блика на верхней плоскости пришлось сделать утопленный внутрь конус с кругляшком на дне.
Работа над самой сценой началась с вертолёта. Первым делом мне было интересно воссоздать блик на стекле, как на оригинальной картинке вертолёта из игры. Для этого потребовалось сразу несколько вложенных друг в друга сфер с обратными нормалями. Некоторые сферы также пришлось немного искривить, чтобы передать ощущение линзы (например, по кромке лобового стекла).
Работая над корпусом вертолёта, мне пришла в голову ещё одна идея - попробовать сделать эффект металлического блика за счёт той же несложной уловки. Немного поэкспериментировав, получил следующий результат.
Наверняка, любой, кто играл в старые игры, знает про этот дешевый приём имитации отражения: пол — это не пол, а дыра, через которую видно отраженную геометрию модели. Подобное очень часто можно встретить в играх на старых консолях.
Я воссоздал такой эффект для лужи масла на земле, добавив небольшой блик на кромку. Полигоны кромки видно, только если камера опущена достаточно низко.
Схожим образом сделано отражение на льду. Изначально я планировал его плоским, но по ходу работы пришла идея имитировать «искажения». Я воспользовался тем, что для воды и отражений используются только два цвета. Это позволило добавить детали, которые плавно сливаются с фоном.
Ещё немного про обводку. По сути, это просто скопированная раздутая геометрия чёрного цвета с вывернутыми нормалями. Такой приём часто используется для передачи мультяшности в не слишком ресурсоёмких играх.
Однако особенности его реализации ведут к некоторым неизбежным артефактам. Например, на сложной форме с некоторых ракурсов обводка начинает выглядеть странно. Для исправлений этого дефекта потребовалось дублировать её в проблемных местах и изменить дистанцию сдвига. Такое может сработать в статичной сцене вроде моей, но лучше не пытайтесь повторять это в своих играх.
Sketchfab предоставляет множество возможностей для детальной настройки рендера, материалов и пост-обработки. Работая в геймдеве, я привык экономить ресурсы устройства тем или иным образом, и эта модель не исключение. На ней всего одна текстура с цветовой палитрой и нет освещения. С одной стороны, это ограничение, но с другой — возможность создать все те визуальные эффекты, которыми напичкана сцена.
К сожалению на DTF пока нет возможности интегрировать фрейм скетчфаба, так что саму сценку можно посмотреть по этой ссылкеБольше материалов о том, как я разрабатываю игры вы можете найти тут: VK, Telegram, Instagram, Twitter
Если Вы обращали внимание на технологию видеоигр, Вы слышали о термине "Карты нормалей". Игры подобные 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 в сцену и Вы увидите результат что-то вроде этого:
Читайте также: