# Содержание:

- Введение (aka Intro)
- 1.1. Подготовка рабочей области (aka Getting Started)
- 1.2. Низкополигонное моделирование персонажа (aka LowPoly Modelling)
- 1.3. Сглаживание сеточного каркаса. (aka Smoothing Groups Tuning)
- 2.1. Создание текстурной развёртки модели (aka UV-mapping)
- 2.2. Создание текстуры (aka Texturing)
- 3. Привязка сеточного каркаса к стандартному скелету (aka Rigging)
- 4.1. Экспортирование модели в UT2003
- 4.2. Создание дистрибутива
- Приложение: неполадки (aka Troubleshoothings)
- Вместо заключения... (aka To Be Continued)

# Введение.

Данная статья посвящена процессу создания, текстурирования и анимирования модели персонажа с целью последующего экспортинга в UT2003. На написание меня подтолкнули несколько вещей. Во-первых, создать что-то своё всегда намного приятней, чем переделывать чужое. Посмотрите, И-нет завален скинами для имеющихся моделей, а хороших моделей раз, два и обчёлся. Во-вторых, среди этих моделей ни разу не встречал модели отечественного производства. Даже для CS доля отечественных моделей мала! В-третьих, UT – эта одна из моих любимых игр. В-четвёртых, движок Unreal Warfare обладает такой гибкостью, которая никакому другому движку и не снилась. Имеется даже встроенный Си-скриптовый компилятор! В-пятых, я ни разу не встретил туториала, охватывающего весь процесс работы сразу. А имеющиеся уроки типа «лофтанём экструднутый сплайн» трудно отнести к материалам для широкого круга моделлеров. У каждого свой уровень навыков работы, новичкам такие материалы просто не по зубам. Я постарался, насколько возможно, сделать материал по сложности менее агрессивным к навыкам работы. В материале куча иллюстраций, а ключевые моменты работы можно посмотреть в файлах сцен. По ходу дела я старался объяснить смысл того или иного действия. Часто описание работы типа «кликни сюда, кликни туда, сделай то, сделай сё» кажутся нелогичными, а потому воспринимаются плохо (по себе знаю). В-шестых, на движке Unreal Warfare делается целая куча игр. Изучив этот туториал, Вы сможете делать модели и для них! В-седьмых, в данном материале непосредственно к UT2003 относится лишь глава о экспортинге – всё остальное большой урок по созданию персонажа вообще. Заменив последний этап, получаем возможность засунуть модель и в другие игры, даже не на движке Unreal Warfare. В-восьмых, UT2004 будет полностью совместим с UT2003, а значит, процесс разработки моделей одинаковый! Двух зайцев одним залпом (из BFG ;). Ну и, в-девятых, надоели туторы по созданию персонажей типа "Мистер 10 полигонов", "Буратино в стадии заготовки" и т.п. Захотелось что-нибудь посерьёзней :).

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

- Средний уровень владения ОС (элементы интерфейса, работа с файлами).
- Базовые навыки работы в Фотошопе (маски, фильтры, кисти, слои).
- Базовый уровень владения 3Ds MAX (примитивы, понятие вершин и полигонов, материалы, основные операции с объектами – вращение, перемещение и масштабирование, понятие текстуры).
- Владение английским для ускорения процесса освоения программ.
- Хотя бы примитивные познания в изобразительном искусстве и рисовании.
- Голова на плечах и растущие, откуда надо, руки :-)).

Если чем-то из вышеперечисленного Вы не владеете (кроме последнего, тут уже ничем не поможешь :), почитайте книжки класса «для новичков» и аналогичного направления материалы в И-нете.

Для работы нам понадобится несколько программ: 3Ds MAX v5.1 (в теории, можно и 5, но примеры заточены именно под 5.1), Photoshop v7 (можно и 6), Deep Paint 3D v2.1 (30-дневную trial-версию можно взять тут, 19.1Mb). Совместно с Photoshop’ом можно использовать Painter v7 и выше для рисования текстур. Не плохо было бы использовать хотя бы простенький планшет. К тому же, понадобятся два бесплатных плагина ActorX (для экспортирования моделей в UT2k3) и Textporter (для генерации раскраски текстур, хотя, можно обойтись и без него). Из железа потребуется не менее 256 Mb оперативки (Макс, Deep Paint 3D и Фотошоп, загруженные одновременно – это серьёзно) и процессор, способный тянуть всю эту «компанию».

О настройках 3Ds MAX. Во-первых, идём в Customize > Preferences > Viewports > Configure Driver и устанавливаем Background Texture Size/Download Texture Size на максимум, отмечаем опции Match Bitmap as Close as Possible. Во-вторых, проверьте в настройках viewport’а Perspective > Configure, включена ли во вкладке Rendering Method опция Shade Selected Faces. Она должна быть включена (в Максе версии 5.1 включена по умолчанию, а в 5 - нет). При установке Deep Paint 3D не забудьте указать инсталлятору установить плагины для 3DsMAX5 и Photoshop7(6). Без них нельзя будет осуществить взаимодействие между указанными пакетами.

Когда понадобится обменяться данными с Deep Paint 3D из Фотошопа или Макса, отключите брандмауэр, особенно, это касается Outpost Firewall любой версии. Дело в том, что он блокирует работу NetBIOS, посредством которого плагины передают данные.

Не забудьте пропатчить Unreal Tournament 2003 до версии не ниже 21.86.

Главное, что Вы должны сделать совершенно самостоятельно – заиметь изображение персонажа (концепт-арт в боковой, задней и передней проекциях), которого собираетесь смоделировать. Нарисуйте сами, попросите друзей или, наконец, поройтесь в Интернете. В данном туторе концеп нарисован мною лично, и искать ничего не придётся, но в другом случае начинайте работу именно с создания концепта.

В общем, всё. Если готовы, можете приступать к изучению материала :-)) Удачи!

Вернуться к содержанию

# 1.1. Подготовка рабочей области.

Сцена scn1.max содержит скелет наёмника (MercMaleA aka Male Mercenary), который мы будем использовать в качестве эталона габаритных параметров. К тому же, для анимации нашей модели мы возьмём именно этот скелет.

Открываем вышеуказанный файл – видим скелет.

Выбираем в панели Create стандартных примитивов (Standard Primitives) инструмент Box.

Теперь разворачиваем свиток Keyboard Entry и заполняем поля так: Height – 235.0, Width – 200.0, Lengh – 64.0 (вообще-то, не возбраняется создавать box и вручную мышкой).

А потом жмём на кнопку Create, тем самым создаём box, который целиком покрывает эталон, таким образом, мы задали габариты будущей модели, к тому же этот параллелепипед мы используем в качестве рабочего пространства. Пока спрячем скелет (Hide Selection).

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

Переделываем box в рабочее пространство для моделлинга. Выделяем наш box и применяем к нему модификатор EditMesh из панели Modify.

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

Так вот у нормалей есть одно свойство – если они ориентированы от камеры, то полигон невидим.

В нашем случае, это свойство может быть полезно.

Возвращаемся к модификатору EditMesh. Щёлкаем на кнопку Polygon – так мы переходим к редактированию box’а на уровне полигонов. Заодно ставим птички напротив Ignore Backfacing и Show Normals.

Выделяем все полигоны (мышкой во viewport’е или нажатием Ctrl+A). Они окрасились в красный цвет, и стали видны нормали.

Теперь (звучит немного безумно) вывернем box наизнанку, иными словами, ориентируем нормали внутрь куба. Щёлкаем кнопку Flip в свитке Surface Properties.

Мы беспрепятственно видим внутренность box’а.

Это нам и надо. Выделяем П-образно стороны box’а

и нажимаем на клаве кнопку Delete. Они нам больше не понадобятся! Зато понадобится оставшаяся П-образная конструкция.

На втором этапе мы подготовили место работы и познакомились с модификатором EditMesh – он нам ещё не раз пригодится ;)). См. scn3.max

Теперь мы «наклеим» на полученную конструкцию различные проекции нашего персонажа. Открываем редактор материалов (клавиша M) и в свитке Maps жмём кнопку напротив пункта Diffuse Color.

Затем в появившемся списке выбираем пункт Bitmap.

Находим графический файл с проекциями персонажа Model.jpg. Мы попадаем в дочерний материал. Возвращаемся на уровень вверх

и кликаем Show Map in Viewport (отображение материала в viewport’е).

Осталось только наложить картинку на полигоны. Для этого в модификаторе EditMesh снова переходим на уровень редактирования полигонов и выделяем больший из трёх имеющихся полигонов.

В свитке Edit Geometry кликаем Detach, чтобы «отрезать» этот полигон от общей конструкции.

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

Таким образом, отрезанный полигон стал новым объектом. Действуя аналогично, отрезаем меньший полигон. Назовём его Left. Оставшийся полигон назовём Back (поскольку кроме него ничего от конструкции не осталось, то надо просто переименовать сам box).

Теперь у нас на сцене видны три прямоугольника: Front, Back и Left. Выделяем Front и применяем к нему модификатор UVW Map из панели Modify.

Этот модификатор позволяет нам наложить материал на плоскость Front. Как станет видно позднее, на самом деле, мы сгенерировали для полигона его текстурные координаты. Чтобы координаты были правильными, надо повернуть плоскость проецирования, для этого отметим в группе параметров Alignment пункт Y и кликаем кнопку Fit.

Вуаля! Проекционная плоскость точно совпадает с нашим прямоугольником Front. Аналогично поступаем с Left и Back, только для Left вместо Y отмечаем пункт X. Текстурные координаты на все три плоскости наложены – осталось наложить материал.

Выделяем все три плоскости, открываем окно редактора материалов и применяем созданный ранее материал к плоскостям нажатием кнопки Assign Material to Selection.

Закрываем окно редактора материалов. Упс… Как-то кривовато выглядят текстуры. Сейчас исправим :)

Выделяем Back. В модификаторе UVW Map выбираем уровень редактирования проекционной плоскости – Gizmo.

Активизируйте viewport Front. Переместите Gizmo так, чтобы половинка вида со спины проходила через координатную ось Z. Небольшой перекос устраняется поворотом Gizmo на несколько градусов по часовой стрелке.

Аналогично поступаем с плоскостью Front: во viewport’е Back перемещаем Gizmo так, чтобы половинка с фронтальным видом персонажа также проходила через Z.

И, наконец, Left. Как нетрудно заметить, надо сначала активизировать viewport Right. Для Left одними перемещениями Gizmo, увы, не отделаться. Сначала кликаем View Align, потом Fit. Так мы повернём боковую проекцию персонажа в вертикальное положение.

А теперь устраним сжатие по горизонтали – в поле Width введём значение 182.0.

Перемещаем Gizmo так, чтобы ось Z проходила через основание наколенника.

Перемещаем у каждой плоскости Gizmo так, чтобы обувь персонажа максимально точно касалась плоскости XY.

Ура! Пространство для моделлинга готово. У нас получилась сцена scn4.max.

Вернуться к содержанию

# 1.2. Низкополигонное моделирование персонажа.

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

Основным инструментом моделлинга является модификатор EditMesh. Хочу отметить несколько опций, общих для всех уровней редактирования.

Ignore Backfacing – игнорирует выделение элементов, нормали которых не ориентированы в сторону камеры. Попробуйте поэкспериментировать сами – это очень просто. В нашем случае, включение данной опции означает, что если мы выделим лицо персонажа, то затылок останется невыделенным! В свитке Edit Geometry полезно знать о Collapse (коллапсирование – преобразование выделения в вершину), Make Planar (сделать выделение плоским), Bevel/Chamfer (сделать закругление элемента), Extrude (экструдирование выделения – выдавливание в направлении нормали), Break/Divide (разбивает каждый элемент выделения пополам), Attach/Detach (присоединение/отделение выделения) и, конечно, Create (создать элемент). В данном случае, под словом «элемент» стоит понимать единицу любого уровня редактирования Vertex/Edge/Face/Polygon/Element, а не только Element.

Активируем в нашей сцене правый viewport. Создаём вручную box в области ступни. Щёлкаем на нём правой кнопкой мыши и в контекстном меню выбираем пункт Properties.

В открывшемся окне Object Properties в группе Display Properties ставим галочку напротив See-Through (полупрозрачность) и, желательно, напротив Vertex Ticks (принудительное отображение вершин). Так мы сделаем наш box полупрозрачным, а значит, сквозь него будет виден концепт-арт персонажа. Переименуем Box01 во что-нибудь более подходящее, например, Erazer. Таково имя персонажа, которого мы «вылепим» из одноимённого box’а.

Щёлкаем снова правой кнопкой мыши на Erazer и в контекстном меню выбираем пункт Convert To > Convert To Editable Mesh. Так мы перешли от конкретного примитива Box к сеточному каркасу Editable Mesh, который далее я буду называть просто сеткой. Суть наших дальнейших действий проста – мы будем сантиметр за сантиметром выращивать тело персонажа (вообще-то, только половину тела). В свойствах viewport’ов отметим галочкой строку Edged Faces - отображение рёбер на сетке.

Теперь на уровне вершин подгоняем сетку под картинку. У нас должно получиться что-то вроде этого.

Переходим на уровень полигонов и проводим несколько разрезов инструментом Cut: последовательно щёлкаем по рёбрам. Два клика – один разрез.

Проводим разрезы сверху и по бокам, перемещаем вершины снова, кое-где склеиваем вершины. Должно получиться, как в scn5.max. Когда мы двигаем вершины, подгоняя форму сетки под рисунок, главное – чётко представлять себе, что должно получиться и как оно должно выглядеть!

Хочу заметить один момент при разрезании рёбер. Макс не всегда разрезает рёбра правильно с точки зрения симметрии разреза, а значит, и удобства дальнейшего моделирования. Загляните в файл edges_cutting.max, где я максимально наглядно постарался показать действия по оптимизации разреза.

Проведём ещё один разрез,

при необходимости, манипулируя вершинами и поворачивая рёбра инструментом Turn. Для удобства обозрения всех рёбер можно сделать невидимые рёбра видимыми. Для этого выделяем в режиме Edges все рёбра и кликаем кнопку Visible из группы Surface Properties.

При разрезании иногда возникает и другая проблема – совпадающие вершины.

Они должны быть нещадно склеены!

См. scn6.max. Замечу, я отключил сглаживание между треугольниками, оно не должно пока нас сбивать с толку.

Склеиваем указанные в scn7.max вершины для уменьшения числа полигонов. Это делается для того, чтобы максимально «облегчить» (по числу вершин) полигон, который мы далее будем экструдить.

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

и экструдируем его до подъёма ступни (см. правый viewport)

.

Для экструзии выделения нужно сделать следующее. Возле кнопки Extrude есть поле ввода с двумя стрелочками вверх и вниз. Наводим курсор на эти стрелочки и зажимаем левую кнопку мыши, удерживая кнопку мыши нажатой, двигаем мышкой вверх/вниз – значения поля будут непрерывно увеличиваться/уменьшаться. Таким образом, мы на глаз можем определить, насколько следуем проэкструдировать полигон. Кстати, кнопкой Extrude мы вообще не воспользовались – такая вот ирония!

Объясняю, почему в нашем случае строго запрещены одиночные клики по стрелочкам "вверх" или "вниз". Дело в том, что при однократном нажатии Макс экструдирует полигон на предопределённое минимальное значение 0.1, чего просто мало, поэтому приходится кликать снова и снова. На каждом шаге экструзии полигона с N вершинами Макс создаёт N+1 полигон (2*N+<число треугольников экструдируемого полигона> штук треугольников). Вы уже, наверное, прикинули, во что выльется многократное кликанье :) Как минимум, это уже будет не низкополигонная модель! Учтите это.

Полигон мы экструдировали, теперь (как и в случае с инструментом Cut) подгоняем позиции вершин под рисунок. Не забывая руководствоваться здравым смыслом, конечно :) Имхо, должно выйти, как в scn8.max.

Небольшое отступление о повороте рёбер. Классический пример, когда очень важно повернуть ребро, смотрите в файле edges_turning.max.

По уже понятному алгоритму три раза экструдим (одновременно корректируя вершины) всё тот же полигон.

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

Сравните, что получилось у Вас, с файлом scn9.max.

Теперь мы проэкструдим полигон

до верха красной области

и откорректируем вершины.

Настал момент добавить щиколотку. Для этого мы применим инструмент Cut в правом viewport’е в соответствии с рисунком.

И аналогично в левом vieport’е.

И после ещё одной коррекции вершин и поворотов рёбер, должно получиться, как в scn10.max.

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

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

После твиканья сетки получаем scn11.max. Теперь мы должны сделать колено. Поскольку суставы – очень важные части сетки при анимировании, то старайтесь здесь повышать сегментацию, но в разумных пределах. Огромное количество вершин сочленения очень трудно будет привязывать к скелету, поэтому не переусердствуйте. С учётом вышесказанного, делаем колено 4х-кратной экструзией полигона (сами знаете, какого :). Этого должно быть достаточно для плавного сгиба. На каждом шаге экструзии удобно изменять форму сечения с помощью инструмента Bevel или просто Select and Uniform Scale,

и уже после всех шагов экструзии подправлять сетку.

Добавляем разрез по бокам колена и склеиваем выделенные вершины – так мы создадим выпуклости фиксатора наколенника.

После того, как мы хорошенько покрутим рёбра и склеим одинаково информативные близкие вершины, у нас должно выйти что-то типа scn12.max.

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

Заметьте, я вообще не добавил новых вершин в результат экструзии.

Внимание! Сейчас я намеренно изменю положение ноги относительно рисунков. Это необходимо по двум причинам. Во-первых, при текущем положении ноги невозможно нормально смоделировать область промежности. Во-вторых, находящие близко друг к другу ноги сложно будет анимировать: кости одной ноги будут воздействовать на близлежащие вершины другой ноги, а, с учётом очень близкого расположения ног (в смысле, ноги расположены вплотную друг к другу), будет очень трудно твикать «кривые» вершины. На основе этих рассуждений отклоняем ногу так

простым перемещением вправо/влево в Back/Front viewport’е. Загляните в файл scn13.max и сравните со своим результатом. Выделенные на рисунке вершины будем полагать находящимися на своих исходных позициях. Продолжаем наращивать модель. Четыре раза экструдим до пояса.

Это лучше делать в правом viewport’е, потому что там удобно сразу корректировать сечение бедра. Настраиваем форму сетку в области бедра. Если настраивать внутреннюю/внешнюю сторону сетки в правом viewport’е неудобно, можно создать копию плоскости (см. «Подготовка рабочей области») Left, у которой с помощью EditMesh изменить ориентацию полигона и назвать её Right. Несколькими разрезами делаем бляху пояса и добавляем полигонов килту.

Вот что примерно должно выйти: scn14.max. А сейчас мы сделаем сам пояс экструдированием выделенных треугольников.

Внутренние вершины склеиваем.

Давайте упростим себе жизнь, удалив вершину в центре сечения.

Упс, дырка какая-то появилась! Не беда, ведь у нас есть замечательный инструмент Create. Итак, переключаемся на уровень полигонов и против часовой стрелки обходим вершины будущего полигона.

“Почему «против» часовой стрелки, а не «по»?” - спросите Вы. Очень просто! Вспомните из школьного курса физики правило правого винта. Да-да, именно это правило из раздела электростатики. Помните, как там было: чтобы вектор индукции сердечника был направлен вверх, надо чтобы в соленоиде ток бежал против часовой стрелки. Кажется, не напутал? Нам важен не ток, а сама идея. Когда Вы обходите последовательность вершин по часовой стрелке, то нормаль создаваемого полигона будет направлена именно по этому правила. Здорово, правда! (Строго выражаясь, нормаль будет направлена в строну векторного произведения векторов перемещений мышки от вершины к вершине. Когда Вы строите полигон, эти перемещения отображаются пунктирными линиями, понаблюдайте.)

Так как часть сечения мы уже сделали, то доделываем оставшийся кусок. Вот, что вышло.

Экструдим полученное сечение четыре раза до начала нагрудной брони – это у нас будет торс.

Производим вертикальный разрез рёбер на спине для создания рельефности мышц в области поясницы.

Заметьте, я показал рельефность панциря, защищающего пресс, всего пятью треугольниками.

В зависимости от количества треугольников результирующей модели, такие виды рельефности сглаживаются применением инструмента Chamfer к центральным вершинам. Но я в этом необходимости не вижу: после сглаживания сетки малое количество полигонов почти незаметно, к тому же, его легче текструрировать. Итак, смотрите scn15.max.

Переходим к грудной клетке. Снова четыре раза экструдим полигон до начала брони грудных мышц. Руки не трогаем, их мы будем делать отдельно. Твикаем вершины, пока не получим сетку вроде scn16.max. Заодно я начал настраивать форму панциря на лопатках и спине. Ничего военного, просто сверяйте вершины с рисунком, а кривизну формы настраивайте в соответствии со своим воображением и/или знанием анатомии.

Настала очередь груди. Ещё четыре экструдинга (я и сам удивляюсь, почему постоянно четыре – мистика) и мы закончим туловище.

Нам надо ещё доделать наплечники, но это уже декомоделлинг (моделирование аксессуаров, по-научному :) после завершения основной модели. Туловище должно выглядеть примерно так scn17.max. Я удалил полигоны с одной стороны туловища и оттуда, куда будет крепиться рука, к тому же, сделал шею.

Начинаем делать руку от запястья (кисть, как и сама рука, присоединяется позже). Для этого создаём новый объект box, который сразу же присоединяем к туловищу инструментом Attach на уровне редактирования Element.

После присоединения box сразу становится полупрозрачным, так как приобретает все свойства отображения нашей сетки Erazer. Элемент туловища я спрятал (Hide), чтобы он не мешал независимо моделировать руку. Как моделировать на основе созданного box’а руку, думаю, подробно разъяснять не требуется: экструдим и масштабируем, вручную твикаем вершины и поворачиваем рёбра – всё то, что я уже показывал, ничего нового. Попробуйте смоделировать руку полностью самостоятельно и сравнить с моим результатом из scn18.max. Особенно внимательно моделируйте локтевой сустав. Не забудьте повернуть руку на угол 45-60 градусов относительно оси тела и «пришить» к туловищу склеиванием крайних вершин.

Пришла очередь кистей. Мы их будем делать не одну, как может показаться логичным, а две. Одна – левая, которая участвует в удерживании тяжёлой пушки, либо вообще свободна. Вторая – правая, которая всегда держит небольшое оружие. Поэтому левую руку надо сделать наполовину расслабленной, а правую – сжатой в кулак, держащий рукоять оружия. Моделировать ладони и кулаки всегда намного проще, чем, скажем, голову, потому что у Вас есть левая, не занятая мышкой рука, которую можно рассматривать с разных сторон. Итак экструдим полигон-сечение запястья – получаем ладонь, а экструдингом отдельных полигонов, мы получим пальцы. После оптимизации вершин, получаем левую руку, которую пришиваем к запястью. (Для сокращения процесса я просто «отрезал» ладонь у стандартной модели MercMaleA. Возможность так сэкономить время имеется не всегда. Например, если вы моделируете черепашку-ниндзя ;). А вот теперь внимание! Мы выделяем на уровне треугольников только что созданную ладонь и отсоединяем (Detach) её в отдельный элемент (опция Detach To Element в окне Detach) и этот элемент скрываем (Hide). Всё выглядит так, будто никакой ладони мы не пришивали. Так я и задумывал. У нас осталась правая рука, которую надо пришить к… правой руке. Ой, а у нас же ещё нет правой руки! Может показаться маразмом, но кулак правой руки мы пришиваем тоже к левому запястью. Зачем? Увидите далее. Кстати, смоделировав левую руку, сделать кулак при наложенных ограничениях относительно просто: элемент кисти (который мы спрятали (Hide)) отсоединяем (Detach) с опцией Detach As Clone. Получим на сцене ещё одну сетку Object01 (имя по умолчанию). Моделируем кулак из уже готовой модели ладони.

Это уже дело техники. У меня получилась сцена scn19.max.

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

При экструдинге граней это особенно важно учитывать: Group - направлением экструдинга выбирается усреднённое значение нормалей выделенных рёбер (что не всегда удобно), а Local – каждое ребро экструдируется независимо от соседа. Итак, моделирование головы начинается с экструдирования граней шеи до начала подбородка.

Корректируем положение вершин. Получаем scn20.max. Экструдируем те же грани 2 раза до середины подбородка. См. Scn21.max. Теперь экструдить все грани одновременно неудобно. Будем это делать по частям: два ребра на подбородке - до начала нижней губы.

До сего момента мы конструировали только половинку тела. При создании лица половинки становится недостаточно: мы не знаем, достаточна ли кривизна поверхности (например, нос клином). Нам на помощь приходит так называемая Reference-копия: Tools > Mirror. В окне укажите отражение относительно X, а тип отражения выберите Reference. Стрелочками поля Offset откорректируйте смещение так, чтобы вторая половинка точно стыковалась с первой. Reference-копия нашей сетки точно повторяет все изменения исходной сетки, поэтому мы сможем наглядно оценить кривизну сетки. Чтобы Reference-копия не мешала при редактировании, её полезно «заморозить» (Freeze Selection).

Теперь, когда у нас есть Reference-копия, конструируем губы экструзией всё тех же рёбер. Корректируем вершины и получаем scn21.max. Доделываем щёку.

См. scn22.max. Конструирование носа начинаем с ребра,

а затем и этих рёбер.

Смотрите scn23.max. Заканчиваем голову конструированием шлема. У меня вышла сцена scn24.max.

Делаем наплечники. Для этого отсоединяем (копированием) выделенный на картинке

участок в отдельную сетку. Редактируем вершины, а, когда сам наплечник готов, присоединяем (как элементы) изготовляемые из цилиндра крепления. Смотрите файл scn25.max. Потом наплечник присоединяем к туловищу.

Ура, наконец-то, процесс моделирования завершён! Далее мы сгладим все неровности нашей сетки, а пока хочу сказать несколько слов об отладке каркаса. Поскольку нам с Вами приходилось довольно много редактировать сетку вручную, то совершенно не исключены незаметные для невооружённого глаза ошибки типа совпадающих вершин, треугольников, дырок и т.п. На помощь нам приходит полезный модификатор STL Check. Применим его к нашему каркасу. На картинке

я отметил наиболее важные моменты: в группе опций Selection ставим флажок напротив Select Edges, а потом ставим галочку напротив Check. В группе Status выводится число найденных ошибок. В нашем случае, красным цветом кроме открытых рёбер наплечника и шва туловища ничего не обозначено. Отлично, значит, пока ошибок нет. См. Scn26.max.

Вернуться к содержанию

# 1.3. Сглаживание сеточного каркаса.

В прошлом разделе мы создали модель (и даже прицепили к ней феньку – наплечник ;). Однако, выглядит наша модель явно грубо. Именно для устранения грубых рёбер существует такая штука как «группы сглаживания» (Smoothing Groups).

Инструменты для работы расположены в свитке Surface Properties в группе Smoothing Groups – 32 кнопки с цифрами. Нам могут понадобиться ещё две кнопки: Select by SG (выбрать треугольники по группе сглаживания) и Clear All (удалить выделенные треугольники из групп сглаживания).

Идея метода сглаживания сетки заключается в том, что граница двух треугольников выглядит гладкой (то есть, ребро рендерится сглаженным) тогда и только тогда, когда они принадлежат одной группе сглаживания. На практике это означает следующее: если мы выделим два смежных треугольника (считая, что никаких действий по сглаживанию над ними не предпринималось) и кликнем на любой кнопочке с цифрами, то переход между треугольниками станет плавным. Среда моделирования поддерживает 2^32 = 4 294 967 296 различных комбинаций групп сглаживания, отсюда и 32 кнопки. Цифра на кнопке означает номер бита в 32-битном значении (используется для хранения данных о группах сглаживания), который равен 1, если треугольники принадлежат одной группе сглаживания (т.е. ребро между треугольниками сглажено). Всё это звучит довольно бредово, и пока Вы не попробуете что-нибудь сделать самостоятельно, теория так и останется бредом (по себе знаю :). Для наглядности вышеизложенного я произвёл сглаживание ранее встречавшегося камина. Смотрите Triangles_smoothing.max.

Давайте отключим режим отображения модели See-Through и Vertex Ticks. Кстати, плоскости с ракурсами персонажа можете спрятать (или даже удалить!): они нам больше не нужны. Загляните в Scn27.max.

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

Внимательно посмотрите, какие рёбра я спрятал, в файле scn28.max.

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

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

затем оставшуюся часть подошвы, которой назначаем третью.

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

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

Сглаживаем оставшуюся часть наколенника.

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

Голова персонажа. Выделяем указанные на картинках

области и сглаживаем их с разными группами. Также с разными группами сглаживаем верхнюю и нижнюю губы. Сглаживаем шлем. Касательно носа. Выделенную на картинке

область сглаживаем, но при этом тут

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

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

В случае нозрей, выбраны группы 2 и 9. Кликаем, например, 19.

Грубый переход исчез. Пользуясь этой методикой, «доводим» модель в области ладоней, задников обуви, подбородка, спины и тыльной стороны колен, получаем scn30.max.

Вы заметили, что мы постоянно обрабатываем только половинку тела, а вторую используем для визуальной оценки. Теперь склеим две половинки туловища. Для этого «размораживаем» Reference-копию левой половинки и… удаляем её. В точности повторяя действия по созданию Reference-копии, создаём Copy-копию (масло масляное ;) с требуемым смещением. На уровне элементов к левой половинке тела присоединяем правую. Удаляем присоединённую к правому запястью ладонь, а к левому – кулак. С помощью инструментов Weld/Collapse на уровне вершин «сшиваем» обе половинки тела и запястья с кистями. Осталось (при необходимости) кое-где сгладить шов. С помощью STL Check проверяем шов на наличие огрехов. Смотрите scn31.max. Я, в добавок ко всему, подкорректировал переносицу, удалив лишние полигоны.

Нужно сделать ещё кое-что – добавить в стек модификаторов модификатор MultiRes (в параметрах модификатора лишь кликните Generate, ничего не меняя).

Необходимость применения данного модификатора диктуется наличием у движка Unreal Warfare такой штуковины, как LOD (Level Of Detail). Вы, вероятно, наблюдали этот механизм в таких играх, как Sacrifice и Messiah (движок-то у них один :)). Чем дальше от нас расположен какой-то объект, тем меньше полигонов после работы алгоритма от него будет оставаться. Зато это колоссально экономит системные ресурсы! Смотрите scn32.max.

Что ж, критически посмотрите на своё творение – 30% работы сделано! Лично у меня получилась модель из 2456 полигонов. На следующем этапе мы сделаем текстурную развёртку нашей модели.

Вернуться к содержанию

# 2.1. Создание текстурной развёртки модели.

Давайте разберёмся с понятием текстурной развёртки. «Текстура» - понятие, находящееся постоянно в обороте – это картинка, на которой нарисованы детали модели в цвете. Так компенсируется недостаток мелких полигонных деталей. А вот, что такое развёртка, думаю, не всем очевидно. В среде моделирования каждой вершине по умолчанию поставлены в соответствие три величины – координаты X, Y и Z (есть ещё и другие параметры, например, vertex color и weight, но они нас не интересуют). Так вот, текстурные координаты вершины – это ещё пара координат U и V. Модель состоит из треугольников, тогда каждому треугольнику в пространстве {X,Y,Z} соответствует некоторый определённый треугольник в плоскости {U,V}. Значит, модель можно спроецировать из 3D в 2D. Множество спроецированных треугольников называется развёрткой. Такая вот простая арифметика ;)) На самом деле плоскость {U,V} – это так называемое параметрическое пространство, U и V – пропорциональные координаты вершин. Они называются пропорциональными, потому что принимают значения в диапазоне от 0 до 1. Смысл текстурных координат прост: UV-координаты каждого треугольника сообщают среде на какую долю (процент, если угодно) от размера текстуры нужно вправо от левого и вниз от верхнего краёв текстуры для каждой вершины, чтобы пиксели изнутри найденного плоского треугольника «нарисовать» на соответствующем треугольнике модели в пространстве. Механизм допускает случай, когда равностороннему треугольнику развёртки соответствует, например, прямоугольный треугольник на модели. В этом случае применяется алгоритм растяжения/сжатия, наподобие тех, что можно встретить в графических редакторах.

Задача, которая стоит перед нами – сделать развёртку, у которой: во-первых, треугольники максимально близки по форме к оригиналам, во-вторых, отсутствуют пересечения рёбер и незапланированные наложения и/или совпадения треугольников, в-третьих, треугольники занимают максимальную область UV-квадрата (т.е. число «обрезков» текстуры минимально).

План действий. Разобьём тело на две логические части: голову и тело. Каждой части мы в дальнейшем назначим по текстуре. Разбиение делается лишь на две части, потому что так принято в UnrealTechnology-играх. Вообще-то, можно одной модели назначить до восьми (если не больше, цифра могла увеличиться :) текстур с разрешением до 1024x1024. Для разбиения возвращаемся в стеке модификаторов к EditMesh и на уровне полигонов выделяем голову и шею,

после чего в свитке Surface Properties в группе Material в поле ID вводим число 1.

Аналогично, всему остальному назначаем 2.

ID – идентификатор материала - нужен для того, чтобы отдельным полигонам можно было назначать отдельный материал.

Следующий шаг – создание материала будущего скина. Открываем окно редактора материалов и выбираем любой свободный слот. Щёлкаем на кнопке Standard и в открывшемся списке выбираем Multi/Sub-Object.

Теперь кликаем на кнопке Set Number и пишем количество материалов - 2 штуки. Двухкомпонентный материал для нашего персонажа создан. Обратите внимание на столбец ID: в нём стоят значения 1 и 2 по умолчанию, поэтому менять ничего не требуется. Щёлкаем на кнопке напротив 1.

Открывается дочерний материал. По аналогии с действиями раздела 1.1, кликаем на кнопке Diffuse из свитка Maps, но теперь выбираем не Bitmap, а Checker. Основной цвет (Color #1) устанавливаем зелёный. Параметры Tiling устанавливаем равными 32. Аналогично поступаем со вторым материалом, расположенным в материале Multi/Sub-Object напротив цифры 2. Цвет в этом случае установим синий. Полученный двухкомпонентный материал должен выглядеть так.

Материал «в квадратик» нам нужен для оценки качества развёртки: применив материал к каркасу, мы не должны обнаружить на нём артефактов в виде растяжений/сжатий текстуры. Если текстура состоит из квадратов, то наличие растяжений обнаружить очень просто: квадраты превратятся в ромбы!

Процесс наложения рисованной картинки на плоскости, имевший место в разделе 1.1, есть ни что иное, как создание развёртки плоскости.

Начинаем создание развёртки. Применяем к сетки модификатор Unwrap UVW. Давайте познакомимся с интерфейсом модификатора.

Имеется всего один уровень редактирования – Select Face. Кстати, таким названием разработчики противоречат сами себе, т.к. Face – это треугольник (в топологии самого же Макса), а выбираются-то полигоны, поэтому просто помните об этом и не путайтесь :)) Давайте кликнем на Edit. Откроется окно Edit UVWs.

На картинке отмечена цифрой 1 строка Pick Texture. Кликните на ней и в отрывшемся окне браузера сначала установите флаг Mtl Editor, а затем выберите созданную нами клетчатую текстуру Checker. На первый взгляд ничего в окне Edit UVWs не зменилось. На самом деле, это не так. Всё дело в одной маленькой пакостной опции Brightness (обозначено цифрой 3), значение которой по умолчанию всегда стоит 0. Эта опция отвечает, ни много, ни мало, за яркость текстуры в окне редактора развёртки и, когда равна нулю, текстура просто не отображается (одно время 3D’шные форумы были завалены гневными петициями о невозможности работать с Edit UVWs по причине отсутствия текстуры в окне). Устанавливать значение 1 смысла не имеет: клетки будут максимально яркими, и мы просто не увидим на их фоне развёртку. Установим Brightness в промежутке от 0.2 до 0.3. Можно отключить опцию Tile Bitmap (отмечено цифрой 2). Она «размножает» текстуру, что иногда сбивает с толку. Хотя мне она не мешает ;-) Цифрой 5 обозначены инструменты редактора: перемещение, вращение, масштабирование, «свободное» изменение формы выделения и зеркальное отражение. Если мы выделим какой-нибудь участок модели (на рисунке обозначено цифрой 6, я выбрал голову и шею), то этот же самый участок выделится и в развёртке (обозначено цифрой 7). Цифрой 4 обозначен список имеющихся у модели Material ID. Кликнув, например, на втором ID, мы ограничим имеющуюся развёртку лишь полигонами головы. Вернёмся к интерфейсу модификатора. Map Channel установлен равным 1 – это номер канала проецирования текстуры (удобнее всего представлять его себе, как количество разных координатных UV-плоскостей, которые используются при текстурировании). Однократное применение модификатора допускает работу лишь с одним каналом, чтобы использовать второй, третий и т.д. каналы нужно использовать, соответственно, два, три и т.д. штук разных модификаторов Unwrap UVW. Наконец, кнопка Planar Map. Она делает вот что: когда мы выделяем участок сетки (например, ту же голову), то отображается проекционная плоскость (см. на предыдущей картинке обозначенное цифрой 6). Мы уже применяли проекционную плоскости раньше. Отличие этой плоскости от встречаемых раннее в том, что её позицию нельзя изменить непосредственно. Если кликнуть Planar Map, то в окне редактора мы увидим, что участок развёртки, соответствовавший выделенному участку сетки отрезан и «растянут» на весь квадрат.

Так делать не всегда удобно.

Альтернативой Planar Map является команда Detach Edge Verts.

С её помощью выделенный кусок сетки отрезается от имеющегося куска. Далее мы можем с ним поступать на своё усмотрение.

Уже «расправленные» куски развёртки не нужно стараться уместить в квадрат с текстурой. Эта грязная работа выполняется так называемым упаковщиком текстур (Pack UVs). Текстуры упаковывают вручную, когда, например, текстура будет рисоваться вручную в 2D-редакторе типа Фотошопа (т.е. требуется логичное расположение частей развёртки). Размещайте куски развёртки в любом месте UV-плоскости, лишь бы Вы сами их, при необходимости, нашли ;-))

Устанавливаем ID’шник равным 2. Пока работаем только с головой. Выделяем часть лица персонажа и кликаем Planar Map. Получаем развёртку указанного куска сетки.

Развёртка имеет недостаток – в указанных на рисунке местах рёбра пересекаются.

Это недопустимо. Устраняем недостаток. К выделенным вершинам применяем инструмент масштабирования. На паре вершин масштабирование работает как уменьшитель расстояния между этими вершинами. Хорошенько это уясните, ещё не раз пригодится. Таким образом, пересечение граней ликвидировано.

После того, как обрабатываемый участок развёртки лишён явных недостатков, надо устранить неявные – растяжения. У каждого из двух материалов, образующих заготовленный двухкомпонентный, включаем отображение во viewport’е. Применяем материал к нашему каркасу. Как и следовало ожидать, сеточный каркас окрасился «в квадратик». Голова – в синий цвет, а туловище – в зелёный.

Фронтальный вид персонажа не позволяет выявить артефактов.

А вот вид сбоку позволяет! На картинке

я обозначил области растяжения. Выделяем вершины

и применяем к ним вертикальное масштабирование – сближаем.

Как только мы изменили развёртку, изменения сразу же вступают в силу и текстура на модели «смещается», что можно пронаблюдать воочию. Смещая (попарно, т.к. симметрию развёртки желательно не терять) вершины, устраняем растяжения на щеке.

При попытке устранить растяжение над краем верхней губы, сталкиваемся с проблемой: куда бы мы ни двигали вершины, портятся участки справа и слева. С носом эта проблема стоит ещё острее. Это тот случай, когда (слабонервных попрошу не читать :) нос надо ампутировать. Итак, выделяем полигоны носа во viewport’е. В UV-редакторе вершины носа также выделились, кликаем на Detach Edge Verts из контекстного меню. Мы отрезали нос! Перемещаем его за границу лица (звучит-то как!). В развёртке на месте носа возникла дыра, которой мы и воспользуемся для устранения растяжений лица. Перемещаем вершины, чтобы максимально разгладить текстуру на сетке. Позанимавшись мэппингом минут десять, понимаешь, откуда взялось понятие «скин»: текстура нерастяжима. Туда потянешь, здесь сожмётся :-). Область носа без дробления или увеличения в размерах сделать «идеальной» не выходит: наблюдается несильное растяжение на ноздрях. Оставим пока нос, как есть. При необходимости можно просто увеличить размер текстуры для носа. В результате у меня получилось так: scn33.max. Нос, кстати, одна из самых (!) сложных областей мэппинга, так что мучались мы не зря.

Выбираем стекло шлема

и снова применяем Planar Map.

Заметны довольно сильные растяжения текстуры по краям (обведено на рисунке). Алгоритм устранения искажений такой же, как и в случае щёк. Получаем следующее.

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

Планарная проекция теперь, увы, ничего хорошего не даст (можете сами проверить). Используем другой способ – встроенный в UV-редактор стандартный мэппер. Итак, отрезаем (Detach Edge Verts) выделенную часть развёртки и применяем к ней инструмент Mapping > Normal Mapping. В открывшемся окошке из списка стандартных способов мэппинга выбираем Top/Bottom Mapping.

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

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

и сцену scn34.max.

Выделяем полигоны, как на картинке.

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

Точно также «разворачиваем» макушку и затылок.

Получаем scn35.max. Выделяем части шеи.

.

Применяем к ним Top/Bottom Mapping. К передней и задней частям шеи

применяем Left/Right Mapping. Отлаживаем развёртку. Интересный момент – упаковка развёртки. Попробуйте использовать автоматическую упаковку.

Работает, в принципе, неплохо, но не так, как хотелось бы (автоупаковщик тем эффективнее, чем большее число кусков надо упаковать). У нас всего 12 кусков, давайте разместим их вручную в синем квадрате.

Это совсем не сложно: поворачиваем и перемещаем куски. Есть одна заковырка. Нельзя масштабировать отдельный кусок развёртки, только все одновременно, иначе наша работа по выравниванию квадратиков будет испорчена! После десяти минут возни у меня получилось такая вот развёртка.

Смотрите файл scn36.max.

Когда голова обтекстурирована, мы, разумеется, собираемся текстурировать туловище. Однако, проблема – наплечники. Как выбрать полигоны плеч, если мешают наплечники? Существует три способа устранить данную проблему. Способ первый – предусмотреть данную ситуацию и заранее отсоединить наплечники в отдельный сеточный каркас, который отдельно обтекстурить и потом присоединить к туловищу. Способ второй (менее красивый) применяется, если мы не заметили будущую проблему, т.е. как раз наш случай :-). Надо поступить так: добавляем в стек модификаторов Edit Mesh, отсоединяем наплечники, к ним как к отдельному каркасу применяем Unwrap UVWs, на том же канале, что и туловище. Делаем их развёртку. В стек модификаторов туловища добавляем ещё один Unwrap UVWs и, как ни в чём ни бывало, текстурим теловище. Наконец, в стек туловища добавляем ещё пару модификаторов - Edit Mesh и Unwrap UVWs. С помощью первого мы присоединяем наплечники к основному каркасу, а с помощью второго – корректируем расположение развёртки наплечников относительно расположения частей развёртки туловища. Жутко неудобный, но тоже способ. Третий способ, имхо, самый логичный и простой: текстурим наплечники и область тела вокруг наплечников, а ту часть тела, что скрыта под наплечниками «разворачиваем», когда всё остальное уже сделано. Важный момент! Вопреки договорённости об отсутствии общих участков кусков развёртки, развёртки плеч можно расположить даже поверх каких-то других участков, потому что плечи под наплечниками просто невидимы. Давайте попробуем применить именно третий способ как самый очевидный.

Итак, текстурируем тудовище. Выделяем полигоны

и делаем их планарное проектирование.

Так же поступаем с участками сетки, выделенными на картинках.

Устраняем искажения.

Обтекстурим крепления наплечников. Планарно проектируем все четыре крепления и совмещаем развёртки, выделяем одинаковые вершины разных креплений и применяем к ним равномерное масштабирование.

Выделяем сами наплечники и делаем их развёртку. Во время их текстурирования возникает проблема углов. Как бы мы вершины развёртки в углах ни перемещали, в угла неизменно есть искажение. Выход: разрезать углы инструментом Break (а вершины новых одинаковых углов склеить командой Weld Selected). Смотрите scn37.max.

Переходим к текстурированию рук. Выделяем полигоны

и разворачиваем их. Далее разворачиваем следующие облясти (только картинки).

– используем Left/Right Mapping

– простой Planar Map

– невозможно сложный для текстурирования участок сетки. Хорошо, что существует такой мэппер, как Unfold Mapping.

Текстурируем ноги.

- Planar Map

- Top/Bottom Mapping

- Planar Map.

Последний штрих в текстурировании тела - cмасштабировать куски развёртки. После упаковки, развёртка приобрела вид,

а персонаж - такой вид.

Результат смотрите в scn38.max.

Наконец-то, можно создавать текстуру!

Вернуться к содержанию

# 2.2. Создание текстуры.

Давайте познакомимся с ещё одним редактором-монстром по имени Deep Paint 3D. Это пакет для раскраски моделей. Эдакий Фотошоп в 3D :-) Мы возим кисточкой по модели, получается текстура.

У DP3D есть один недочёт: он совершенно игнорирует группы сглаживания (во всяком случае, способ их включения мне неизвестен), поэтому рёбра не видны. Это создаёт определённую дезориентацию при раскраске. На помощь нам приходит утилита Texporter. Она рендерит развёртку, окрашивая треугольники в определённые цвета и прорисовывая рёбра. Интерфейс утилиты довольно простой.

Сначала вводим размер текстуры 2048x2048 (в четыре раза больше результата) для рендеринга (1) и отмечаем галочкой пункт Only ID. Напротив него ставим Material ID требуемой части (2). Снимаем галочку с Backface Cull (3) и кликаем Pick Object(4). Теперь во viewport’е кликаем на нашем персонаже. Texporter рендерит разноцветную развёртку. Кликаем Save Bitmap

и сохраняем картинку в файл. Аналогично поступаем с оставшейся частью развёртки. У меня получились два файла head_unwrap и body_unwrap. Осталась совсем мелочь – назначить полученные «текстуры» нашей модели. Для этого кликаем на субматериалах двухкомпонентного материала и вместо Checker выбираем Bitmap, а потом полученные изображения. Персонаж должен приобрести следующий вид.

Заодно переименуем субматериалы так (буквы должны быть непременно большими!).

Давайте разберёмся, как запустить плагин пакета DP3D для раскраски модели Макса. Идём во вкладку Utilities и одноимённый свиток, кликаем Configure Button Sets.

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

Теперь в свитке утилит появилась кнопка Right Hemisphere. Кликаем её, открывается интерфейс плагина. Самая важная для нас сейчас кнопка – Paint Selection.

Кликаем её, открывается интерфейс Deep Paint 3D. Изучим его.

Цифрой 1 отмечены кнопки взаимодействия с Максом и Фотошопом, цифрой 2 – кнопка перехода в режим 2,5D-раскраски (проекционный режим), 3 – наши материалы, 4 – инструментарий, 5 – командная панель с открытой вкладкой Presets, 6 – окошко, в котором отображается внешний вид нашей кисточки. Также полезно установить удобные для работы опции освещения

и отображения сетки.

При работе с Deep Paint 3D можно пользоваться следующими горячими клавишами:

- Ctrl + <движение мышкой> – изменение размера и прозрачности кисти
- Shift + <движение мышкой> – изменение угла поворота и формы кисти
- R + <движение мышкой> – вращение объекта
- Ctrl + Space + <выбор мышкой области> – масштаб выбранной области
- Ctrl + Space + Shift + <движение мышкой> – приблизить или удалить
- Space + <движение мышкой> – перемещение объекта

Смысл наших действий следующий: мы наносим на модель основные цвета, а мелкие детали «доводим» в Фотошопе. Поэтому не старайтесь делать идеально всё сразу.

Давайте попрактикуемся. Выбираем кисточку Skins, Fur and Hair > Human Skin+ - она имитирует человеческую кожу. Выбираем подходящий размер кисти и методично прорисовываем открытые области лица, рук и шею.

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

Выбираем кисть Variations > Airbrush Medium. Прорисовываем контуры металлических поверхностей серым цветом. Если дважды кликнуть на красном кружке Color,

то откроется канал цвета, на котором очень удобно подправлять огрехи. В этот момент Deep Paint 3D превращается в 2D-редактор. В любой момент мы можем «связаться» с Фотошопом и разрисовывать текстуру его средствами. Для этого служит кнопка Export Material to Photoshop. Для противоположного действия используется кнопка Fetch the Material from Photoshop. В Фотошопе рисовать нужно на слое Base Layer: Color (в любом случае, DP3D «читает» только этот слой), слой SKIN1: WireFrame предназначен лишь для ориентира.

Прорабатываем текстуру головы (этот материал мы назвали SKIN1). Существует нехитрый приём, позволяющий в Фотошопе раскрашивать только определённые треугольники развёртки. Активируем слой SKIN1: WireFrame, с помощью инструмента Magic Wand выделяем внутренние части нужных треугольников, после чего выделение расширяется с помощью команды Select > Modify > Expand на 1-2 пикселя. Переключаемся на слой Base Layer: Color и рисуем. Когда треугольников много, этот приём быстро выполнить трудно, тогда процедуру можно упростить, применяя инструменты Polygonal Lasso/Lasso. Итак, после первичной раскраски в DP3D у меня получилась текстура SKIN1_01. Дорисовываем основную раскраску шлема – красные и серые части. Смотрите SKIN1_02 и SKIN1_03. Далее добавляем грязи и ржавчины у швов и заклёпок, получаем SKIN1_04. Лицо рисовать с нуля очень сложно, поэтому я просто экспроприировал кусок лица из текстуры MercMaleCHeadA.png (из папки Extras\SkinArt\Textures, что находится на третьем диске с игрой). К тому же я добавил небольшое отражение в стекле шлема (см. SKIN1_05). Перемещаем нос, куда следует, и добавляем сколы краски и грунтовки шлема, парочку неудачных хедшотов – вмятины от пуль (SKIN1_06). Детализируем содранную краску на затылке и делаем переход на швах «щека-лицо» и «затылок-шея» с помощью фотошоповского инструмента Clone Stamp (SKIN1_07). Аналогично раскрашиваем оставшиеся участки шеи (см. SKIN1_08 и SKIN1_09). После отрезания ненужных участков текстуры (инструментом Magic Wand выделяем неиспользуемую развёрткой часть текстуры, сужаем границу командой Select > Modify > Contact на 4-5 пикселей, растушёвываем на 1 пиксель командой Select > Feather и, наконец, заливаем полученную область чёрным цветом) получаем head_unwrap.png.

При создании текстуры нужно руководствоваться несколькими нехитрыми правилами (Tips!):

- Никогда сильно не затеняйте большие участки, модель будет выглядеть неестественно тёмной. За освещение таких частей (руки и ноги, например) отвечает сам движок. Но движок не сможет затенить, к примеру, заклёпки на шлеме.
- Рисуйте не только внутри треугольников развёртки, но и даже за их пределами. Так Вы избежите неприятностей со швами. Смело используёте растушёвку и инструмент смазывания Smudge для работы на границе развёртки.
- Учтите, что, сохраняя экспортированный из Deep Paint 3D файл с текстурой, Вы не сможете его получить из Фотошопа назад. Может, это просто глюк плагина, тем не менее, такая ситуация имеет место. Что же делать, если файл сохранить надо? Ничего особенного: сохраняем PSD-файл, повторно экспортируем текстуру из DP3D (при этом Deep Paint 3D посетует, что соединение с Фотошопом уже установлено; на деле же, соединение рвётся, но Deep Paint 3D об этом не знает), а затем из сохранённого файла копируем слой Base Layer: Color в только что экспортированный документ. Склеиваем новый и старый слои (новый должен быть в стеке слоёв выше старого) и, не сохраняя данный документ, из Deep Paint 3D выполняем команду Fetch the Material from Photoshop.
- Не бойтесь создавать и использовать другие слои, только не забывайте склеивать их при экспортировании.
- Сохраняйте проект Deep Paint 3D в DP3-файл. Так Вам не придётся запускать Макс вообще, программа раскраски сохранит данные модели в свой собственный формат. Вы сохраните уйму оперативной памяти.
- В Deep Paint 3D используйте проекционный режим рисования, когда нужно «заделать» шов между кусками развёртки.
- Для рисования грязи и ржавчины я использовал только одну фотошоповскую кисточку из набора Special Effect Brushes.

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

Делаем текстуру тела (aka SKIN0). Я набросал очертания форм только на половине модели (SKIN0_01). Раскрашиваем нагрудную броню. Для равномерного нанесения окраски нужно помимо обычных кистей использовать кисти Smudge/Blur и Dodge/Burn. (Альтернативный вариант создания правильно окрашенных форм заключается в применении инструмента Mesh пакета Adobe Illustator 10, но применение AI выходит за рамки данного урока.) Смотрите SKIN0_02. Наносим раскраску на боковую сторону брони и спину (SKIN0_03). Завершаем раскраску спины и верхней части брони (SKIN0_04). От верхней части брони переходим к наплечникам и их креплениям (SKIN0_05). Аналогично окрашиваем костюм выше пояса и руки (SKIN0_06), после чего добавляем тени (SKIN0_07). Прорисовываем детали перчаток (SKIN0_08). Добавляем складки костюма на спине, боках и штанах (SKIN0_09). По аналогии с наручной бронёй рисуем броню на ногах (SKIN0_10). Наконец, завершаем первичную раскраску модели обувью (SKIN0_11).

«Доводим» текстуру тела. Во-первых, добавляем швы и соединительные крепления частей брони, во-вторых, контрастные подсветку и тень на швах (SKIN0_12). Следующий этап является совершенно необходимым для текстуры. Сейчас текстура выглядит несколько кукольно. А что, собственно, сделает её реалистичной, давайте разберём.

- Ни один объект реального мира не имеет идеальной поверхности: даже совершенно новые предметы имеют царапины, неравномерную окраску. В процессе хранения всё, так или иначе, покрывается пылью.
- При эксплуатации всегда возникают загрязнения, трещины и глубокие царапины. В нашем случае, броня вояки не должна быть чистенькой и блестящей (о, жертва кемпера :). При попадании пули даже в самую крепкую броню, неизменно остаются вмятины.
- Погодные условия не всегда соответствуют схеме «солнце, воздух и вода». Иногда добавляются: песок, грязь, радиоактивные отходы, концентрированная кислота, каммулятивные и разрывные снаряды – одним словом, всё пагубно сказывающееся на состоянии поверхности. Последние вызывают ещё вмятины и сколы.
- Вода, грязь и прочие жидкие субстанции имеют обыкновение скапливаться в различных трещинах, углублениях и просто неровностях поверхности, тем самым, вызывая загрязнение и коррозию.

Это пример факторов, которые должен учитывать художник по текстурам в работе. У gamedev’ов оценкой и сбором таких факторов чаще всего занимается дизайнер игровой вселенной.

Итак, приняв к сведению всё вышесказанное, рисуем карту износа – грязь и ржавчину. Для этого создаём новый слой Dirt (в режиме Multiply). После нанесения грязи у меня получилась текстура SKIN0_13. Часто полученного результата достаточно, царапины можно было бы добавить просто вручную. Тут я не удержался и нарисовал ещё одну карту механического износа (Overlay-слой) в программе Painter (я использовал различные вариации инструмента Impasto).

Загляните в SKIN0_14. Осталось совсем немного сделать – уже проработанные участки текстуры разместить на симметричных им непроработанных. Фактически, некоторые участки – всё тело ниже пояса и руки (кроме кистей) – будут иметь симметричную текстуру. Вы, наверное, заметили, что тело (без конечностей) я сделал с несимметричной картой износа. Вообще-то, так же надо было поступить и с картой износа конечностей, потому что явная детальная симметричность природе не свойственна. Но, учитывая, что мы делаем модель для экшена, то небольшая симметричность будет почти не заметна. В итоге (опять же, после удаления неиспользуемых частей) получилась текстура body_unwrap.png.

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

- Когда мы симметричные части текстуры скопировали в другие места, могла возникнуть (опять!!!) проблема нестыковок швов. Когда текстура готова, приладьте её на модель в Deep Paint 3D и буквально попиксельно просмотрите швы, при необходимости аккуратно подчистите их в проекционном режиме.
- Внимательные моделлеры должны сделать один простой, но очень важный вывод: чем меньше кусков в развёртке, тем легче текстурирование, швов-то тоже меньше!
- Самым креативным и энергичным камрадам: самостоятельно изучайте игровые текстуры и используйте изученное в своих работах.

Вернуться к содержанию

# 3. Привязка сеточного каркаса к стандартному скелету.

У нас уже есть полностью готовый к анимированию сеточный каркас. Смотрите файл scn39.max. Давайте отобразим скрытый ранее стандартный скелет. Для этого во вкладке Display кликаем Unhide by Name. В списке выбираем всё части bip’а, кроме тех, название которых начинается с “Dummy”. В свойствах материала нашего персонажа отключаем отображение текстуры во viewport’е и включаем опцию See-Through. Смысл дальнейших действий прост: мы с помощью перемещений и поворотов подгоняем скелет под нашу модель. (Настоятельно рекомендую вместо стандартного скелета использовать новый из пакета 3Ds MAX 5.1. Для этого выделив какую-нибудь часть скелета, идём во вкладку Motion, в свитке Structure в группе BodyType в комбинированном списке вместо Classic выбираем Skeleton.) Вся эта работа от силы минут на десять, сравните Ваш результат с scn40.max. (scn41.max для 5.1) Дам один совет: старайтесь по возможности НЕ МАСШТАБИРОВАТЬ кости вообще, дабы не столкнуться с большими проблемами в дальнейшем. Но если такая необходимость, всё же, возникла, не масштабируйте три последние (по иерархии) кости любой конечности, остальные кости терпят несильное (~30%) масштабирование.

Теперь нужно сделать привязку скелета к сетке. В стек модификаторов сетки Erazer добавляем модификатор Physique. Жмём кнопку Attach to Node.

Кликаем по кнопке Select by Name (в главной панели) и в списке выбираем Bip01 или же щёлкаем на небольшом сером кубике внутри живота.

В открывшемся окошке Physique Initialization ставим птичку в пункте Create Envelopes, вместо Deformable отмечаем Rigid и устанавливаем значение поля Blending Between Links равным 3 Links

и кликаем Initialize. Поясню смысл опций. Опция Create Envelopes отвечает за автоматическую генерацию огибающих контейнеров, ответственных за привязку вершин сетки к костям. Тип привязки Rigid означает, что вершины жёстко закреплены относительно костей. В играх сейчас используется именно этот вид привязки, потому что он легко реализуется программно. При жёсткой привязке каждая вершина может находиться под воздействием не более трёх костей (опция Blending Between 3 Links). Вспомните школьный курс физики: тело, находящееся под воздействием нескольких сил, перемещается туда, куда ему указывает среднее арифметическое векторов этих сил. С привязкой вершин картина похожая. Каждую вершину удобно представлять частицей, находящейся под действием сил, возникающих при движении костей. Куда двигаются кости, туда и вершина. Наблюдательный читатель, наверное, заметил, что за величину сил я ни слова не упомянул: если одна сила намного больше остальных, то и частица будет почти игнорировать влияние «слабых» сил. Но не всё так плохо, в Максе можно отрегулировать степень воздействия отдельных костей на отдельные вершины вручную.

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

1. Выделяем все части скелета.
2. Во вкладке Motion находим свиток Biped и отжимаем кнопку Figure Mode.
3. В появившемся ниже свитке Key Info кликаем на кнопку Set Key.
4. На нулевой позиции появляется ключ анимации.
5. Идём в Time Configuration. В группе Animation находим поле Frame Count и вводим туда, например, 100.
6. Кликаем кнопку Auto Key.
7. Перетаскиваем ползунок в конец анимации (в моём случае, на позицию 99).
8. С помощью перемещений и вращений настраиваем положение рук, ног и остальных частей так, чтобы были видны всё дефекты.
9. Отключаем Auto Key.

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

- Звёздочки-сочленения генерятся посередине отрезка пересечения костей (внутри суставов для 5.1). Если вы разместили будущее сочленение неправильно, увы, никакая настройка вершин не поможет – анимация будет плохая. Выход есть: включайте у скелета режим Figure и перемещайте кости на новые позиции. В модификаторе Physique модели кликайте Reinitialize (рядом с Attach to Node) указывайте Initial Skeleton Pose, Vertex Settings, Vertex – Link Assignments и Include New Bones (для сброса значений криво привязанных вершин). Настройте вершины модифицированных костей снова.

- Архиважно правильно настроить вершины левого запястья, потому что ладонь поворачивается относительно своей оси на 90 градусов. Для моей модели, чтобы устранить глюки запястья, ладонь пришлось отрезать и добавить на запястье немного объёма. Ладонь же пришлось намертво приклеить к кости кисти.
- Уделите особое внимание шее и месту, куда крепятся ноги :-))) Настройка последнего у меня заняла половину времени риггинга. Учтите это и не пугайтесь длительности работы.
- Пробуйте делать самые разнообразные тестовые анимации и старайтесь протестировать поведение сеточного каркаса на сочленениях, когда кости принимают экстремальные положения: положение на корточка, колени выше пояса, повороты рук вокруг оси, вращение головы, изгибы подвоночника.

Теперь, когда риггинг готов (scn42.max только для 5.1),

давайте перейдём к финальному этапу нашей разработки – экспортированию модели в игру.

Вернуться к содержанию

# 4.1. Экспортирование модели в UT2003.

Экспортирование – самый приятный и занимательный процесс. Уже в ближайшие пятнадцать минут можно будет опробовать нашу модель в игре!!!

Идём во вкладку Tools и кликаем кнопку More, в открывшемся списке выбираем строку ActorX.

Так, как Вы уже знаете, называется экспортер из Макса в UT2k3. Сначала, идём в свиток опций плагина ActorX-Setup и отключаем опцию bake smoothing groups. Она отвечает за следующее: получить видимую границу между группами сглаживания можно не только банальной настройкой (как это делали мы), но и разбиением каждой вершины границы на пару покоординатно совпадающих вершин. Последний способ хорош тем, что движок может не беспокоиться о группах сглаживания и отображать все целые куски сетки сглаженными. Минус способа, как не трудно догадаться, в том, что он сильно увеличивает количество вершин модели. Для нас это очень нежелательно, поэтому опцию лучше отключить. В output folder и mesh file name указываем, куда экспортировать модель.

В процессе экспортирования, плагин должен выдать одно единственное сообщение «Skin file Erazer.PSK written.» Это означает, что всё пучком. Может случиться, что появится сообщение типа «Vertex with weight 0.000000 found. Fixing…». Это есть плохо, потому что какая-то вершина/вершины оказались привязанными криво или не привязанными вовсе. Проверьте всё ещё раз.

Допустим, экспортирование прошло успешно. Если Вы протестировали модель достаточно хорошо, то Макс, скорее всего, больше не понадобится ;-)) Запускаем UnrealEd3. На переднем плане видно окно с кучей вкладок. Разворачиваем его (обязательно!) во весь экран и переходим во вкладку Textures. В Фотошопе уменьшаем размер заранее созданных текстур head_unwrap.png и body_unwrap.png до 1024x1024. Уменьшаем яркость текстуры головы на 30 пунктов (Adjustments > Brightness/Contrast), а текстуры туловища так, чтобы яркости кожи рук и головы были визуально одинаковы. Обе картинки сохраняем в формате bmp или tga с глубиной цвета 24 бита (альфа-канала у нас нет). Кроме текстур понадобится ещё одна картинка размером 256x512 – будущий портрет игрока в менюшке игры. Такую картинку можно сделать в Максе, отрендерив готовую модель в каком-нибудь победоносном ракурсе. Итого, у нас имеются 3 картинки.

В UEd идём в меню File > Import, в открывшемся окне выбираем наши текстуры и кликаем OK. Появляется окошко импортера текстур для первой текстуры. В поле Package указываем ErazerTex – название нового архива с текстурами. Поле Group надо оставить пустым. Редактор в поле Name автоматически подставляет имя файла текстуры, но его можно изменить. Картинку для менюшки назовём VIEW, текстуру головы – HEAD, а тела – BODY. Сохраняем архив с текстурами под именем, предложенным редактором.

Переключаемся на вкладку Animations. Кликаем File > Mesh Import и выбираем сгенерированный ActorX’ом файл Erazer.PSK. Открывается (ещё одно!) окно импортера моделей. В поле Package указываем ErazerAnim. Редактор оповестит о появлении нового объекта [eraser]. Не пугайтесь вида модели: на нём, ведь, ещё нет текстур! Сейчас будут. Справа находится пять вкладок. Выбираем вкладку Mesh, разворачиваем свитки Skin, затем Material. Видим две строки [0] и [1] – сюда прицепляются текстуры.

Процесс привязки текстур к модели весьма оригинальный, но совсем не сложный. Снова переходим во вкладку Textures и кликаем один раз на текстуре BODY (вокруг текстуры должна появиться серо-зелёная рамка), возвращаемся в Animations к строке [0]. Напротив неё стоит None, кликаем на None и в появившейся менюшке выбираем Use. Аналогично поступаем с текстурой головы, и наш персонаж вернул утраченную в процессе экспортинга текстуру.

Следующий этап – сопоставить нашей модели встроенный в игру стандартный скелет MercMaleA. Открываем файл Animations\HumanMaleA.ukx. Прямо под панелью инструментов вверху есть три комбинированных списка. В верхнем отображаются загруженные архивы с моделями, в нижнем левом – конкретные модели, а в нижнем правом – связанные с моделями скелеты. В нижнем левом списке выбираем строку MercMaleA.

Отобразится соответствующая модель игрока. Выполняем команду Mesh > Copy Mesh Properties. Затем Animation > Rename animation set. В открывшемся окошке в поле Package указываем ErazerAnim, в поле Name – eraser. В верхнем комбо-списке выбираем ErazerAnim. Заметьте, в правом списке появился скелет eraser, осталось соединить скелет и модель. Для этого кликаем на скелете eraser (в огромном списке Sequences слева должны появиться разные анимации) и выполняем команду Edit > Linkup anim and mesh. Наконец, масштабируем и ориентируем скелет и модель так же, как и MercMaleA. Достаточно кликнуть Mesh > Paste mesh properties. (В моём случае потребовалось увеличить значение Mesh - Translation - Z с 116 до 120, т.к. персонаж двигался по воздуху.)

Сохраняем анимацию в UKX-файл, и работа с редактором UnrealEd3 завершена. Осталось сделать совсем чуть-чуть – научить UT2k3 «видеть» новую модель. Во-первых, создаём текстовый файл Erazer.upl в подпапке System папки UT2k3. В этой же папке находим текстовый файл XPlayers.int и с помощью блокнота в конец файла добавляем следующую строку:

Erazer="Name: PLAYER NAME|Age: PLAYER AGE|Race: PLAYER RACE |Data:|PLAYER BIO||"

PLAYER NAME – имя персонажа (у меня, Erazer), PLAYER AGE – возраст (например, 27), PLAYER RACE – раса персонажа (пофантазируйте!), PLAYER BIO – биография персонажа или какая-нибудь информация, связанная с ним. У меня вся строка выглядит так:

Erazer="Name: Erazer|Age: 27|Race: IGROMANUS NATURALIS|Data:|IGROMANIA RULEZ!!!||"

Вертикальная черта играет роль перехода на новую строку. После закрывающих кавычек в этой же строке не должно стоять ни одного пробела!

Открываем файл Erazer.upl и пишем туда ещё одну (повторяю, только одну, без переносов!) строку:

[Public]

Player=(DefaultName="Erazer", Mesh=ErazerAnim.erazer, species=xGame.SPECIES_Merc, BodySkin=ErazerTex.BODY, FaceSkin=ErazerTex.HEAD, Portrait=ErazerTex.VIEW, Text=XPlayers.Erazer, Sex=Male, Menu="SP", Ragdoll=Male)

Поясню параметры:

- DefaultName – имя пресонажа
- Mesh – модель игрока (аналог нижнего левого комбо-списка в редакторе)
- species – используется для мутатора Species
- BodySkin и FaceSkin – текстуры тела и головы
- Portrait – картинка для игрового меню
- Text – это та самая инфа, которую мы записали в XPlayers.int
- Sex – он и в Африке – пол :-)), а не то, что Вы подумали
- Menu – значение SP означает, что модель доступна в Single Player.
- Ragdoll – по какому из трёх способов (Male/Female/Bot) подстреленная тушка персонажа будет падать и взаимодействовать при этом с архитектурой уровня ;)

Сохраняйте оба файла и вперёд! Запускайте игру, режим Instant Action, выбирайте карту с опцией Use Custom Bots, в список добавляйте Вашу модель и… Spectate, а не Play. Забиндуйте на какую-нибудь клавишу команду playersonly (заморозить выполнение всех игровых скриптов а-ля Матрица) и наивнимательнейше следите за анимацией вышей модели. Увидите баги, исправляйте!

Вернуться к содержанию

# 4.2. Создание дистрибутива.

Поздравляю, Вы сделали Вашу первую игровую модель для Unreal Tournament 2003! Как Вы знаете, для того, чтобы выложить своё творение в И-нет, надо создать дистрибутив. Для этого существует море способов. Самый простой, IMHO, использовать возможности всемирно распространённого архиватора WinRAR v3.20 и старика DOS’а. «Как?! При чём тут ДОС, ты спятил?» - спросите Вы. Совсем нет, сейчас увидите, почему.

Давайте разберёмся в структуре нашего мода. Есть три файла: System\Erazer.upl, Textures\ErazerTex.utx и Animations\ErazerAnim.ukx. Также имеется дополнительная строка в файле XPlayers.int. Размещение файлов можно организовать просто распаковкой, а как быть с дополнительной строкой в XPlayers.int? Тут нам поможет ДОС! Создаём текстовый файл install_ErazerPM.bat и пишем такую начинку:

@echo off

echo.>> system\xplayers.int

echo Erazer="Name: Erazer|Age: 27|Race: IGROMANUS NATURALIS|Data:|IGROMANIA RULEZ!!!||">> system\xplayers.int

Этот системный скрипт отступает от последней записи в файле одну строку и дописывает требуемое. Последовательность инсталляции ясна. А наоборот? Удалить данные о модели должен файл uninstall_ErazerPM.bat. Сделаем так, чтобы такой файл создавался автоматически после инсталляции. Для этого в файл install_ErazerPM.bat добавляем «генератор деинсталлятора»:

echo del System\Erazer.upl >> uninstall_ErazerPM.bat

echo del Animations\ErazerAnim.ukx >> uninstall_ErazerPM.bat

echo del Textures\ErazerTex.utx >> uninstall_ErazerPM.bat

echo del %%0 >> uninstall_ErazerPM.bat

del %0

Первые четыре строки создают командный файл, который удаляет файлы модели. Пятая строка – команда инсталлятору удалить себя. Всё запаковываем RAR’ом в SFX-архив и распаковщику пишем такой комментарий:

title=Установка игровой модели Erazer для UT2003

text=Укажите путь к игре (например, C:\Games\Unreal Tournament 2003)

path=C:\Games\Unreal Tournament 2003

setup=install_ErazerPM.bat

Вуаля! Указываем путь, архив распаковывается по указанному пути, и запускается инсталлятор. Он дописывает строку в XPlayers.int, генерит деинсталлятор в игровой папке и удаляет себя.

Вернуться к содержанию

# Приложение: неполадки.

Первая неполадка, с которой Вы столкнётесь с вероятностью 99.9%, довольно банальна. Макс не находит файлы текстур: Model.jpg (c scn1.max до scn26.max), body_unwrap.png и head_unwrap.png (c scn39.max до scn42.max). Исправление проблемы тривиально: укажите Максу, где лежат требуемые файлы. По умолчанию, он ищет их в папке c:\Demos\3dmodel4ut2k3\Pics, где держал их я. Вам нужно указать путь, куда Вы распаковали файлы, например, D:\Mania\Workshop\UT2003\Pics.

Вторая неполадка - во вьюпортах исчезают текстуры. Попробуйте изменить используемый Максом видеодрайвер.

Третья неполадка - в меню игры, вместе с биографией печатаются кавычки. Я же говорил, после строки Erazer="..." в файле XPlayers.int не должно быть пробелов, проверьте ещё раз внимательно.

Среди файлов сцен лежат два файла: tga и bmp. Хотя они и занимают всего 79 байт, лучше их не удалять. Есть у Макса один прикол: он иногда начинает требовать текстуры, которые хоть один раз использовались в сцене, независимо от того, нужны ли они теперь или нет. Ну не может он жить без этих двух файлов - требует постоянно.

Четвёртая неполадка - в редакторе EditUVs пропадают рёбра, когда Вы ограничиваетесь определённым Material ID. Для устранения проблемы ещё раз напомните Максу, какой именно ID Вам нужен (маразм какой-то!).

Вернуться к содержанию

# Вместо заключения...

Вы прошли весь туториал до конца, с чем я Вас поздравляю. Даже дочитать до этого места не легко, не говоря уже о выполнении работ... Дальнейшая судьба туториала зависит только от Вас, дорогие читатели. Если общественности сей материал придётся по вкусу, я буду писать и о других аспектах движка Unreal Warfare. А писать есть о чём: шейдеры, статические объекты, порталы, нестандартные скелеты, их физика и многое, многое другое. Всё зависит от Вас. Будучи обитателем той же планеты (и даже страны), что и Вы, я склонен допускать какие-то неточности и ошибки в изложении. Если какой-то момент материала не до конца понятен, не стесняйтесь, задавайте вопросы мне на мыло (так у меня появится повод сделать FAQ). Любая критика также будет принята к сведению.

Благодарности (там-тар-ра-рам!!!):

1. Вам, за то что Вы это ВСЁ прочитали!
2. Себе, за то что у меня хватило сил этот тутор дописать.
3. Всем девелоперам, накатавшим весь этот замечательный софт.
4. Музыкальным группам Era и Scooter за создание рабочей атмосферы.

С уважением, Павел Севец.

Вернуться к содержанию