Как создать карту нормалей в cinema 4d

Обновлено: 04.07.2024

Здесь я опишу свой опыт работы с моделью когда готовлю её для текстурирования в Substance Painter. И покажу начало работы в самом Сабстенсе.
Я сам только пару месяцев назад впервые открыл Substance Painter. Очень понравилось как быстро и интуитивно там происходит процесс текстурирования. Но вначале были проблемы с пониманием импорта 3D моделей и тем, какие модели Сабстенс от вас ожидает. Сразу оговорюсь, что вариантов подготовки модели и импорта существует несколько. Я остановлюсь только на одном — на самом простом и быстром, на мой взгляд.

Основной принцип

При запекании текстур в Substance Painter вы можете запечь такой канал как ID. Канал содержит уникальный цвет (маску) для каждой части модели, которые вы сами определите. Один цвет — один уникальный идентификатор. В последствии, когда вы будете перетягивать материалы Сабстенса на модель, то будете выбирать к какой именно части модели применится эта текстура:

Собственно, к этому процессу мы и будем готовить 3Д модель.

Разрезаем модель на куски

Вы закончили вашу модель и, допустим, она выглядит как-то так:

Теперь нам нужно разделить (или наоборот, сгруппировать) её на отдельные меши, каждому из которых Substance Painter присвоит уникальный ID (маску).

Я знаю, что моя модель должна содержать 5–6 уникальных материалов. Можно сгруппировать меши таким образом, чтобы их осталось 6 — по одному на каждый материал (перед этим лучше сохранить копию оригинальной несгруппированной модели).

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

Но если вам, например, нужно не сгруппировать, а, наоборот, раскрасить один цельный объект несколькими разными материалами, то смело разрезайте его на отдельные меши. Для этого удобно использовать команду Split. Пример с вентилем:

разделяем меш на отдельные объекты с помощью Split

Выше я написал, что сделаю 6 отдельных мешей (объектов) для каждого материала. Но это не обязательно. Делайте на своё усмотрение. Я всегда группирую объекты так, как мне кажется модель могла бы быть текстурирована в принципе, даже если я это не планирую сейчас. Руководсвуюсь простой логикой и интуицией. Например, имеет смысл сделать все 3 вентиля в моём объекте как 3 разных меша. Потому что может быть такое, что придут правки от клиента, который скажет, что хотел бы видеть эти три вентиля не одного цвета, а трёх разных цветов.

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

Повторюсь: такую раскраску модели в Синеме делать не нужно. Я это делаю только для наглядности.

Экспортируем лоу-поли модель в FBX

При импорте FBX файла Substance Painter не учитывает иерархию мешей в вашей сцене. Все Null объекты игнорируются, как и Subdivision:

Настройки экспорта

  1. Открываем настройки экспорта: меню «File > Export > FBX».
  2. В выпадающем списке File Format выбираем последнюю доступную версию FBX. В моём случае это версия 7.7. Хотя я не знаю на что это влияет. Никогда не видел разницы между разными версиями (напишите в комментариях если знаете).
  3. Снимите все галочки и оставьте только Normals.
  4. Кликайте OK

настройки FBX экспорта

Экспортируем хай-поли модель в FBX

Теперь возвращаемся к модели, включаем Subdivision и запекаем его, нажав «C». Это создаст высокополигональную модель, которая нужна Сабстенсу для того, чтобы сгененировать красивые карты нормалей, Ambient Occlusion и другие — без угловатостей.

запекание высокополигональной модели

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

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

Начало работы в Substance Painter

Импортируем 3Д модель в Substance Painter

Открываем Сабстенс и перетаскиваем в его окно лоу-поли модель (FBX). Можно пойти через меню File > New, то тогда ещё нужно будет вручную указать путь к файлу (кнопка Select. ).

Откроется окно New Project. В нём выбираем шаблон (1) на своё усмотрение и разрешение текстуры (2) для работы во вьюпорте Сабстенса, также, на своё усмотрение. Ниже, если ваша модель, вдруг, не имеет UV развёртки, поставьте галочку Auto-unwrap (3):

создание нового проекта в Substance Painter

Запекаем текстурные карты

В панели «Texture Set Settings» нажмите кнопку «Bake Mesh Maps».

Если панель Texture Set Settings не видна, то открывается через меню «Window > Views > Texture Set Settings».

Bake Mesh Maps

В открывшемся окне выбираем разрешение текустуры (1) и добавляем нашу высокополигональную (хай-поли) модель (2):

разрешение текустуры и хай-поли

Затем, слева переключаемся на вкладку ID (1) и в выпадающем списке выбираем «Mesh ID / Polygroup» (2):

ID и Mesh ID / Polygroup

И это как раз то, ради чего мы группировали меши нашей модели. Потому что если посмотрите на другие пункты списка, то увидите другие варианты «получения» ID из вашей модели. Mesh ID / Polygroup, в данном случае, генерирует маски для материалов на основе того количества отдельных мешей, которые мы сделали в Синеме.

В тех туториалах, которые мне попадались, люди часто используют Vertex Color или Material Color для генерации ID. Но, как по мне, то разбить/сгруппировать модель на отдельные меши легче, чем возиться с тегами Vertex Color в Синеме или создавать уникальные материалы для каждого будущего ID.

Теперь кликаем кнопку «Bake selected textures» и ждём.

Начинаем текстурировать

После окончания запечки вы не увидите почти никакой разницы во вьюпорте. Чтобы посмотреть какие каналы и как запеклись последовательно нажимайте кнопку «B» (латинскую) для переключения между картами.

Среди запечённых карт вы увидите и карту с ID. Вот так она выглядит в моём случае:

Для возврата к стандартному рендеру вьюпорта нажмите «M».

А теперь, чтобы начать накладывать материалы, перетаскивайте их из панели «Shelf» на объект с зажатой кнопкой Ctrl. Без Ctrl материал наложится на весь объект. С Ctrl — только на выбранный ID (маску):

😊

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

@Aleksei Леш!!спасибо тебе огромное!!Ты молодец за такое развернутое объяснение!!Очень полезно при начале иметь подобный алгоритм!Только один вопрос: фактически если мы хотим текстурировать ОДНУ 3Д модель с сабдивом нам нужно:1.Лоу поли модель,которую сохраняем bla-bla-bla_low_poly.fbx и 2.Вторая версия этой же модели:c накинутым сабдивом и сохраненым current state to object и поделенным на то количество мешей что и материалов bla-bla-bla_high_poly.fbx. где хай и лоу чтобы тупо мы сами не путались для себя

si vis pacem-para bellum

Да, всё правильно.
Только хай-поли делать не обязательно. Может устраивать даже просто лоу-поли запечка, без хай-поли. Например, если нужно сделать несколько десятков второплановых ассетов, то лишние 10 кликов на каждую модель — это уже очень много времени. При том, что разницы никто не заметит.
Две версии — это как рекомендация, которую вы используете на своё усмотрение.


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


Выравнивание отличающихся нормалей в основном направлении.

Cinema 4D производит выравнивание нормалей согласно преобладающего направления полигонов для конкретного объекта (или выделенных полигонов).

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

На заметку
Cinema 4D не можете самостоятельно определить внешнюю и внутреннюю стороны объекта. Например, примитив сфера имеет внешнюю и внутреннюю стороны. Но как определить внешнюю и внутреннюю стороны для простой плоскости? Это вопрос определения. Внешняя сторона определяет, как правило, направление, в котором показывают нормали. Внутренняя сторона в соответствии с этим является противоположным направлением. Это имеет определённое значение при проекции текстуры, когда вы имеете возможность проецирования только с лицевой или обратной стороны (смотрите Сторона).

С выходом Cinema 4D R19, эта команда была освобождена от некоторых ограничений:

Команда обладает следующей опцией.

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

А для чего нужны нормали?

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

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

В таком случае вам надо отключить установку Игнор. тыл поверхности и развернуть нормали этих полигонов.

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

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


При Смещении, равномерное распределение нормалей играет одну из важных ролей.

Такая ситуация: сделал в Cinema4D прямоугольник из 6 полигонов, раскроил развёртку, сделал карты диффузии, нормалей, спекулар.
Микрорельеф отображается, блики сверкают, всё как надо. Но стоит немного сместить ракурс камеры, как выпуклости становятся вогнутостями.
Закачал ассет для Unity c похожим ящиком, у него таких проблем нет, как не встань - рельеф отображается верно.
В материалах сделал аналогичные референсу настройки - безрезультатно. Поскольку и в синеме отображается такая же ерунда,
проблема с какой то галочкой в настройках чего то)) В общем чего то упускаю, но не могу понять что.
Подскажите в чём загвоздка. Наверняка что то банальное и простое.

Вот иллюстрация ракурс с нормальным выпуклым рельефом:

И ракурс чуть со стороны, когда выпуклость становится вогнутостью:

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

Погугли на досуге: opengl и directx карты нормалей различаются.

Спасибо! Сейчас попробую.

Большое вам спасибо! Всё работает как надо!

MSA2
> выпуклость становится вогнутостью
Не становится. Светотень такая же. Можно и так и так воспринимать.
Просто нормалмапа это фейк, и надо это учитывать. При использование нормала полоса перепада высоты при виде сбоку остаётся плоской. Т.е. поверхность то всё равно плоская.
Поэтому нужны дополнительные меры, кроме нормалмапы, чтобы подчеркнуть нужный рельеф. Подмешать амбиент к диффузу поможет дополнительно передать светотень.
И лучше не делать так, что-бы перепад высоты был похож на букву S с одинаковой нижней и верхней частью. Чтоб глаз их не путал. Лучше сделать чтоб эти углы были разные по крутости и форме.

Я в какой-то программе, уже не помню в какой, видел галочку для карт нормалей OGL / D3D :)

DjeeZ
> Не становится. Светотень такая же. Можно и так и так воспринимать.
> Просто нормалмапа это фейк, и надо это учитывать. При использование нормала
> полоса перепада высоты при виде сбоку остаётся плоской. Т.е. поверхность то всё
> равно плоская.
> Поэтому нужны дополнительные меры, кроме нормалмапы, чтобы подчеркнуть нужный
> рельеф. Подмешать амбиент к диффузу поможет дополнительно передать светотень.
брехня. выпуклость и вогнутость материала с нормапой можно восстановить однозначно без эмбиентов, диффузов и прочего при известном направлении освещения. проблема именно в том, что из текстурных координат в систему tbn нормалмапу можно переводить либо по формуле tex_sample.xyz * 2.0 - 1.0f, либо по корявой (tex_sample.xyz * 2.0 - 1.0f) * vec3(1.0f, -1.0f, 1.0f). в некоторых редакторах вроде substance painter эти форматы почему-то называют ogl и dx потому что в одном по умолчанию базисная тройка векторов левая,в другом — правая. хотя, разумеется, на любом api нормалмапу можно в шейдере трактовать как угодно. ошибка вроде той, что в нульпосте, обычно получается именно при инвертировании только одной y-компоненты, так как нормалмапа выглядит корректно при одном направлении освещения и некорректно — при другом.

DjeeZ
> Не становится. Светотень такая же. Можно и так и так воспринимать.
> Просто нормалмапа это фейк, и надо это учитывать. При использование нормала
> полоса перепада высоты при виде сбоку остаётся плоской. Т.е. поверхность то всё
> равно плоская.
> Поэтому нужны дополнительные меры, кроме нормалмапы, чтобы подчеркнуть нужный
> рельеф. Подмешать амбиент к диффузу поможет дополнительно передать светотень.
> И лучше не делать так, что-бы перепад высоты был похож на букву S с одинаковой
> нижней и верхней частью. Чтоб глаз их не путал. Лучше сделать чтоб эти углы
> были разные по крутости и форме.
Вашу мысль понял, но не могу согласиться, что светотень такая же. Если нормали повёрнуты не туда, куда нужно,
то тени рисуются для другого типа поверхности - вогнутости, это хорошо видно на скринах или в движке.
Там с оригинальным зелёным каналом одна сторона ящика вогнутая, другая выпуклая,
напоминая чем то картинки со зрительными парадоксами. Но после инвертирования
этого самого зелёного канала, всё отображается как задумано с любого ракурса.

Ещё попробовал менять зелёный канал в нормалях для кирпичной кладки и асфальта - разницы не обнаружил.

Или всё таки инвертировать нужно для любых карт? Вроде так правильней получается?

Нет инвертировать не для любых, смотреть надо по ситуации.
Это вообще зависит от того в каком софте делаешь текстуры или пекешь нормалку.

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

SpeedLucky
> Нет инвертировать не для любых, смотреть надо по ситуации.
> Это вообще зависит от того в каком софте делаешь текстуры или пекешь нормалку.
Кстати, плагин запекания нормалей для фотошопа от nvidia все ругают, а там как раз можно любые оси инвертировать как угодно))

Suslik
> брехня
Не брехня. Можно было бы быть чуть внимательней. Я не писал что рельеф нельзя инвертировать. Тогда была бы брехня.
А писал, что у ТС в примере, при небольшом смещении камеры светотень не меняется. А меняется лишь восприятие.
Мне всё равно какой там рельеф для ТС правильный. Это точно только он знает.
MSA2
> но не могу согласиться
Можете.) Я не знаю какой рельеф вы закладывали изначально. Может у вас нормали и не в ту сторону. Но тогда они не в ту сторону на обеих картинках. Значит одну из них вы в любом случае восприняли неверно.
Но не хотите, как хотите. Потом столкнётесь с тем, что я писал. А вам еще предстоит, например, разобраться с текстурами для зеркально отраженных моделей. Будет время разобраться.
Будете писать: "DjeeZ, выручай, тут у меня криво вышло." А я такой:"Помнишь я писал, а ты не верил? Терь сам думай."))
А прогеры, они такие прогеры. Запекут один раз кубик да шарик, покрутят это в самописном шейдере, и думают что теперь они всё знают о том, как образуется видимый рельеф при использовании кем-то приготовленных текстур, у моделей, которые они используют.)

DjeeZ
> А прогеры, они такие прогеры.
то есть programming-дело вы не приветствуете а всячески поносите

Rikk
С чего бы это? Слишком толсто выворачиваете смысл. Вы бы уж:"Мужик, дай закурить" - использовали.)

Многие начинающие пользователи программы Cinema 4D не понимают как применить текстуры которые прилагаются к скаченным 3D моделям и именно об этом я и хотел бы рассказать вам. Для примера взял один из файлов с нашего сайта.
После скачивания различных файлов модель и текстуры могут лежать в отдельных папках или же все смешано в кучу. В нашем же случае все распределено по папкам. Для начала зайдем в папку с нашей моделью и откроем её в Cinema 4d.



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

[td]- Цвет (color или diffuse)
- Глянец (specular) в некоторых случаях подойдет и (Metallic)
- Нормали (normal map)
- Рельеф (displacement) в некоторых случаях подойдет (Roughness, bump) а так же если нету не чего из перечисленного то можно применить текстуру diffuse [/td]

В тех или иных случаях этот список может быть расширен дополнительными текстурами.

[td]- Прозрачность (alpha или opacity)
- Диффузия (AO)
- Самосвечение (glow)[/td]

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


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


Откроем папку с нашими текстурами кабана и посмотрим какие же текстуры у нас там находятся.


Как вы можете заметить в нашей папке есть Specular и Metallic которые оба подходят под параметр глянца, но в нашем случае я выбрал specular. А теперь давайте применим все данные текстуры к нашим параметрам в материале.


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


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

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