Правильная uv развертка в blender. Создание развертки для текстурирования с помощью Unwrap UVW. Подбор текстур, перепекание на UV

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

Расстояния мы берём обычные евклидовы:

Тривиальный алгоритм — перебор всех пар и вычисление расстояния для каждой — работает за . Ниже описывается алгоритм, работающий за время . Этот алгоритм был предложен Препаратой (Preparata) в 1975 г. Препарата и Шамос также показали, что в модели дерева решений этот алгоритм асимптотически оптимален.

Алгоритм

Построим алгоритм по общей схеме алгоритмов "разделяй-и-властвуй" : алгоритм оформляем в виде рекурсивной функции, которой передаётся множество точек; эта рекурсивная функция разбивает это множество пополам, вызывает себя рекурсивно от каждой половины, а затем выполняет какие-то операции по объединению ответов. Операция объединения заключается в обнаружении случаев, когда одна точка оптимального решения попала в одну половину, а другая точка — в другую (в этом случае рекурсивные вызовы от каждой из половинок отдельно обнаружить эту пару, конечно, не смогут). Основная сложность, как всегда, заключается в эффективной реализации этой стадии объединения. Если рекурсивной функции передаётся множество из точек, то стадия объединения должна работать не более, чем , тогда асимптотика всего алгоритма будет находиться из уравнения:

Решением этого уравнения, как известно, является .

Итак, перейдём к построению алгоритма. Чтобы в будущем прийти к эффективной реализации стадии объединения, разбивать множество точек на два будем согласно их -координатам: фактически мы проводим некоторую вертикальную прямую, разбивающую множество точек на два подмножества примерно одинаковых размеров. Такое разбиение удобно произвести следующим образом: отсортируем точки стандартно как пары чисел, т.е.:

Тогда возьмём среднюю после сортировки точку (), и все точки до неё и саму отнесём к первой половине, а все точки после неё — ко второй половине:

Теперь, вызвавшись рекурсивно от каждого из множеств и , мы найдём ответы и для каждой из половинок. Возьмём лучший из них: .

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

Для каждой точки из множества надо попытаться найти точки, находящиеся к ней ближе, чем . Например, достаточно рассматривать только те точки, координата которых отличается не более чем на . Более того, не имеет смысла рассматривать те точки, у которых -координата больше -координаты текущей точки. Таким образом, для каждой точки определим множество рассматриваемых точек следующим образом:

Если мы отсортируем точки множества по -координате, то находить будет очень легко: это несколько точек подряд до точки .

Итак, в новых обозначениях стадия объединения выглядит следующим образом: построить множество , отсортировать в нём точки по -координате, затем для каждой точки рассмотреть все точки , и каждой пары посчитать расстояние и сравнить с текущим наилучшим расстоянием.

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

Наконец, обратим внимание на сортировки, которых вышеописанный алгоритм содержит сразу две: сначала сортировка по парам (,), а затем сортировка элементов множества по . На самом деле, от обеих этих сортировок внутри рекурсивной функции можно избавиться (иначе бы мы не достигли оценки для стадии объединения, и общая асимптотика алгоритма получилась бы ). От первой сортировки избавиться легко — достаточно предварительно, до запуска рекурсии, выполнить эту сортировку: ведь внутри рекурсии сами элементы не меняются, поэтому нет никакой необходимости выполнять сортировку заново. Со второй сортировкой чуть сложнее, выполнить её предварительно не получится. Зато, вспомнив сортировку слиянием (merge sort), которая тоже работает по принципу разделяй-и-властвуй, можно просто встроить эту сортировку в нашу рекурсию. Пусть рекурсия, принимая какое-то множество точек (как мы помним, упорядоченное по парам ) возвращает это же множество, но отсортированное уже по координате . Для этого достаточно просто выполнить слияние (за ) двух результатов, возвращённых рекурсивными вызовами. Тем самым получится отсортированное по множество.

Оценка асимптотики

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

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

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

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

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

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

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

Реализация

Введём структуру данных для хранения точки (её координаты и некий номер) и операторы сравнения, необходимые для двух видов сортировки:

struct pt { int x, y, id; } ; inline bool cmp_x (const pt & a, const pt & b) { return a.x < b.x || a.x == b.x && a.y < b.y ; } inline bool cmp_y (const pt & a, const pt & b) { return a.y < b.y ; } pt a[ MAXN] ;

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

double ; int ansa, ansb; inline void upd_ans (const pt & a, const pt & b) { double dist = sqrt ((a.x - b.x ) * (a.x - b.x ) + (a.y - b.y ) * (a.y - b.y ) + .0 ) ; if (dist < ) = dist, ansa = a.id , ansb = b.id ; }

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

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

Наконец, множество хранится в том же массиве .

void rec (int l, int r) { if (r - l <= 3 ) { for (int i= l; i<= r; ++ i) for (int j= i+ 1 ; j<= r; ++ j) upd_ans (a[ i] , a[ j] ) ; sort (a+ l, a+ r+ 1 , & cmp_y) ; return ; } int m = (l + r) >> 1 ; int midx = a[ m] .x ; rec (l, m) , rec (m+ 1 , r) ; static pt t[ MAXN] ; merge (a+ l, a+ m+ 1 , a+ m+ 1 , a+ r+ 1 , t, & cmp_y) ; copy (t, t+ r- l+ 1 , a+ l) ; int tsz = 0 ; for (int i= l; i<= r; ++ i) if (abs (a[ i] .x - midx) < ) { for (int j= tsz- 1 ; j>= 0 && a[ i] .y - t[ j] .y < ; -- j) upd_ans (a[ i] , t[ j] ) ; t[ tsz++ ] = a[ i] ; } }

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

В предыдущем уроке мы ознакомились с базовыми методами проецирования текстур: параметрическим проецированием и внедрением текстур в виде проецируемых изображений (As Projection ) или по трафарету (As Stencil ). Данные методы удобны при проецировании простых моделей, однако их может оказаться недостаточно при текстурировании более сложных моделей (такие объекты обычно требуют совместного использования нескольких типов проецирования и (или) коррекции наложения текстурных координат), а для текстурирования моделей, раскрашиваемых вручную, они и вовсе не подойдут. В подобных случаях приходится создавать развертку модели в редакторе проекционных координат UV Texture Editor . С одной стороны, подобная развертка позволяет более тонко настроить параметры проецирования, благодаря чему искажения текстуры оказываются минимальными. С другой стороны, по такой развертке можно нарисовать любую, даже самую замысловатую текстуру, а затем разместить ее на поверхности объекта с учетом развертки. Рассмотрению простых приемов создания и раскраски UV-развертки и посвящен данный урок.

Теоретические аспекты

Развертка - это плоская карта объекта, на которой присутствуют все его элементы, но расположены они не в пространстве, а на плоской поверхности (рис. 1). То есть если воспринимать модель как реальное скульптурное изображение, а развертку нарисовать на обычном листе бумаги, то, разрезав развертку на отдельные фрагменты, мы сможем наклеить полученные кусочки бумаги на скульптуру, как бы одев ее в бумажный наряд. А потому суть проецирования материалов через UV-развертку состоит в том, чтобы имитировать разрезание внешней оболочка модели на отдельные фрагменты, разложить их на проекционной сетке (так называемом UV-пространстве), превратить полученную развертку в растровое изображение, разрисовать последнее и вновь наложить на поверхность модели.

Технически это выглядит следующим образом. Вначале поверхность объекта мысленно разбивается на фрагменты - во фрагменты объединяют находящиеся рядом грани, к которым будет применен один и тот же тип проецирования, а также одинаковый вариант раскраски. После этого для каждого из фрагментов создают развертку и все элементы развертки размещают на отведенном для этой цели поле редактора проекционных координат UV Texture Editor . Затем делается снимок развертки (UV Snapshot ), представляющий собой обычное растровое изображение. Данный снимок загружается в графическом редакторе, например в Adobe Photoshop, где по развертке (ее удобнее всего использовать в качестве верхнего слоя изображения) создается многослойная текстура (то есть развертка непосредственно разрисовывается), которая сохраняется в графическом файле уже в виде однослойного изображения. На последнем этапе необходимо вновь активировать Maya, создать новый материал, подключить у него на канале Color подготовленную текстуру и назначить данный материал модели, в результате чего текстура окажется наложенной на модель в точном соответствии с разверткой.

При проецировании материалов через UV-развертку следует иметь в виду следующие моменты:

  • в силу длительности и большой трудоемкости операций выделения граней и назначения группам граней вариантов проецирования обычно текструрируют несглаженные модели, сглаживают модели уже после наложения текстуры;
  • процесс выделения граней можно существенно ускорить, если выделять грани не обычным образом, а с применением выделяющей кисти, активируемой командой Edit =>Paint Selection Tool (Редактировать=>Выделяющая кисть). У данной кисти следует отрегулировать размер, после чего можно приступать к выделению, которое будет заключаться в рисовании (то есть проведении) данной кистью по выделяемым граням. При случайном выделении ненужной грани операцию можно тут же отменить;
  • обычно приходится выделять много граней, и совсем необязательно, что делать это придется однократно, поскольку далеко не всегда можно точно сказать, какой из вариантов проецирования обеспечит лучшие результаты. Чтобы избежать повторного выделения граней (что на порядок удлиняет процесс работы), в ряде случаев разумнее отдельные наборы граней запоминать в виде выделенных областей, применяя команду Create =>Sets =>Quick Select Sets (Создать=>Наборы=>Наборы быстрого выделения). После этого выделенную область можно в любой момент активировать, воспользовавшись командой Edit =>Quick Select Sets (Редактировать=>Наборы быстрого выделения).

В редакторе UV Texture Editor отображаются развертка с проекционными координатами и текстура. Если текстура не видна, то необходимо щелкнуть по кнопке Show Texture Image (Показать изображение текстуры) либо применить команду Image =>Display Image (Изображение=>Отображение изображения). Если текстура повторяется (а этого не требуется), то следует ограничить границы интервалов U и V , щелкнув на квадратике справа от команды Image =>Image Range (Изображение=>Интервал изображения) и выставив параметры Minimum U и Minimum V равными 0, а параметры Maximum U и Maximum V - 1.

UV-развертку можно использовать при текстурировании полигональных моделей и поверхностей с иерархическим разбиением (Subdivision Surfaces ). Команды, ответственные за работу с UV-координатами полигональной модели, находятся в меню Polygons редактора проекционных координат, а за управление UV-координатами подразбиваемых поверхностей отвечает меню Subdivs .

В окне редактора UV Texture Editor выделенные проекционные координаты можно перемещать, поворачивать и масштабировать. Для этого требуется перейти в режим работы с UV-координатами, применив команду UV из контекстного меню редактора, а затем воспользоваться инструментами Move Tool , Rotate Tool и Scale Tool . Кроме того, в отношении проекционных координат допустимо еще множество самых разных операций, доступных из меню редактора UV Texture Editor . Наиболее важные среди них следующие:

  • Normalize UV s (Нормализовать UVs) - размещает развертку внутри UV-пространства;
  • Flip UVs (Зеркально отразить UVs) - применяется для зеркального отображения проекционных координат;
  • Rotate UVs (Повернуть UVs) - позволяет повернуть выделенные UVs-координаты на строго заданный угол;
  • Map UV Border (Вычерчивание UV-границы) и Straighten UV Border (Выпрямление UV-границы) - предназначены для распутывания границ развертки вдоль выделенных UV-координат, что актуально, например, в случае, если граница образует петлю. Обе операции используются при подготовке к операции Relax UVs , которая работает лучше, если граница распутана. Операция Map UV Border позволяет расположить границу выделенного фрагмента UV-координат вдоль границ квадрата в диапазоне от 0 до +1 или окружности, вписанной в тот же квадрат. Операция Straighten UV Border подобных ограничений не имеет, и полученная после ее применения граница может иметь произвольную форму;
  • Relax UVs (Смягчить UVs) - позволяет распутать внутренние UV-координаты без нарушений границы развертки и, как правило, используется после применения операции Map UV Border либо Straighten UV Border ;
  • Layout UVs (Скомпоновать UVs) - обеспечивает расположение UV-координат так, чтобы они не перекрывали друг друга;
  • Align UVs (Выровнять UVs) - выравнивает проекционные координаты друг относительно друга;
  • Cut UVs (Разрезать UVs) - позволяет разрезать развертку на части вдоль выбранных ребер;
  • Sew UVs (Сшить UVs) - обеспечивает сшивание фрагментов развертки вдоль выбранных ребер;
  • Move and Sew UVs (Переместить и сшить UVs) - позволяет сшить фрагменты развертки вдоль выбранных ребер с перемещением фрагментов друг к другу (меньший фрагмент перемещается к большему);
  • Merge UVs (Слить UVs) - позволяет слить выделенные координаты вместе (таким образом объединяются только координаты, разделяющие одну и ту же вершину); данная операция заменяет обычное сшивание, однако лучше подходит для слияния полигонов с однотипной геометрией, в то время как Sew UVs предпочтительно выбирать при сшивании разнотипных полигонов;
  • Delete UVs (Удалить UVs) - используется для удаления ненужных проекционных координат;
  • UV Snapshot (Снимок UV) - позволяет сохранить расположение UV-координат в графическом файле, который затем может применяться в качестве шаблона для рисования текстуры в Paint Effects или в любом графическом редакторе.

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

Для начала рассмотрим пример текстурирования игральной кости, на разных гранях которой должно быть от одной до шести точек. Сформируйте обычный полигональный куб (рис. 2). Поскольку мысленно разрезать куб по ребрам для получения его развертки не составляет труда, то несложно представить, как будет выглядеть необходимая текстура. Поэтому сразу откройте любой графический редактор, создайте в нем новое изображение размером 600x800, включите сетку и установите направляющие, разбив изображение на три квадрата по вертикали и на четыре - по горизонтали. Нарисуйте в определенных квадратах круги так, как показано на рис. 3. Сохраните полученное изображение в виде файла в формате JPG (рис. 4). Переключитесь в Maya и для отображения текстур в окне перспективы включите режим аппаратного текстурирования, воспользовавшись командой Shading =>Hardware Texturing (Затенение=>Аппаратное текстурирование). Откройте редактор Hypershade , создайте новый Blinn-материал, обычным образом (то есть в режиме As Normal ) подключите на канале Color нарисованную текстуру и назначьте данный материал кубу. Результат окажется совсем не таким, как хотелось бы, поскольку текстура на каждой из граней будет отображена в полном своем объеме, а не по квадратам (рис. 5).

Попробуем исправить ситуацию. При выделенном в окне проекции Perspective кубе откройте редактор проекционных координат, применив команду Window =>UV Texture Editor . поскольку куб является примитивом, то UV-координаты для него генерируются автоматически и потому развертка текстуры уже имеется, но ее положение по отношению к текстуре далеко от желаемого (рис. 6). Имейте в виду, что увидеть развертку в представленном на рис. 6 виде, скорее всего, вы сможете только после уменьшения масштаба ее отображения, что выполняется с помощью мыши точно так же, как и в окне проекции. К тому же обратите внимание, что размер развертки гораздо больше размера текстуры. Поэтому необходимо подогнать развертку по текстуре - в данном случае потребуется операция масштабирования. В окне UV Texture Editor щелкните правой кнопкой мыши и выберите команду UV (это позволит работать на уровне UV-координат), выделите все вершины куба и, воспользовавшись инструментом Scale Tool , уменьшите развертку так, чтобы текстура была наложенам требуемым образом (рис. 7 и 8).

Рис. 6. Развертка в окне UVTextureEditor

Создание развертки

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

Рассмотрим пример текстурирования обычного полена, в роли которого будет выступать полигональный цилиндр. Текстура на боковой поверхности объекта и торцах должна быть различной, а потому без построения развертки не обойтись. Создайте цилиндр, выделив его, откройте редактор проекционных координат, где будет отображена автоматически назначенная цилиндру как примитиву UV-развертка (рис. 9). Однако, руководствуясь ей, нужный по замыслу вариант текстурирования не реализовать, поэтому переключитесь в режим работы с текстурными координатами (команда UV из контекстного меню UV Texture Editor ), выделите все координаты развертки и удалите их при помощи команды Polygons =>Delete UVs (Полигоны=>Удалить UVs).

Перейдите в режим работы с гранями, нажав клавишу F11. Активируйте выделяющую кисть (команда Edit =>Paint Selection Tool ) и выделите ею все грани боковой поверхности цилиндра (рис. 10). Назначьте данным граням цилиндрическое проецирование, применив команду Edit Polygon s =>Texture =>Cylindrical Mapping (рис. 11). Переместите созданный фрагмент развертки на свободное пространство (рис. 12) - если этого не сделать, то следующий фрагмент развертки будет наложен на только что созданный, после чего разобраться с ними будет проблематично. Из граней верхней поверхности цилиндра создайте новое выделение и назначьте данным граням планарное проецирование, воспользовавшись командой Edit Polygons =>Texture =>Planar Mapping (рис. 13). Переместите полученный фрагмент развертки на свободное пространство. Аналогичным образом создайте фрагмент развертки для нижней поверхности. В режиме работы с UV-координатами (команда UV из контекстного меню) выделите все три фрагмента развертки, уменьшите их масштаб и переместите внутрь UV-пространства (рис. 14). Создайте снимок развертки, открыв из меню Polygons команду UV Snapshot (Снимок проекционных координат) и в появившемся диалоговом окне указав имя файла (поле File Name ), размер (поля Size X и Size Y ) и формат изображения (список Image Format ). Имейте в виду, что изображение должно иметь размер не менее чем 512х512, а лучше - 1024х1024.

Рис. 10. Выделение граней боковой поверхности цилиндра инструментом PaintSelectionTool

Откройте полученный графический файл в любом графическом редакторе (мы выбрали Paint Shop Pro) - рис. 15. Создайте дубликат слоя с разверткой, а затем установите под него слой с фоновым изображением, а также слои со спилами и текстурой коры (рис. 16). Сделайте слой с копией развертки невидимым (рис. 17) и сохраните изображение в графическом файле с объединением слоев (рис. 18). Откройте созданное изображение текстуры (уже однослойной) в графическом редакторе, переведите изображение в режим Grayscale и увеличьте контрастность изображения (рис. 19), сохраните изображение под другим именем.

Переключитесь в Maya, создайте новый Lambert-материал и установите для него на канале Color в качестве текстуры первое созданное изображение. Подключите вторую (черно-белую) текстуру на канале Bump и подберите подходящее значение параметра Bump Depth (мы остановились на значении 0,2). Проведите рендеринг, и вы увидите примерно такое же полено, как представлено на рис. 20.

А теперь несколько усложним задачу: текстурируем объект, полученный из полигонального цилиндра путем экструдирования граней (рис. 21). Попробуем назначить ему такую текстуру, чтобы данный объект стал напоминать набор выстроенных в ряд детских кубиков с буквами алфавита. Сложность в том, что при формировании развертки придется не только учитывать то, какие грани следует объединять вместе, но и добиться минимальных искажений текстуры, поскольку буквы должны иметь одинаковый размер на всех кубиках и не быть растянутыми. Поэтому создайте новый материал, подключите у него на канале Color шахматную текстуру и назначьте данный материал объекту (рис. 22) - изначально ничего хорошего не выйдет, поскольку сгенерированные первоначально для куба UV-координаты совершенно не соответствуют модели.

В режиме работы с UV-координатами выделите все координаты и удалите их командой Polygons =>Delete UVs . Выделите грани одной из боковых поверхностей объекта и назначьте им автоматическое проецирование (Edit Polygons =>Texture => Automatic Mapping ) - рис. 23. Переместите фрагмент на свободное пространство. Выделите грани другой боковой поверхности, также назначьте им автоматическое проецирование и вынесите фрагмент развертки за пределы UV -пространства. Аналогичные операции произведите для двух других боковых поверхностей, а потом и для двух оставшихся отдельных граней (рис. 24). Перейдите в режим работы с UV-координатами, выделите все текстурные координаты боковых поверхностей и масштабируйте их так, чтобы размер квадратов шахматной текстуры на всех поверхностях стал одинаковым (рис. 25). По окончании все фрагменты развертки равномерно масштабируйте и разместите внутри UV-пространства (рис. 26). Создайте снимок развертки, применив команду Polygons =>UV Snapshot .

Откройте полученный графический файл в графическом редакторе. Создайте дубликат слоя с разверткой, а затем установите под него слой с фоновым изображением и слой с цветными квадратами, на каждом из которых находится по букве (рис. 27). Сохраните данную текстуру как однослойное изображение. Переключитесь в Maya и замените шахматную текстуру на только что созданную - это приведет к получению имитации набора из пяти кубиков (рис. 28).

Поскольку основы - они и в Африке основы, то принципы работы с UV-развёрткой, почерпнутые из этой статьи, вы сможете применить работая и в других 3D редакторах. Единственное отличие будет в названии кнопок и инструментов.

Автор этой статьи - уважаемый мной 3D моделер техники в 3ds Max - Александр Барсуков , известный еще под ником DesertBull. Так что публикую я статью как есть.

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

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

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

Многие работают с модификатором UVW Map. Я же работаю с модификатором UVW Unwrap. Почему? Потому что что это абсолютно такой же модификатор, только при этом с кучей дополнительных возможностей. Настоятельно рекомендую работать именно через Unwrap.

Что ж приступим.

У нас есть простая модель.

Текстурирование и другие аспекты работы с CG Вы можете изучить на онлайн курсе по 3D графике "CG generalist" в онлайн школе CGTarian.

В настройках карты Bitmap есть опция UV Offset. Она позволяет использовать не только пространство внутри стандартного UV квадрата под свои текстуры, но также пространство вокруг этого квадрата.

О том, как это сделать смотрите в видео уроке по :

Программу 3ds Max с возможностью создания пользовательских инструментов, для качественного и быстрого создания проекта, а также другие программы включая AutoCAD Map 3D 2018, AutoCAD Civil 3D 2017 можно приобрести на сайте architect-design.ru .


Подробнее о создании работы "Побег" читайте в P.S.

ВАЖНО! Прочитайте этот абзац, если вы тут впервые! Вам попасть на мой блог! И хотя, вы НЕ найдёте здесь ссылки на крякнутый 3dsMax2012 (только на лицензионный, который можно скачать бесплатно), НО зато на моём блоге я выкладываю свои шикарные (так говорят, те кто их видел, а не я) БЕСПЛАТНЫЕ и , а также кучу другой полезной информации, которую вы не найдёте больше нигде в интернете: , и др.

Ссылки для скачивания.

Лицензионный диск 3ds Max (полностью рабочая версия без ограничений на протяжении 30 дней) можно скачать бесплатно :

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

Продолжаем работу над дизайном скрипки. Эта статья является по своей сути очень подробной инструкцией по тому, как делать UV мапинг и тому, как использовать модуль Render To Texture

Этапы, которые мы рассмотрим:

1. UV -мапинг;

UV

1. UV мапинг

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

Хорошие текстуры способны формировать отличную визуальную составляющую, вытягивая тем самым порой кривую модель и, наоборот, плохие текстуры, плохо подобранные могут испортить даже очень качественную сетку. В основе качественного текстурирования лежит корректный UV -мапинг (uv mapping). Именно правильно созданные UV развертки являются верным залогом качественных текстур. Это базис!

С него и начнем:

При работе со скрипкой я решил не обращаться к сторонним приложениям типа UV Layout или Unfold 3 d . Мне захотелось обойтись лишь силами Unwrap UVW среды 3 ds max 2015. У модификатора этой версии множество инструментов, делающих uv -мапинг достаточно комфортным, чего не скажешь о более ранних версиях. Также я не стал вопреки своей профессиональной привычки пользоваться сторонними пакетами для 3 d -текстурирования. Лишь Photoshop и Render To Texture . Ведь швы никуда не исчезают…

Начинаем с основы. Добавляем к ней модификатор Unwrap UVW :

Далее заходим в UV Editor и выбираем команду Flatten Mapping :

Настройки Flatten оставляем по умолчанию, жмем Ok :

Начинаем сортировать UV карту. Как правило, если я использую Flatten Mapping в качестве стартовой токи для раскладки, то стараюсь выделить все мелкие кусочки (UV зерна) и выкинуть их за пределы квадратного поля текстуры. В начале работы фокусируемся на самых больших элементах, а мелочь после:

Результат сортировки:

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

И перехожу во вьюпорт макса, чтобы отследить выделение на самой модели. Как видите попадаются полигоны, которые не выделились. Это те полигоны, которые оторваны от основной части и находятся в «зернах», которые мы выкидывали из текстурного поля несколько ранее:

Выделяем эти полигоны отдельно:

Теперь все элементы собираем вместе и выделяем. Снова переходим в Mapping и выбираем Normal Mapping . Здесь следует подобрать экспериментальным путем направление проецирования. Правильное направление даст вам форму основу деки максимально похожей на истину:

Теперь самое время применить к нашей модели материал с картой Checker (шахматка). Сейчас я решил использовать в качестве проецируемой текстуры не банальную черно-белую шахматку, а цветовую карту с цифрами. Ей удобнее пользоваться:

Регулируем тайлинг, чтобы квадратиков стало больше. В 3 ds max Design за тайлинг отвечает показатель Size :

Судя по тому, что квадратики выглядят как прямоугольники, очевидно UV карта сильно сжата. Д авайте растянем ее вертикальным масштабированием:

Примерно такой результат должен получиться. Контролировать процесс можно по квадратикам. Как только они станут максимально квадратными, процесс можно закончить:

Я еще немного регулирую размер основных фрагментов и ориентирую их в квадратном поле наиболее оптимальным образом; так, чтобы потом удобнее было работать на стадии текстурирования:

Пришло время заняться мелкими фрагментами. Это внутренние грани вырезов деки – эфов:

Очевидно, здесь придется немного попотеть – вручную осуществить сшивку швов (Stich Selected ). Но прежде чем мы займемся этим советую назначить команду stich selected на какую-нибудь горячую клавишу, иначе замучаетесь, ведь применять эту команду предстоит с частотой пулеметной очереди. Переходим к меню Customize-Customize User Interface :

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

Далее снимаем выделение с ребер и выделяем только одно какое-то ребро в редакторе UV . Выделенное ребро примет красный цвет, а ребро, соответствующее ему станет синим. Тем самым 3ds max указывает нам на нужные ребра, которые нужно сшить:

Жмем клавишу, которую назначили на команду Stich (в моем случае это клавиша S ). Когда этот процесс будет полностью закончен, мы получим примерно такой результат:

Применяем команду Tools Relax (Распустить), чтобы снять напряжения с фрагмента и разровнять UV :

Роспуск осуществляем по полигонам:

Следует несколько фрагментов разделить, чтобы разместить в квадратном поле:

Теперь стоит выровнять ребра по горизонтали и по вертикали, т.к. если присмотреться во вьюпорте, легко можно понять, что эти ребра абсолютно ровные как по горизонтали, так и по вертикали:

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

Также поступаем с вертикальными ребрами:

В результате мы должны получить примерно такой результат:

Далее нам следует упаковать UV карту. Обратите внимание, что полоски, которые являются внутренними гранями вырезов – эфов значительно меньше оснований, поэтому их следует уменьшить (опять – таки ориентируйтесь по цветовой карте во вьюпорте, квадратики должны быть везде одного размера, тогда разрешение текстуры на все поверхности будет одинаковым). Результат упаковки:

В заключение я всегда запекаю шаблон, для последующего применения в фотошопе. Для этого заходим в Tools – Render UV Template.

Читай эксклюзивные статьи первыми

Здесь всего лишь выбираем разрешение. Я выставляю разрешение 4 k (4096 x 4096). Как можете понять текстура будет квадратной. Сохраняем готовый шаблон в формате png с альфа-каналом (в этом вся суть, он должен быть прозрачным):

После обязательно сворачиваем стек, чтобы сохранить UV координаты в геометрии модели:

У меня получился такой результат:

Аналогично проводим работу с остальными элементами. Это, например, кант деки:

Гриф скрипки:

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

Далее снова выделяем весь объект и применяем Flatten Mapping для начальной раскладки:

Получаем такой результат:

Далее я начинаю делить отдельные фрагменты (Break ), такие как спираль на рисунке ниже. Если этого не сделать, то распускание подобных элементов будет более проблематичным, еще я сшиваю отдельные фрагменты в одно целое:

К отделенному кусочку мы применим планарное проецирование и выбираем соответствующую ось. Вы поймете, что ось выбрана правильно, когда плоскость проецирования модификатора Unwrap UVW будет параллельна обрабатываемой поверхности:

Результат:

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

Результат:

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

Обратите внимание на разницу в размерах квадратов текстуры:

Повторите процедуры с остальными фрагментами, которые описаны в этом способе и чуть ранее:

После чего упакуйте текстуру в квадратное поле:

Не устану повторять важные моменты: сверните стек модификаторов, чтобы прописать UV координаты в меш. Только после этого можно считать создание uv развертки законченным. Далее следует добавить Symmetry и свернуть стек еще раз:

После обработки всех элементов мы получим примерно такой результат:

2. Подбор текстур, перепекание на UV

Начнем с подбора текстур. Итак для нашей скрипки я подобрал несколько текстур с хорошей фактурой дерева, текстуры на всякий случай тайлинговые, то есть бесшовные. Они будут применяться для деки и грифа:

Для канта деки скрипки я подобрал немного другую текстуру, чтобы выделить фактуру дерева на нем немного больше:

Обратите внимание на мост скрипки, который натягивает струны:

Чем-то напоминает текстуру пробки. Я сумел подобрать что-то подобное:

Не совсем то. Поэтому я подобрал более древесную текстуру (на стадии композитинга совместим эти текстуру и постараемся приблизиться к оригиналу):

К темным деталям скрипки типа грифа и струнодержателя я подошел немного оригинально. Я не стал «закрашивать» эти элементы в сплошной черный. Вместо этого я подобрал готовый материал VRay , имитирующий карбоновый пластик. Из него я выделил базовую текстуру, которую и применил дальше к темным деталям:

Базовые текстуры мы подобрали!

Как видите, не густо.

С этим мы и будем работать.

Теперь переходим к запеканию текстур. Рассмотрим этот процесс также на основе деки. Прежде всего к ней снова нужно применить модификатор Unwrap UVW , зайти в UV редактор и сохранить UV пресет.

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

Сохраняем:

Теперь настраиваем материал и применяем его к нашей основе:

В канал Diffuse закидываем первую текстуру для основы деки и грифа:

Добавляем модификатор UVW Map , чтобы настроить проецирование (вот с этого момента как раз UV координаты сбиваются, для этого мы их и сохраняли немного ранее):

Получаем вот такой результат:

Я немного меняю показатели Size , чтобы подкорректировать тайлинг, также можно поиграться со значениями сдвига Offset :

После всех настроек сворачиваем стек:

Теперь жмем клавишу «0», чтобы вызвать диалоговое окно Render To Texture . Как только вы выделите свой объект, он тут же загрузится в список Object To Bake :

В том окне мы и будем проводить т.н. texture baking. Для дальнейшей работы нам потребуется визуализатор Vray. Благодаря ему мы сможем отрендерить текстуры без запекания освещения (позже я покажу вам разницу):

Теперь переходим к разделу Output , чтобы настроить выводные данные. Здесь мы жмем кнопку Add (Добавить), появляется список добавляемых элементов:

В этом списке мы выбираем для рендеринга элемент VRayDiffuseFilterMap :

Далее настраиваем разрешение запекаемой текстуры 4096 x 4096 пикселей (наподобие того как мы рендерили шаблоны), на всякий случай включите замочек, чтобы сохранились пропорции:

Текстуру также как и шаблоны сохраняем в формате png с альфа-каналом:

В Target Map Slot выбираем Diffuse Color , чтобы указать программе, что в канале карты должна находиться цветовая карт (Diffuse Color ):

Теперь жмем кнопку в самом низу Unwrap Only , в стеке модификаторов появляется Automatic Flatten UVs . Эта штуковина проецирует имеющуюся UV карту и запекает по ней текстуру:

Он работает аналогично модификатору Unwrap UVW , в нем даже кнопки такие же, выбираем его и открываем редактор UV :

Как видите uv карта не та, что мы создавали. Кстати только что исходные UV координаты сбились еще раз. Вот почему важно было их сохранить. В редакторе жмем File Load UV :

И загружаем сохраненную UV карту:

Результат:

И жмем кнопку Render , начинается запекание текстуры, открывается два фрейм буфера: Windows Frame Bufer , который нам не нужен, вслед за ним открывается VRay Frame Bufer . В нем для наглядности я переключаюсь с RGB Color на VRayDiffuseFilterMap , та самая карта, которую мы и запекаем:

Обратите внимание на эффект запекания свето-теней на текстуре:

VrayDiffuseFilterMap исключает подобные недоразумения .

Теперь применяем к нашей основе созданную UV текстуру:

Однако нужно вернуть сбитые многократно UV координаты на свое место. Для этого добавляем в стек модификатор Unwrap UVW :

Открываем редактор UV и загружаем ту же самую карту, которую сохраняли:

Результат:

В итоге текстура ложится так как надо.

Так мы и подготовили необходимые текстуры для работы в 3ds max.

Теперь разберем еще один важный момент связанный с проецированием UVW Map . Итак кант деки:

Я также применил к нему модификатор UVW Map , но проецирование в отличие от предыдущего режима Planar назначил режим Cylindrical . И обратите внимание, как распределяется текстура:

Возникает радиальное растяжение на нижней части канта. Это исправляется совмещением разных текстур в Photoshop . Т.е. сначала мы перепекаем на текстуру такой вариант как на картинке. Затем я меняю направление проецирования и повторяю процесс перепекания.

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

.