Fallout3DMaker

Это описание процесса конвертирования моделей Unreal Tournament 3 для создания модификаций Fallout 3. От импорта сырья из анрила, до экспорта в NIF-формат для GECK. Наверно пригодится и просто тем, кого мучают вопросы по экспорту трехмерки в Фоллаут3. Предполагается некоторое наличие знаний по 3DMax, Photoshop, NifScope, да и просто наличие здравого смысла и умения использовать кнопку F1 если она доступна.

Минимальные системные требования и инструменты для препарирования:

Вступительное слово окончено.

Импорт моделей из Unreal3
Искусство кройки и шитья армора
Трепанация текстур и UVW-координат
Скининг, BSDismemberSkin & экспорт
Кун-фу NifSkope и допиливание до финала
Коллизии
Спецэффекты

Импорт моделей из Unreal3.

1. Вскрытие пациента показало что пациент умер от вскрытия.

Все ресурсы для персонажей лежат в директории "Unreal Tournament 3\UTGame\CookedPC\Characters", оружие "Unreal Tournament 3\UTGame\CookedPC\Weapon". На вскрытие вызвалась броня Железных Стражей, не вся разумеется. Делаем папку unpack и копируем туда файлы CH_IronGuard_Female.upk и CH_IronGuard_Male.upk.

Туда же копируется распаковщик umodel_win32 (umodel.exe и SDL.dll). Теперь небольшой пакетник для обработки: создать текстовый файл и переименовать его в run.bat, открыть в блокноте и ввести туда строку:
umodel.exe -export -md5 CH_IronGuard_Female
Сохранить, закрыть,  и запустить. После чего будут извлечены из недр архива потроха пациента для женской версии брони. Нужно тоже самое сделать и для мужской, изменив в батнике строку на:
umodel.exe -export -md5 CH_IronGuard_Male

Все барахло кроме файлов *.tga и *.md5mesh можно удалять.

2. Воссставший из md5.

Настало время импортирования. Для женской брони мне приглянулась комбинация частей: torso 01, shoulders 03, arms 02, thighs 01, boots 01. Для мужской версии: torso 03, shoulders 03, arms 03, thight 03, boots 03. А так же головные уборы: goggles, facemask 01,  Helm 05.

Скрипт md5importer должен быть разархивирован в директорию \Autodesk\3dsMax8\scripts. Теперь в главном меню MaxScript -> Run Script -> выбрать md5importer и откроется его панель. Нажав Import MD5 выбрать первую часть SK_CH_IronG_Female_Torso01.md5mesh. В результате появится скелет и заскиненная на него бронь груди.

Теперь для удобства открыть редактор материалов, загрузить мультиматериал от брони, а потом перетащить оба слота из мультиматериала в соседние ячейки редактора материалов. И исправить пути к текстурам, тут надо отметить что имена не совсем совпадают, такая вот особенность, но выбирать надо самое подходящее, к примеру для MI_CH_IronG_FHead01_V01 у первого сабматериала нужно указать T_CH_IronG_FHead01_D01_V01_SK1.tga, а для MI_CH_IronG_Fbody01_V01 у второго сабматериала нужно указать T_CH_IronG_FBody01_D01_V01_SK1.tga.

Разделить мультиматериал на два одиночных нужно для будущего экспорта, да и просто удобнее контролировать. Теперь отключив у брони показ в режиме See-Through (в свойствах объекта в меню по правому клику) можно рассмотреть текстуру на объекте.

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

Включить wireframe-режим (каркасный)  вьюпорта (быстрая клавиша F3 если кто не помнит). Выделить броник и активировать режим Edit Envelopes. Теперь по очереди выделяя кости смотрим - если кость влияет на сетку и вершины подсвечиваются (от темно-синего до красного), то ее оставить, если вершиные не подсвечиваются, то такую кость можно смело удалять из списка. Теперь запустить еще одну копию макса и импортировать модель SK_CH_IronG_Female_Thighs01.md5mesh. Удалить из скининга неиспользуемые кости, включить режим выделения по вершинам и сохранить данные скинига в временный файл.

После этого удаляется модификатор Skin и сцена сохраняется в временный файл. Только нужно запомнить или записать какие кости были в модификаторе Skin перед удалением, пригодится. После этого в сцене с броником грудной части делаем File -> Merge и выбирается только меш SK_CH_IronG_Female_Thighs01, в процессе макс поинтересуется что делать с совпадающим материалом: использовать из сцены откуда мерджим, использовать тот, который в сцене и наконец переименовать совпадающий материал. В случае с анрилом, у каждого набора брони используется одна и тажа текстура на все части: грудь, штаны, бутсы, руки, плечи. Стандартно там 2-3 варианта броников плюс дополнительно могут быть 1-2 варианта рук и плеч. Так как присоединяемые штаны из того же комплекта что и грудь, то следует использовать материал старой сцены. Правда штаны используют только один саб-материалов мультиматериала сцены, и по умолчанию не тот что надо :). Открыть редактор материалов и назначить штанам место мультиматериала только саб-материал MI_CH_IronG_Fbody01_V01. Вот для чего в начале саб-материалы были скопированы в соседние ячейки.

Затем на штаны добавляется модификатор Skin, и ему добавляются те кости, которые были в штанах при импорте из MD5. А потом загружается инфа о привязке вершин из временного файла.

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

Дальше аналогично делается с бутсами SK_CH_IronG_Female_Boots01.md5mesh. И бутсам тоже надо назначить материал MI_CH_IronG_Fbody01_V01 вместо мультиматериала.

Пришел черед рук SK_CH_IronG_Female_Arms02.md5mesh. Действовать по схеме. Единственная трудность - бльшое количество костей в руках и при переносе скининга надо быть внимательным, чтоб ничего не перепуталось. А то будет на левую руку влиять скелет от правой руки. С другой стороны сейчас это не критично, этот скининг нужен только для будущего выравнивания скелета по скелету Фоллаута3. В случае с руками, они принадлежат другому сету, поэтому при мердже мешки надо выбрать Auto-Rename Merged Material. И исправить путь к текстуре для него на T_CH_IronG_FBody02_D01_V01_SK1.tga.

И последняя часть плечи SK_CH_IronG_Female_LShoPad03.md5mesh. Там зачем-то плечи отдельно для левой и для правой части, обе импортировать не обязательно, т.к. они зеркальны. Левое плечо соответственно заскинено на кость b_LeftArm и ничего более. Тут проблем с переносом никаких. Только материал опять присоединять как Auto-Rename Merged Material. Потому что это третий сет и у него своя текстура T_CH_IronG_FBodyAddons02_D01_V01_SK1.tga.

- Доктор, я буду жить?
-А смысл?...

Искусство кройки и шитья армора.

3. Главное - чтобы костюмчик сидел.

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

Теперь импортируем тело из реплейсера. Обязательно указывать скелет при импорте, его скорее всего придется распаковать из bsa-архива, если до этого ресурсы игры не были распакованы.

Из импортируемого тела стоит удалить оба bodymeat, MeatCapBody и MeatCapLimbs. Для работы они не нужны. Выделив сетку тела и открыв окно слоев нажать создание нового слоя, меш тела автоматом добавится на новый слой. То же самое сделать выделив все кости скелета.

Таким образом навигация в сцене значительно упрощается. Теперь кости скелета, они отображаются линиями, это не совсем удобно для восприятия. Выделить кости скелета и в вкладке Display на командной панели снять галку Link Replace Object.

Пришла пора присоединить сюда скелет и броник UT3 или можно наоборот в старый файл присоединить это тело со скелетом. Можно и было импортировать и прямо в тот файл. Просто этот можно сохранить на будущее в качестве зготовки. Как можно увидеть масштабы не совпадают. Да еще и развернуто на 180 градусов. Для импорта/экспорта в Фоллаут3 установка единиц измерения в максе (Customize -> Units Setup -> System Unit Setup) вроде бы не важна, главное попать в размеры в относительных единицах, человек ростом 128 единиц. Эта традиция еще с морровинда осталась.

Cреди костей скелета UT есть 7 штук начинающихся на b_IK_ они не нужны, удаляем. Теперь вызвать окно Schematic View (меню Graph Editors -> New Schematic View), в нем выделить иерархии скелетов Фолла и UT3 и по правому клику в контекстном меню в панели layout нажать Free Selected. Это отключит режим автоматического выравнивания иерархии в окне Schematic View при перемещении объектов из иерархии. Для удобства восприятия просто, выровнять иерархию в нечто вроде этого:

Можно начинать выравнивать. Так как все кости иерархии наследуют трансформацию рутовой кости с нее и начнем. Выделив b_Root и развернув ее на 180 градусов, ее нужно от масштабировать под размеры тела. После чего в Schematic View разорвать связи основных костей UT3 скелета (пальцы и кости оканчивающиеся на Roll не трогать).

После этого можно двигать кости скелета UT3 по отдельности, вращать и масштабировать, а сетка брони будет деформироватся в соответствии с этим. Сие гораздо удобнее того если бы сетка не была заскинена и ее пришлось бы подгонять при помощи модификаторов деформации FFD или в режиме мягкого выделения (блок Soft Selection у edit mesh или edit poly, когда выделяя и перемещая одну вершину/ребро/полигон вместе с ним перемещаются и соседние в соответствии с настройками софт селекта). Т.к. скелеты различаются, в общем достатчно подвинуть чтоб визуально броник сидел правильно. После того как все кости выровнены для мешей броника можно делать коллапс стека. Правда скорее всего и после проделанной работы надо будет немнога подвигать вершины в софт-селекте, разный подход к работе был в Epic Games и Bethesda.

К слову редактировать можно только с одной половино, вторую можно отзеркалить. Перед редактированием стоит меш конвертнуть в Edit poly и в нем выделив все вершины из слить (Weld) с порогом не больше 0.01, тогда и разбитая сетка будет соединена в одно целое и мелкие детали не будут удалены.

После завершения всех операций по выравниванию и редактированию мешей всех частей броника им всем стоит сделать Reset X-Form (командная панель -> утилиты -> Reset X-Form). А потом коллапс там же в утилитах. Это обнулит все трансформации и модификации которые могла бы вызвать глюки от инвертирования нормалей и до сдвига или нереального масштабирования частей после экспорта. Скелет UT3 тоже удалить, больше в нем нет надобности.

Еще один момент когда возникает баг с исчезновением части сетки уже непосредственно в nif-файле. Связано это тоже с инвертированием нормалей, но причина в топологии сетки. Экспортер порой неправильно экспортирует многоугольные полигоны, а так же в месте соединения многоугольных полигонов (и даже четырехугольных) с треугольными полигонами. Исправляется это элементраной триангуляцией всей сетки (или той части где возникает эта проблемма). Для этого сетку надо сконвертировать в Editable Mesh, выделить все ребра и в разделе Surface Properties, нажать кнопку Visible. После этого все невидимые ребра станут видимыми, а сетка триангулированной и экспортер не ошибется с нормалями.

Шлем взят от мужской версии. Шлем, очки и маска будут универсальными, благо из-за фейсгена, бошки в фолле одинаковые, ну скажем в пределах +/-2%. Про шлемы в материале "Маска имени Ганнибала Лектора".

Непринужденно, легко и вальяжно.
Всё остальное, поверьте, не важно.

Трепанация текстур и UVW-координат.

4. Из плохих хирургов получаются хорошие патологоанатомы.

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

Кстати, торс пора разделить, выделить его и в режиме полигонов выделить полигоны с Material ID 1 (вкладка Polygon Properties -> Select ID). Это кожа персонажа, которая присутствует в бронике. Выделенные полигоны отделисть через Detach. Затем бронику назначить MI_CH_IronG_Fbody01_V01, а  груди MI_CH_IronG_FHead01_V01, вот зачем было делать разделение мультиматериала на простые материалы. Теперь с сцене ситуация: 1 объект - 1 материал, а это одно из условий безошибочного экспорта модели.

Теперь непосредственно текстуры. Их имена можно посмотреть в редакторе материалов кто не помнит. В папке с распакованными материалами Unreal3 структура такова (относительно одной части к примеру T_CH_IronG_FBody01):

О способе сохранения. Для диффузной текстуры и текстуры свечения _g (если надо) сохраняем в DDS DXT1 без альфа-канала, для нормалмапа сохранять в DDS DXT5, потому как в альфа-канал хорошо класть текстуру спекуляра для бликов. Во всех случая должна быть включена генерация mip-map.

С текстурой normal map чутка посложнее. Я так и не понял возможно ли на объект со скинингом поставить хаймап для parallax occlusion mapping. Это умное слово означат продвинутую технику бамп-мапинга, с более реалистичным результатом чем у обычного нормал мапинга. Теоретически эта технология фоллом поддерживается, практически без пол-литры не обойтись.

Так вот о карте нормала, в фолле так же отстутствуют вменяемые настройки по изменению интенсивности эффекта нормал мапинга, поэтому интенсивность придется увеличивать в самой текстуре. Интенсивность увеличивается копированием слоя и назначением ему блендинга через Overlay. Для примера сделал маску чтоб показать разницу. А так маска не нужна.

Дополнительно эффект можно увеличить используя синий канал изображения. Для понимания www.ixbt.com/video2/terms2k5. В синем канале хранится нормаль по Z и запихнув туда карту хаймапа можно усилить эффект. Для генерации хаймапа используется например CrazyBump на базе оригинальной карты нормала или руками. Хотя можно и обойтись тем, что лежит в нем в исходной карте нормал мапа, его скопировать только не забыть перед добавлением overlay-слоя, именно один синий канал, чтоб потом восстановить и увеличить контраст.

Интенсивность черного в синем канале должна быть очень маленькая иначе будет эффект зачерненности брони, когда не понятно, в какую сторону работает нормал мап. Как минимум самый темный отенок не должен быть чернее 20-30% серого. В общем плохо будет выглядеть иначе, хотя для создания всяких спец-эффектов интересных вполне подойдет, эксприментируется старым добрым методом тыка. Карта спекуляра в альфа-канал нормала делается на базе диффузной карты. CrazyBump или по простому скопировав диффузную карту в альфа-канал и через levels вытянуть яркость/контраст.

Теперь та часть груди, что была отделена от броника. Она использует текстуру головы, и как видно использует 1/16 площади.

Было бы не разумно класть в мод всю текстуру, когда можно обрезать. В настройках фотошопа, в разделе "Guides, Grid, Slices & Count" установить шаг грида в 64 пикселя и включить его (Ctrl+'), тогда будет сетка как на моем скриншоте, в анриле все по правилам сделано, все uvw-развертка умещается в квадратные блоки. Так что обрезать диффузную и нормал карты и сохранить. Им делать усиление бампа и спек не надо. После в 3Dмаксе на грудь добавить модификатор Unwrap UVW и отмасштабировать uvw-развертку до масштабов окна.

Такие же операции надо проделать и с остальными частями - руки, плечи и прочие.

>

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

Скининг, BSDismemberSkin & экспорт.

5. Обиваю двери кожей заказчика...

Приступаем к ответственному моменту скининга. Перед этим еще раз напомню всем частям броника стоит сделать Reset X-Form. И еще раз объединить вершины (weld) c порогом 0.01-0.1 в зависимости от наличия мелких деталей в мешах. Заодно стоит сделать триангуляцию сетки. Для этого надо конвертировать меш в Editable mesh, активировать режим ребер, выделить все ребра и нажать Visible в разделе Surface Properties. Триангуляция избавляет от ошибок при экспорте, когда часть сетки пропадает, т.к. нормали развернуты в другую сторону, случается это из-за наличия многоугольных полигонов, не выпуклых многоугольников (надеюсь геометрию еще помните) и даже границы между сеткой из четырехугольников и треугольников (лично с таким столкнулся). Экспортер не совершенен и нужно всеми способами облегчить его работу.

На броник применяется модификатор Skin Wrap. Эта модификация модификатора Skin, но вместо костей которые будут деформировать сетку используется другой меш, в свою очередь уже имеющий на себе модификатор Skin. Для броника в качестве деформатора добавляется тело из реплейсера (или базовое). Если делаются перчатки - импортировать руки из \meshes\characters\_male\, из файлов lelefthand.nif, righthand.nif или femalelelefthand.nif, femalerighthand.nif и добавить их в Skin Wrap вместе с телом. А для воротников импортировать дополнительно \meshes\characters\head\ headfemale.nif или headhuman.nif и тоже добавить в Skin Wrap.

Настройки:

В 3Dmax8 во время последующего редактирования Skin-а при наличии в стеке деактивированного Skin Wrap могут случатся вылеты, особенно при операциях Undo/Redo, поэтому правый клик по модификатору Skin Wrap и выбрать пункт Collaps To. После этого в стеке модификаторов останется только Skin.

После этого стоит удалить не используемые в скининге (в редактируемой части броника) кости. А так же подредактировать имеющиеся. Вот кость шеи, мне кажется совершенно не нужным ее воздействие на верхнюю часть. Разумеется в некоторых костюмах может быть высокий воротник, и на него должна воздействовать и шейная кость и даже головная. Это зависит от ситуации, ну а тут мне кажется это лишним. Включаем выделение вершин (под кнопкой Edit Envelopes), вызывается диалог Weight Tool (гаечный ключ такой :), выделяются все вершины и им присваивается нулевой вес относительно кости шеи. Вес этих вершин будет автоматически скорректирован относительно других костей. Так же есть ситуация когда на вершины влияют кости с очень малой силой, допустим на вершину влияют 3 кости с весами 0.7, 0.26 и 0.04, и хорошо бы избавится от веса третьей кости. Для этого надо раскрыть в Skin вкладку Advanced Parameters, установить пороговое значение Remove Zero Limit и нажать кнопку Remove Zero Weight. В принципе вес от 0.05 и выше уже играет значение, особенно в низкополигональных объектах да еще в районе суставов.

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

6. Цапу надо крутить, цапу!

Модификатор BSDismemberSkin, это такая штука, определяющая индексы частей тела и полигоны входящие в соответствующие им группы. Необходим для физики взрыва игрока на запчасти. Так как разрывает не по настоящему, а по группам указанным при помощи этого модификатора. Карту индексов можно посмотреть тут saidenstorm.googlepages.com/fallout3bsdismemberskinbodypartindex. Для тел, одежды модификатор обязательный. Я использовал только части:

Когда часть броника содержит несколько групп, штаны например больше всех содержат (Torso, Left Leg, Right Leg, Body | Left Leg, Body | Right Leg) назначение групп полигонов идет по порядку:

Все это проделать для всех частей броника. Для частей с одним бодипартом (шлем например) не достаточно просто применить модификатор BSDismemberSkin и указать в нем Head, надо обязательно активировать режим под-объектов и выделить все полигоны, только тогда модификатор будет работать.

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

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

1. Использовать Niftools Shader, в теории надо это, однако теория с практикой расходится и с последней версией плагина при использовании такого материала экспортер создаст для материала в nif-файле нод NiTextutingProperty, это вариант для Обливиона и придется вручную материалы править.

2. Использовать стандартный шейдер Blinn, тогда экспортер создаст правильный нод BSShaderPPLightingProperty, а для него BSShaderTextureSet с 6 слотами для текстур.

Несколько слов о BSShaderTextureSet и его шести слотах.

  1. диффузная карта (подхватывает из канала diffuse color стандартного материала)
  2. карта нормал мапинга ( _n, подхватывается из канала bump)
  3. текстура свечения, кожи, волос ( _g, _sk, _hl соответственно, не подхватывается, баг экспортера)
  4. текстура дисплейсмента или хаймап или параллакс ( _p, подхватывается из канала selfillumination)
  5. кубмап ( _e, подхватывается из канала reflection)
  6. маска для кубмапа ( _m, подхватывается из канала specular color)

Их порядок отличается от порядка слотов в текстурных сетах при редактировании в G.E.C.K. Но там все поля проименованы и вопроса куда какую текстуру назначить не возникает, а вот в nif-файле просто пустой сет без пояснений и куда какую текстуру прописать с первого взгляда не ясно.

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

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

— Может, бахнем?
— Обязательно бахнем! И не раз — весь мир в труху!... Но потом.

Кун-фу NifSkope и допиливание до финала.

8. Это очень сильное колдунство.

Так как после экспорта в ниф-файле есть исключительно голая броня, она будет скопирована в уже существующий оригинальный файл одежды или тела или реплейсера тела. Я это использую чтоб не морочить себе голову с костями и частями типа Body Meat или MeatCap. Из оригинального файла удаляется ветка (Branch, бранч далее) тела (Ctrl+Del), а потом из файла с броней копируются бранчи брони через Copy Branch.

При копировании бранчей у них слетает имя, так как это ссылка на индекс текста, переименовать -> правый клик по имени и выбрать Edit String Index, там можно выбрать в качестве имени уже существующий, или вписать новый, который добавится к имеющимся. Вот тока удалить не получается :). А если дважды кликнуть по имени левой кнопкой, то можно ввести цифровой индекс, если ввести -1 то имени не будет никакого.

Теперь нужно подправить флаги в шейдере материала:

И для тела и для одежды надо снять флаг SF_SHADOW_FRUSTUM.

Если есть текстура свечения/кожи/волос, то их надо вписать в BSShaderTextureSet.

Для того чтоб текстура свечения стала работать, надо изменить настройки материала:

Для того чтоб G.E.C.K. правильно отображал бронь, все бранчи должны быть подсоединены в корневой NiNode. Для этого в нем надо увеличить цифру Num Children, нажать на зеленые стрелки под ней чтоб обновилась конфигурация и в свободные ячейки Children вписать номера бранчей брони. После чего сохранить проверить все ли хорошо, открыв файл с помощью G.E.C.K. Для этого не надо загружать весь редактор, достаточно по правому клику по файлу выбрать "Открыть с помощью..." и выбрать G.E.C.K. Тогда загрузится только модуль предварительного просмотра, что происходит гораздо быстрее. Правда он закрывается с ошибкой, и порой закрывшись остается висеть в процессах, так что через дюжину запусков забивает всю оперативку и приходится руками его процессы прибивать в диспетчере задач.

Во время запуска надо смотреть какие возникнут ошибки, G.E.C.K. обязательно ругнется первым делом что отстутствуют 2 текстуры для Ground Plane, а вот дальше все будет относится уже к модели. Если с моделью что-то не так, она и вообще может не отобразится в превью, или G.E.C.K. вылетит при загрузке. Проверять в каком месте косяк надо удаляя по одному бранчи брони, найдя таким образом ошибку смотреть эту часть в 3Dmax более внимательно для выявления бага.

9. Strangers in the Ку.

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

Все идет по плану или первые баги.

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

  1. взять кусок модели из реплейсера;
  2. изменить UVW-развертку этого куска под текстуру тела реплейсера;
  3. убрать SHADER_SKIN, но тогда у персонажа-негра будет белая грудь;
  4. убрать SHADER_SKIN и замазать все это дело на текстуре под футболку например.

Последний вариант самый универсальный, т.к. будет полная совместимость с любыми реплейсерами тел и текстур. Закрытые броники заруливают в плане совместимости с модами. Я выбрал изменение UVW-развертки под реплейсер. Так реалистичнее.

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

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

Я обычно оставляю всю руку целиком, имеющаяся в наличии в nif-файле IronG_F_ArmsLeft переименовывается в pipboyoff. А меш для pipboyon делается копия левой руки в 3Dmax и немнога сдвигаются вершины к кости. А чтоб увидеть что именно надо подвинуть, можно воспользоватся программой 3DRipperDX, которая делает скриншот трехмерки из DirectX-а (работает тока в DX9).

Желтые штаны! Два раза «ку»

Коллизии.

10. Ньютон об этом и не подозревал.

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

Сделаю на примере шлема. В данном случае не нужны ни скининг, ни BSDismemberSkin, вообще ничего. Сам шлем уложить в нулевые координаты (по оси Z, так чтоб шлем лежал поверх грида).

Потом создать хелпер bhkCollProxy, в него добавить шлем, выбрать Convex Shape в качестве метода коллизии. Если объект который рисуется красными линиями ну очень сильно высокополигональный получается, то включить оптимизацию чуть ниже. Чем меньше полигонов в коллизии - тем проще ее считать. После чего нажимается кнопка Clone Mesh и в сцене будет создан новый объект, после этого bhkCollProxy можно удалять. По непонятной причине, нормали у этого объекта инвертированы внутрь, возможно это какой-то глубинный замысел разработчиков. Еще в принципе объект для коллизии можно еще больше упростить в ручную, но необходимо помнить о том, что он должен оставатся выпуклым как шар в любом месте. Если вершину допустим внутрь вдвинуть до центра это уже будет не Convex Shape, так что осторожно. На объект добавляется модификатор bhkRigidBodyModifier и в нем выбирается пункт Convex Shape.

Затем создается хелпер bhkRigidBody, его нужно разместить в нулевых координатах, так как отсчет объекта коллизии будет считаться из него. Настройки я там вообще не менял. И экспорт, в настройках установить галку коллизии и выбрать BSFadeNode в качестве рута, это нужно для файлов имеющих коллизию. Заготовка готова.

Теперь нужно взять оригинальный файл имеющий коллизии. В фолле есть два типа файлов, в одних используются кости и на них коллижен-боксы, а в других просто на базе нода bhkConvexVerticesShape. Какой смысл в этом - не представляю. Но я использовал bhkConvexVerticesShape и на шлем и на броню в версии, которая лежит на земле и все работало. Подходящий для этих целей файл \meshes\armor\headgear\combatarmorhelmet­\m\combatarmorhelmetm_go.nif.

Дальше копирование нода bhkConvexVerticesShape из файла шлема, и вставка поверх этого же нода в файле с каской. А потом, вот что важно, точно так же скопировать и нод NiTriStripsData шлема и вставить поверх NiTriStripsData каски. Не знаю, но через копирование бранча если его подменить - не получалось О_о. Загадка или может быть в Антарктиде давление низкое. В финале исправить пути в BSShaderTextureSet и навести глянец с материалами если нужно. Переименовывать ноды можно, но совершенно не нужно. И можно класть в G.E.C.K.

Если единица измерения физической силы - Ньютон, то единица измерения силы ума - Тайсон.

Спецэффекты.

11. Не кочегары мы, не плотники...

Финальные штрихи. Захотелось на бронь дополнительно повесить куб-мап для фейковой зеркальности. Для этого требуется прежде всего создать текстуры-маски для куб-мапа (имена оканчиваются на _m), по принципу белый - блестит, черный - нет. Можно ваять на базе текстуры спекуляра, что было сделано для текстур и положено в альфа-канал нормал-мапа.

Следующее что нужно сделать это прописать текстуры в BSShaderTextureSet, маску в шестой слот, а куб-мап в пятый слот. В качестве куб-мапа используем имеющиеся в фолле (оканчивающиеся на _e)

\textures\effects\bronze_e.dds
\textures\effects\chrome_e.dds
\textures\effects\shinybright_e.dds
\textures\effects\shinydull_e.dds

Кроме вставки текстур нужно в BSShadePPLightingProperty установить флаг SF_UNKNOWN_17, без него куб-мап не заработает. Или нужно иметь BSFadeNode в качестве рутового, но у одежды стандартно используется NiNode.

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


Найтвизор. Делается средствами G.E.C.K. в раделе Imagespace Modifier. В окне превью при редактировании его можно сразу и увидеть как эффект воздествует на сцену.

Мне захотелось сделать:

  1. Свой уникальный найтвизор и на шлем и собственно на очки - делается 2 разных Imagespace Modifier. Отличаются усилением и дистанцией DOF (вот если бы было можно нормально сделать затухание яркости на дистанции...).
  2. Возможность включать/выключать его без особых заморочек. Для этого нужно создать в арморе управляющий модуль, при одевании которого, скриптом включать/выключать ночное виденье. Модуль был сделан на базе \meshes\clutter\junk\sensormodule.nif, такой небольшой пультик. Никаких бодипартов на которые он будет одеватся указывать не нужно, он не должен на модели отображатся (хотя можно использовать BodyAddOn1, BodyAddOn3, BodyAddOn3 если приспичит), а во вторых пульт будет сразу сниматься.

На пульте висит такой скрипт:

scn aaaIronGuardNightVisionMod
begin onequip
if (Player.GetEquipped 0mIronGuardGoggle)
if (aaaIGVisionON == 0)
imod 0mIGNightVision
Set aaaIGVisionON to 1
else
rimod 0mIGNightVision
Set aaaIGVisionON to 0
endif
elseif (Player.GetEquipped 0mIronGuardHelm)
if (aaaIGVisionON == 0)
imod 0mIGNightVision2
Set aaaIGVisionON to 1
else
rimod 0mIGNightVision2
Set aaaIGVisionON to 0
endif
endif
Player.UnEquipItem 0mIronGuardModule 0 1
end

Ну тут все просто, imod добавляет Imagespace Modifier, а rimod его удаляет. aaaIGVisionON - глобальная переменная, которая отслеживает включен или выключен найтвизор.

Дополнительно на шлеме и визоре висят скрипты детектящие их снятие и выключающие соответствующий Imagespace Modifier если он активен. Скрипт:

scn aaaIronGuardNightVisionHelm
begin onunequip
if (aaaIGVisionON == 1)
rimod 0mIGNightVision2
Set aaaIGVisionON to 0
endif
end

Все вместе составляет простую как кирпич схему, которая не глючит :). Правда DOF я убрал, там глюки с альфа-каналом на объектах, в частности ветки деревьев, на альфе DOF не работает и это режет глаз очень.

И на руинах Голивуда напишут наши имена!

Результат этой работы: Unreal 3 Armor for Fallout3.