Генеральские полигоны. Построение моделей для C&C: Generals. Часть 2
В прошлой статье мы смоделировали каркас нового юнита для игры Command & Conquer: Generals— гаубицу.
- Вершины объединились
Сегодня мы завершим работу: немного подправим каркас, проработаем детали, сократим число полигонов модели до минимально необходимого и сконвертируем файл в формат, понятный игровому движку. Отсекаем лишнее Нужно убрать с заготовки все лишние полигоны — в модели пока слишком много граней, чтобы движок справлялся с их обработкой.
- Двигаем вершину
Наша задача — сохранить приемлемую форму при минимальном количестве полигонов. Сэкономленные полигоны пойдут на детализацию юнита. Для этого внимательно осматриваем заготовку модели и исходя из соображений логики решаем, какими полигонами стоит пожертвовать. Как только таковые будут найдены, переходим в режим редактирования подобъектов — вершин ( Vertex ). Удалять полигоны можно несколькими способами. Самый простой, но не самый очевидный таков. Выделяем вершину, расположенную на стыке полигона, который необходимо оставить, и полигона, который нужно убрать. Затем в свитке параметров модификатора находим группу операций Weld , нажимаем кнопку Target. В поле справа указываем зону действия операции (например, 20 pixels ) и переходим обратно к модели. Вершина подготовлена для перемещения (как будто вы нажали кнопку Move ). Подводим курсор к оси, вдоль которой нужно перемещать вершину, и двигаем ее (с зажатой л.к.м. ) в направлении одной из вершин удаляемого полигона. Как только вершина, к которой вы двигали курсор (условно будем называть ее конечной вершиной), попадет в зону действия операции Target перемещаемой вершины, курсор изменит внешний вид на обычный. После этого просто отпустите кнопку мыши. Перемещаемая вершина объединится с конечной. Грань, в которую входила конечная вершина, — исчезнет. Действуя таким образом, максимально очищаем каркас от всех полигонов, которые можно удалить без изменения формы заготовки. Согласно первоначальному плану, достраиваем оставшиеся основные части модели. В моем юните (гаубице) — это рама, вторая часть кузова и колеса. Построение рамы и кузова я провел точно так же, как создавал кабину.
- Колесо, полученное из стандартного примитива Cylinder.
- Правда, гораздо лучше?
Для формирования колес использовался стандартный примитив Cylinder. При построении значение Sides для цилиндра лучше устанавливать меньше или равным 12. Чем меньше значение, тем больше цилиндр с торца будет напоминать многоугольник. При этом — меньше полигонов уйдет на заготовку (значение 12 дает вполне удовлетворительный результат). Используя функцию Edit/Clone , строим повторяющиеся элементы, чтобы сделать несколько колес. Выделяем отдельные части модели, перемещаем их на места будущей постоянной дислокации (режим Move ). Сумма полигонов Пришло время проверить, насколько были эффективны наши усилия по сокращению количества полигонов в модели. В Generals модели содержат в среднем по 350 полигонов. Для подсчета запускаем утилиту Polygon Count , для чего выбираем на панели управления вкладку Utilites , щелкаем кнопку More и, найдя Polygon Count в списке дополнительных утилит, жмем кнопку ОК. Мой результат меня никак не устраивает — 293 полигона на половину модели, следовательно, полная модель будет состоять из 586 полигонов. Лимит почти выбран, а я еще не приступал к установке оружия… Необходимо найти и устранить причины столь неутешительного результата. Для этого по отдельности выделяем каждую “подозрительную” часть модели и смотрим в верхней группе Selected Objects диалогового окна Polygon Count количество полигонов.
Я получил: кабина — 33, первая и вторая части кузова — по 24, рама — 20, колеса — 192. Вот оно что! Во всем виноваты колеса, 48 полигонов на одну небольшую деталь (48*4=192) — это слишком. Проблема решается довольно просто. Посмотрите на рисунке, как выглядит заготовка колеса, создаваемая из стандартного примитива Cylinder. Делаем следующее преобразование: щелкаем на выделенной заготовке п.к.м. и выбираем пункт Convert to/Editable Poly. Теперь на обновленное колесо уходит всего 14 полигонов вместо 48, а вид точно такой же. Из полученной половинки модели формируем полную. В зависимости от конфигурации модели и расположения дублируемых деталей, входящих в ее состав, возможны 4 варианта действий. 1. Если деталь имеет законченный вид и присутствует на обеих сторонах модели, то просто делается ее копия (меню Edit/Clone ), которая переносится на новое место. В нашем случае так был сделан второй комплект колес по левому борту. 2. Если деталь имеет простую форму, которая продолжается по одной из осей на правой и на левой стороне модели, то надо просто увеличить размер детали по этой оси. Для этого выделяете деталь, переходите в режим подобъекта Vertex , выделяете крайние вершины на детали по нужной оси (обязательно сбросив флажок Ignore Backfacing в свитке параметров) и перемещаете вершины на необходимое расстояние. Таким образом была “растянута” на обе стороны модели заготовка рамы гаубицы. 3. Если деталь имеет осевую симметрию, а на заготовке представлена только ее половинка, то сначала создаем копию этой части детали. Затем зеркально отражаем ее по оси (меню Tools/Mirror ).
Устанавливаем режим просмотра Wireframe (выбираем во всплывающем меню после щелчка п.к.м. на названии видового окна); если необходимо — преобразуем клонированную деталь в Editable Mesh. Выделяем исходную деталь, раскрываем вкладку Modify , переходим в режим редактирования подобъекта (например, Vertex ). В свитке параметров нажимаем кнопку Attach. Переходим в видовое окно и щелкаем л.к.м. на клонированной половинке детали. Этим действием вы номинально присоединили вторую половинку к первой. Чтобы соединить обе части фактически, выполняем следующие манипуляции. Переходим в режим подобъекта Vertex (вкладка Modify , в списке Editable Mesh ). При снятом флажке Ignore Backfacing выделяем все вершины присоединяемой половинки и перемещаем их (при этом будет перемещаться вся часть модели) до совпадения с вершинами исходной половинки детали. Контролировать совпадение легко: выделенные вершины будут другого цвета. На конечном этапе “свариваем” вершины ( Weld ). У гаубицы таким способом были выполнены кабина и кузов. 4. Если деталь не имеет осевой симметрии, а располагается в обеих половинках модели, то вам придется делать обе части детали отдельно и только потом соединять их в единое целое так, как было описано в п.3. Иногда гораздо проще и быстрее сразу делать отдельные части целиком. Шлифовка модели После того, как мы получили целую заготовку модели, состоящую из основных частей, надо опять подсчитать общее количество полигонов и оценить, сколько осталось на детализацию. У меня в поле All Objects утилиты Polygon Count красовалась цифра 230. При лимите в 350 полигонов для Generals это неплохо. Но результат можно (и нужно) улучшить.
- В целях наглядности операция показана только на одной из частей модели. На втором рисунке - неверное расположение плоскости, полученное автоматически. На третьем - ее положение уже отрегулировано
Обратите внимание: ряд деталей имеет стороны, которые никогда не увидят игроки. В нашей модели такими частями являются: нижние стороны кузова и кабины, нижняя и верхняя сторона рамы, внутренние стороны колес. Чтобы “усечь” лишние полигоны — выделите их (в режиме подобъекта Polygon ) и удалите клавишей Delete. Только помните: если удаляемая деталь участвует в анимации, ее некрасивая изнанка может случайно проявиться в игре. Представьте ситуацию — при взрыве у модели должно отлететь колесо. И если с внешней стороны колесо будет выглядеть “как живое”, то с внутренней, где полигон удалили, — вместо колеса окажется уродливый обруч. **
**
- Внешний вид редактора и передвинутая проекция
После удаления невидимых игроку частей моя модель содержала всего лишь 190 полигонов. При установленном нами ограничении в 600-700 задел для добавления деталей довольно значительный. Поэтому я добавил мелкие детали, создавая их так же, как и основные элементы каркаса. В итоге модель содержала 479 полигонов (правда, пришлось немного изменить конфигурацию задних опор фиксаторов).
- Проекция кабины в редакторе координат проецирования
Каждому цвету — свое место Чтобы каждый участок нарисованной текстуры ложился точно на заданную часть модели, применяется модификатор Unwrap UVW. Последовательно выполняем следующие действия: 1. Объединяем все части модели: в режиме подобъекта Polygon нажимаем кнопку Attach List , выделяем все ( All ) и нажимаем Attach. 2. Открываем на панели управления вкладку Modify и в списке доступных модификаторов выбираем Unwrap UVW.Внимание: все операции по изменению геометрии модели должны быть к этому моменту закончены. Возвращение к модификаторам Editable Mesh ( Editable Poly ) приведет к изменению координат проецирования, которые были получены с помощью модификатора Unwrap UVW. Координаты проецирования нужны для того, чтобы получить плоскую карту всех частей 3D-модели. Процесс несложный, но кропотливый: 1. Выделяем модель, открываем вкладку Modify , раскрываем список Unwrap UVW и выделяем Select Face. 2. Возвращаемся к модели и выделяем полигоны, которые могут быть одновременно спроецированы на плоскость. То есть те, которые не перекрывают друг друга при проецировании (можно выделять практически все не перпендикулярные друг другу полигоны). Необходимо отметить следующий момент: две одинаковые противолежащие стороны тоже могут проецироваться одновременно. Обратите внимание на желтую рамку, которая обозначает плоскость, на которую будут проецироваться выделенные полигоны.
- Укладка проекций
Если в группе Sub Object Params установлен флажок Averaged Normals , то плоскость подстраивается под выделенные полигоны автоматически. К сожалению, не всегда правильно. Чтобы добиться более точного подстраивания, можно регулировать положение плоскости “вручную”, устанавливая флажки против пунктов X , Y или Z. 3.__ В свитке параметров модификатора Unwrap UVW щелкаете по кнопке Edit. На экране появится окно редактора координат проецирования — Edit UVWs
- Нанесение текстуры
. По умолчанию в редакторе будет отображена проекция всей модели (с какой стороны — зависит от настроек редактора). Скорее всего, это будет проекция вида сверху. Она нам не нужна, поэтому передвиньте ее в сторону и освободите выделенный серой рамкой квадрат, в котором будут отображаться все последующие задаваемые проекции. 4.__ Возвращаемся обратно к свитку параметров и нажимаем на кнопку Planar Map. Полученное плоское отображение выбранных участков появилось в редакторе Edit UVWs. Перемещаем плоское изображение в сторону от квадратной рамки, освобождая там место для новых проекций, и переходим к следующим сторонам детали. Постепенно переводим на плоскость всю модель. Обратите внимание. После того, как будет создана проекция какой-либо стороны детали, на общей проекции модели (сделанной редактором в самом начале нашей работы автоматически) исчезнут линии, отображающие данную сторону. По мере того, как вы будете получать все новые и новые проекции различных сторон — количество линий на общей проекции будет уменьшаться. Таким образом очень легко контролировать, какие части модели вы пропустили. После того, как все стороны каждой части модели получат свои проекции в редакторе Edit UVWs , нужно разместить их на результирующей проекции в пределах квадратной рамки. В исходном состоянии они там просто не поместятся, необходимы дополнительные преобразования. Для этого удобно применять масштабирование проекций (кнопка Scale ). Принцип следующий — проекции сторон модели, которые будут наиболее заметны в игре, должны занимать больше места на результирующей проекции.
- На этом рисунке показана модель, у которой в качестве текстуры использовалась “нераскрашенная” карта проекций (см. рис. выше)
Когда все проекции размещены в заданной рамке, делаем скриншот развернутого экрана редактора (клавиатурной клавишей Print Screen или с помощью программы, умеющей делать снимки экрана). Сохраняем полученное изображение в файле (в формате BMP ), открываем его в графическом редакторе (например, в Adobe Photoshop ) и покрываем проекции текстурами. Рисование текстур часто занимает больше времени, чем моделирование. Когда будет готова карта с раскрашенными проекциями, сохраняем файл в формате TGA и возвращаемся в 3D Max. Загружаем модель, выделяем ее и вызываем редактор материалов (клавиша M ).
- А здесь та же карта, но все проекции на ней заполнены текстурами
Раскрываем группу Maps. В параметрах выделенного материала устанавливаем галочку напротив Diffuse Color и щелкаем по кнопке Map , которая находится в этой же строчке (как и у остальных кнопок, первоначально на ней отображается слово None ). В появившемся диалоговом окне Material/Map Browser выбираем Bitmap , после чего задаем путь до нашей карты с текстурами.Результат отображается в видовом окне 3D Max. Инсталляция модели в игру Давайте разберемся, как поместить готовый юнит в игру. Текстуры для моделей должны быть сохранены в формате DDS. Если работа по изготовлению выполнялась в Adobe Photoshop , то необходимо установить плагин, позволяющий программе понимать этот формат. Плагин можно взять с апрельского компакта “Игромании”, он входил в состав утилит для редактирования игры Battlefield 1942 — Unofficial_SDK (файл dds.8bi ). Плагин работает только с седьмой версией Adobe Photoshop. На момент написания статьи в Сети был обнаружен только один конвертер для моделей из формата Gmax в формат Generals — W3D. Модель, сохраненная в 3D Max в формате 3ds, прекрасно импортируется в Gmax (правда, наблюдается некоторое увеличение количества полигонов). Учтите, что карта проекций не будет загружена! Поэтому, если планируете такой переход, то делайте его до того, как начнете работать с модификатором Unwrap UVW. Работа по наложению текстур в Gmax ничем не отличается от описанного выше для 3D Max. Основная неприятность заключается в том, что конвертер ( W3D to gmax Importer v 1.06 ) пока не умеет работать с анимацией. Энтузиасты работают сейчас над конвертером для 3D Max. Нам же остается только ждать. Как только конвертер, поддерживающий анимацию, появится в интернете, мы сразу же выложим его на наш компакт. Вам останется лишь нажать несколько кнопок, и анимированная модель будет помещена в игру. *** Мы с вами прошли путь от рисования черновых набросков и стандартного примитива Box до создания 3D-модели, которую можно импортировать в игру. Оказалось, черт действительно не так страшен, как его малюют. Изготовление низкополигональных моделей техники вполне доступно даже начинающим. А если вы займетесь этим всерьез, то после приобретения некоторого опыта никакой 3D-черт вам уже будет не страшен.