Skyrim: Импорт / экспорт брони.

Это текст о технологии импорта/экспорта одежды по состоянию на 1.01.2012. С Новым годом.

Необходимый инструментарий:

Неудачная операция предвещает удачное вскрытие.

Некоторые особенности скелета Скайрима. Их существует целых 5 штук:

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

В женских версиях скелета кости ладони (Hand) имеют масштаб 85,17% вместо 100% в мужских версиях.

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

Настройки импорта и полученный скелет:

Чтобы отобразить кости, надо выделить их все и снять галку Link Replaces Object.

Гладко было на бумаге... А овраг такой. В ригах Biped, CAT или из просто костей и в 3DMax и в Maya традиционно для высоты используется локальная ось Х. Точнее, это не высота, это направление оси Х кости на следующую кость в цепочке. У кости чисто технически нету никаких габаритов, это точка в пространстве, имеющая определенные координаты и поворот в трехмерном пространстве. А все, что мы видим - вспомогательная геометрия для удобной работы. Но для простоты пускай ось Х называется высотой кости.

В скелете Скайрима для высоты используется ось Z. Это не ошибка импортера. Хотя в Oblivion, Fallout3 & FalloutNV в скелетах высота костей была по оси Х.

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

Хотя может быть и результат работы на риге CAT, там есть штатная возможность переключить высоту кости на ось Z вместо X. Но опять не ясно на кой это делать.

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

А мы украдем и скажем, что так и было.

Настройки для импорта самих доспехов из Skyrim-а аналогичные как и для скелета. Только нужно убрать галку "Import Skeleton", так как он уже есть в сцене.

Кроме импорта брони нужно импортировать и базовую геометрию тела. Если делать под реплейсеры, то тем более нужно импортировать тело реплейсера.

Сейчас первый и главный реплейсер женских моделей CBBE. Но он мне не очень нравится, так что я делаю под оригинальные.

Оригинальная женская модель:

skyrim\meshes\actors\­character\character assets\­femalebody_0.nif

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

Но рядом лежит модель:

skyrim\meshes\actors\­character\character assets\­femalebodyastrid_0.nif

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

Пара слов о двух вариантах тел и брони с суффиксами _0 и _1. Это 2 морфа тела - худое и полное, а переход между ними управляется игровой настройкой "телосложение" при создании персонажа. Вполне логично для будущих реплейсеров делать второй морф _1 не жирный, а для мужских моделей перекачанные мышцы, а для женских моделей размер груди и задницы. От того факта, что это 2 морфа, следует, что геометрия моделей в них должна совпадать по количествам вершин и полигонов. Скорее всего, при их несовпадении игра аварийно вылетит. Чтобы увидеть это в 3DMax, нужно использовать модификатор Morpher, требования к моделям у него точно такие же.

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

И ваша кожа станет нежной как у младенца.

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

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

После этого нажать Convert to Skin и удалить модифиактор SkinWrap. В настройках скина, в разделе Advanced Parameters сразу исправить пункт Bone Affect Limit = 4.

Из-за использования Z-оси для высоты костей получается слудующая картина в модификаторе скининга:

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

Временное решение этой трудности в использовании скин-утилиты. На командной панели в последней вкладке Utilites есть SkinUtilites.

Extract Skin Data To Mesh используется для извлечения скин-даты в обычную геометрию. Потом половина обрезается и отражается. Затем, выделив скин-дату и модель, использовать Import Skin Data From Mesh. В настройках нужно поменять левые и правые кости.

В результате имеем отражение скининга. Которое все равно нужно проверять, т.к. скиндата копируется по дистанции указанной в поле Threshold. Это дистанция на которой вершина с скиндаты влияет на вершины целевого объекта. Если вершина целевого объекта не попадает в радиус действия - скиндата никак не повлияет на ее вес.

А еще лучше взять мои скелеты. Версия 0.9 с Biped-ом. Версия 2.0 с CAT-ом. В них миррор работает корректно.

И послал царь Ивана-дурака туда-не-знаю-куда.

Перед экспортом нужно еще добавить BSDismemberSkin Modifier. Его в который раз изменили. В Fallout 3 он использовался для расчлененки. В Скайриме для указания видимости указанных бодипартов. Более конкретную настройку все равно делать надо в NifSkope. Но выделить части надо в 3DMax.

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

Материалы на модели. Главное, чтобы у каждой из частей был только один материал. Материалов типа Multi/Sub-Object в сцене быть не должно, иначе - вылет 3DMax-а при экспорте. При импорте для моделей создаются материалы Standart c шейдером Nifftools Shader, шейдер нужно поменять на Blinn. У экспортера такая особенность, что Nifftools Shader он записывает в версии под Oblivion, а не в той, которая указана в экспортере. Так как экспортер сырой, все настройки материалов все равно нужно делать через NifSkope.

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

FUS RO DAH!!!111

В полученном файле, в нодах NiTriShape нужно удалить ноды NiMaterialProperty и BSLightingShaderProperty. Первый отныне не используется вообще, второй все равно неправильный и нужно копировать из оригинальных файлов, заменяя BSLightingShaderProperty в разделе BS Properties нода NiTriShape. Если делается совершенно новая одежда, настройки материалов все равно удобнее скопировать с оригинального файла, заменив пути к текстурам.

В свойствах нода BSLightingShaderProperty следует обратить внимание на параметр Skyrim Shader Type. Для одежды используется - 1, для тела - 5. Также важен параметр Shader Flags 2. Когда я скопировал материал дракона, у него флаг был равен 32801 и на персонаже эта часть геометрии была черной, только со спекуляром. У даэдрической брони этот флаг равен 32769 и, установив его, модель стала корректно отображаться. Пока никаких точных сведений про Shader Flags 1 и Shader Flags 2 нет и они сильно отличаются в разных файлах. Поэтому, если что-то не так с шейдером в игре, остается метод тыка.

Update: в новых версиях NifScope флаги раскрыты в нормальном виде с правильными именами.

BSShadetTextureSet использует 9 текстур:

В ноде BSDismemberSkinInstance нужно подправить индексты Body Part для всех частей (Partitions), что были указаны в модификаторе BSDismemberSkin Modifier:

Так как для лица и тела в Скайриме используется нормалмапинг, снятый в Object Space (что это такое, читайте статью NormalMap), то при их наличии в файле в ноде NiTriShapeData нужно параметру Has Normals установить no. Это делается двойным кликом по параметру в столбце Value. Там же для параметра Has Vertex Color двойным кликом установить yes. Белый цвет вершин будет создан автоматически.

Одежда же использует Tangent Space нормалмапинг, там ничего не нужно удалять и править. Наличие цвета вершин не обязательно. Но может использоватся движком если есть.

Последняя правка проводится в заголовке файла. Во всех файлах нулевой нод называется аналогично имени ниф-файла, а при экспорте там будет написано Scene Root. Хотя, кажется, это не влияет на работу, т.к. я скопировал броник _0 с именем _1, но строчку в NiHeader не исправлял. Тем не менее работает.

Если что забыл - спрашивайте.

Daedric armor