Модели Killing Floor в 3ds Max: экспорт umodel, импорт ActorX, своя модель игрока и оружия
Серия статей Freddy (metalmedved.com), выложенная на форуме killingfloor.ru в 2011 году: как перегнать модели Killing Floor 1 в 3ds Max и обратно, сделать нового персонажа и новую модель оружия. Понадобятся 3ds Max, KF SDK (Unreal Editor), umodel и ActorX Importer с сайта gildor.org, а также плагин ActorX Exporter для 3ds Max.
Экспорт модели из игры в 3ds Max
- Меши и анимации. Модели игроков лежат в
Animations\KF_Soldier_Trip.ukx. Положите файл рядом сumodel.exeи выполните:
umodel -export -all KF_Soldier_Trip.ukx
Меши (.psk) и анимации (.psa) появятся в подпапке KF_Soldier_Trip\SkeletalMesh.
- Текстуры экспортируются так же из
Textures\*.utx, напримерKF_Soldier4_Trip_T.utx. Результат — в подпапкеTexture. - В 3ds Max запустите скрипт
ActorXImporter.msи нажмите Import PSK, выберите нужный меш. - Наложите текстуру: в Material Editor, раздел Maps, нажмите None напротив Diffuse Color, в Map Browser выберите материал сцены, затем в Bitmap Parameters загрузите нужный
.tga.
Импорт своей модели обратно в игру
- В плагине ActorX Exporter заполните поля, поставьте флажок all textured и нажмите save mesh: получится
.psk. - В Unreal Editor откройте Animation Browser и импортируйте
.psk. - Импортируйте стандартный набор анимаций (
.psa, получен при экспорте). - Сохраните пакет как
.ukx, снова откройте его и заполните свойства меша. Проще всего открыть стандартныйKF_Soldier_Trip, скопировать свойства стандартного меша и вставить их в свой: это задаёт правильную ориентацию в игре. Animation/DefaultAnimationзаполните вручную в форматеMeshAnimation'ИмяПакета.ИмяНабораАнимаций'или через Edit → Linkup anim and mesh. Сохраните.
Для корректной работы новому мешу нужны своя текстура и стандартный скелет.
Новая модель игрока
Пример — Данте из DMC.
- Подготовка. Наложите текстуры и уменьшите полигонаж: оптимум для модели игрока KF — около 7000 полигонов. Лишнее убирается модификатором ProOptimizer.
- Экспортируйте в сцену стандартную модель игрока (см. выше).
- Отмасштабируйте новую модель под стандартную и максимально совместите позы.
- Удалите меш стандартной модели, оставив её скелет, и удалите скелет новой. Только инструментом Rotate разверните кости стандартного скелета так, чтобы они проходили внутри соответствующих частей нового тела. Части тела модели масштабировать можно, кости — нельзя. Сохраните сцену.
- Примените к модели модификатор Skin.
- Проверьте привязку: в ActorXImporter на вкладке Tools нажмите Restore Bindpose. Если пальцы слиплись или конечности перекрутились, вернитесь к шагу 4 или поправьте влияние костей в Envelope.
- Снова экспортируйте простую стандартную модель, склейте её с новой и удалите из склейки части стандартной.
- Экспортируйте новую модель со скелетом через ActorX Exporter и импортируйте в игру, как описано выше. Останется запечь текстуру.
Одна текстура для новой модели (Unwrap UVW)
По статье Freddy «Импорт текстур для моделей в Unreal Engine» на форуме killingfloor.ru (пример — Зои из Left 4 Dead). Подготовьте модель по шагам выше; до модификатора Skin её лучше конвертировать из Mesh в Poly (в любой момент можно воспользоваться и модификатором Edit Poly).
- Выделите модель и примените поверх Skin модификатор Unwrap UVW. Он автоматически разрежет поверхность на зоны, каждая из которых соответствует элементу текстуры (руки, куртка, штаны).
- Нажмите Edit: откроется окно развёртки, где свалены в кучу проекции всех кусков модели. Инструментами Move, Rotate и Scale разместите все части в синем квадрате так, чтобы они не пересекались. Пункт Tools/Pack UVs сделает это автоматически, но даст всем деталям равный масштаб, что плохо скажется на качестве текстур: сохраняйте примерные пропорции, крупные части должны занимать в развёртке больше места.
- Через Tools/Render UVW Template создайте шаблон текстуры. Откройте его в Photoshop, залейте внутренности деталей одним цветом, скопируйте соответствующие текстуры из исходных файлов, выровняйте их по контуру развёртки и сохраните результат.
- Выделите все полигоны модели и на вкладке Polygon Material IDs задайте единый ID. В пустом слоте Material Editor выберите на вкладке Maps Diffuse Color, присвойте ему Bitmap с новой текстурой, выделите модель и нажмите Assign Material to Selection.
- Сделайте рендер и проверьте, не съехали ли фрагменты текстуры; ошибки исправляйте, возвращаясь к шагу 3.
- Импортируйте модель в KF Editor, как описано выше. На вкладке меша Material должен остаться всего один слот, в него и вставляется новая текстура.
Новая модель оружия (на примере сварки)
- Экспортируйте анимации и текстуры оригинала от первого лица:
KF_Weapons_Trip.Welder_Trip,KF_Weapons_Trip_T.equipment.Welder_Dи текстуру рукKF_Weapons_Trip_T.hands.hands_1stP_military_diff. - Добавьте в сцену новую модель без костей, все её текстуры собраны в одном файле.
- Инструментами Move / Rotate / Scale совместите её со старой так, чтобы она естественно лежала в руке. У оружия особенно важно совпадение центра прицела и привязка подвижных частей (магазин, затвор, гильза) к своим костям.
- Удалите старую модель, присвойте материалу новой ID старого, совместите точку спецэффекта (у сварки — сопло). Проиграйте анимацию и проверьте.
- Экспортируйте обратно в игру.
- Повторите для модели от третьего лица (
KF_Weapons3rd_Trip.Welder_3rd). Если оружие можно выбросить, нужна ещё статическая модель для пикапа. - Сделайте мутатор-замену из трёх классов:
class NewWelder extends Welder
dependson(KFVoicePack);
#exec OBJ LOAD FILE=NewWelder_T.utx
#exec OBJ LOAD FILE=NewWelder_A.ukx
defaultproperties
{
AttachmentClass=Class'NewWelder.NewWelderAttachment'
ItemName="New Welder"
Mesh=SkeletalMesh'NewWelder_A.NewWelderMesh'
Skins(0)=Texture'NewWelder_T.NewWelder'
}
class NewWelderAttachment extends WelderAttachment;
defaultproperties
{
Skins(0)=Texture'NewWelder_T.NewWelder'
Mesh=SkeletalMesh'NewWelder_A.NewWelder3rd'
}
class NewWelderMut extends Mutator;
function PreBeginPlay()
{
AddToPackageMap("NewWelder_A");
AddToPackageMap("NewWelder_T");
}
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
if (Other.IsA('KFHumanPawn'))
KFHumanPawn(Other).RequiredEquipment[4] = "NewWelder.NewWelder";
return true;
}
defaultproperties
{
GroupName="KF_NewWelder"
}
Скомпилируйте и подключите как NewWelder.NewWelderMut.
Свои анимации через ActorX Exporter
Дополнение 3xzet: чтобы Unreal понял анимированную модель, анимации экспортируются так:
- Animation file name — имя пака анимаций, например
shotgun_anim. - Animation sequence name — имя анимации, например
reload. - Animation range — диапазон кадров через дефис, например
0-29(30 кадров). - Digest animation, затем Animation manager: перенесите анимацию в пак кнопкой
-->и нажмите save. - Повторите для каждой анимации (
Idleи т.д.). - В редакторе импортируйте меш, сохраните пакет (например
superpuperweap_A.ukx), импортируйте анимации и в свойстве меша Default animation укажитеMeshAnimation'superpuperweap_A.shotgun_anim'.
Вспышка, звуки анимаций, прицеливание и перекраска
Дополнения из тем форума killingfloor.ru «Jackhammer», «Помогите со звуками и позициями вспышки» и «Вопрос по текстурам.»:
- Кость вспышки. Вспышка выстрела рисуется на кости, указанной в коде оружия; обычно это
Tip. Кость можно разместить где угодно, главное привязать её к стволу; обычно её выравнивают поROOTBONEи ставят на конец дула. Если вспышка появляется посреди ствола, а модель использует стандартные анимации (например, от AK47), то позицию кости, скорее всего, меняет сама анимация: импортируйте стандартные анимации и поправьте в них позицию кости или переопределите в классах-предках метод, вызывающий вспышку, со смещением эмиттера. - Положение при прицеливании задаётся в 3D-редакторе относительно начала координат.
- Не только 3ds Max. Для модели оружия подходит и Milkshape 3D: в нём есть экспорт в
psk. - Звук на кадре анимации. В браузере анимаций выберите анимацию (например,
Fire), справа вкладка Notify →[+]Notify→ Add → в настройке Create выберитеAnimNotify_Sound→ Create, затем укажите звуки.NotifyFrame— номер кадра анимации: при значении 6 звук прозвучит на шестом кадре. Для звука перезарядки оружия в теме «Добавления звука к перезарядке» (3xzet, форум killingfloor.ru) делали так: поставить ползунок анимации на нужный момент, во вкладке Notify нажать Добавить (момент запишется вNotifyFrame), выбрать из спискаKFWeaponSoundNotifyи нажать Создать; затем на вкладке Sounds выбрать нужный звук, вернуться на Notify и в строкеSoundнажать Использовать (появится путь к звуку). После этого сохранить пакет анимаций.ukx. - Материалы без Ref. На кастомном оружии Ref-ссылки, по словам 3xzet, работают ненадёжно, поэтому меш и скины лучше прописать напрямую:
Mesh=SkeletalMesh'Имя_Меши'
Skins(0)=Combiner'Имя_комбинированной_текстуры'
Skins(1)=Shader'Имя_шейдера'
Skins(2)=Texture'Имя_текстуры'
- Перекраска чужого оружия (пример Flame: катана из WTF в золотой катане) требует правки трёх классов: оружия (
Skins(0)=Combiner'KF_Weapons_Gold_T.Weapons.Gold_Katana_cmb',BloodyMaterial, иконки HUD и магазина,AttachmentClass=Class'WTF.WTFKatanaAttachment'), аттачмента (вид от третьего лица) и пикапа:
class WTFKatanaAttachment extends KatanaAttachment;
defaultproperties
{
Skins(0)=Combiner'KF_Weapons3rd_Gold_T.Weapons.Gold_3rdP_Katana_cmb'
}
defaultproperties
{
Skins(0)=Texture'KF_Weapons3rd_Gold_T.Weapons.Gold_Katana_3rd'
}
В аттачменте разумно использовать комбайнер, а в пикапе — простую текстуру.