Конвертация НПС из ЧН/ЗП в ТЧ
Материал из S.T.A.L.K.E.R. Inside Wiki
Содержание
Инструментарий
В данной статье нам понадобится следующее программное обеспечение:
- X-Ray SDK 0.4
- Конвертер от bardak'a xray_re-tools-10sep2008
Использование конвертера от bardak'a
Как мы уже знаем, Actor Editor из пакета SDK 0.4 не открывает динамические игровые модели формата *.ogf. Он воспринимает только формат редактора - *.object. Но такого формата в игре нет, потому мы и воспользуемся конвертером от bardak'a.
Открываем папку с конвертером. Оттуда нам нужен только converter. Работа с ним элементарна.
Если у вас есть распакованные архивы для ЧН или ЗП - то скопируйте оттуда любую модель НПС (лучше ту, которой нет в ТЧ, а то вся работа пойдет даром:)). Модели НПС находятся по адресу:
gamedata\meshes\actors\...
Для примера, я взял модель сталкера группировки "Чистое небо" в противогазе. Она находилась по адресу:
gamedata\meshes\actors\stalker_nebo\stalker_nebo_2.ogf
Копируем модель в папку с конвертером. Далее нам ничего настраивать не нужно. Создаем текстовый документ, открываем его обычнейшим блокнотом и пишем в нем такой код:
converter -ogf -object <имя_модели.ogf>
Почему именно так а не иначе, смотрим в папке docs в корне конвертера. В моем случае я писал:
converter -ogf -object stalker_nebo_2.ogf
pause
Теперь в блокноте жмем Файл>Сохранить как... В строке Тип файла ставим значение "Все файлы (*.*)", а в строке Имя файла пишем "ваше_имя_файла.bat". Кодировка не важна. В окне выбора директории выбираем корневой каталог нашего конвертера и жмем "Сохранить". Я выбрал название:
model.bat
Теперь мы видим, что появился новый файл ваше_имя_файла.bat. Нажимаем на него. При выполнении всего вышеописанного у вас должен создаться файл имя_модели.object. Это наш сконвертированный НПС. Работа с конвертером закончена.
Настройка модели в Actor Editor'e
Копируем полученный в конвертере файл имя_модели.object в папку:
$sdk_root\level_editor\rawdata\objects\editor, где $sdk_root - путь к вашему SDK.
Например у меня это:
E:\Program Files\X-Ray SDK\level_editor\rawdata\objects\editor
Открываем Actor Editor из пакета SDK. Далее жмем File>Load... в правом верхнем углу интерфейса. Выбираем $sdk_root\level_editor\rawdata\objects\editor\имя_модели.object
Загрузится модель вашего НПС, но будет она белым пятном. Сразу же выскочит окошко, именуемое Log.
В самом низу этого окошка вы увидите строку, выделенную бледно-розовым цветом. Это строка, содержащая ошибку.
В нашем случае это:
Can't find shader 'models\model_pn'
Это сообщение в логе означает, что в базе шейдеров SDK нет шейдера models\model_pn, примененного к этой модели.
Это можно исправить. Идем на вкладку Surfaces справа на интерфейсе. Surface переводится дословно как внешность/поверхность.
Ищем нашу злаполучную внешность, к которой применен шейдер models\model_pn. В моем случае это была единственная внешность act_stalker_nebo_2S[1]. В ней нужно изменить шейдер на другой, приближенный к оригиналу. Жмем на троеточие[2] напротив Shader и в открывшемся окошке выбираем шейдер models\model[3]. Жмем Ok[4].
Применили новый шейдер. Теперь в логе может появиться новая ошибка:
Can't find texture 'act\act_stalker_nebo_2'
Не трудно догадаться, что система не может найти текстуру act\act_stalker_nebo_2 в gamedat'e SDK.
Это тоже исправимо. Нужно скопировать текстуры для этой модели из текстур ЧН\ЗП, и вставть их в текстуры SDK. Если же ошибки с текстурами не возникло - наше белое пятно должно превратиться в НПС.
Работа с анимациями
Снятие анимаций с модели
Теперь нужно выбрать вкладку Motions справа на интерфейсе. Здесь нас интересует только Motion reference. Наведите курсор на значение этого поля, и вы увидите какие сборники анимаций проигрывает данная модель. В моем случае (как и в большинстве случаев) это:
actors\stalker_animation,actors\stalker_scripts_animation,actors\stalker_smart_cover_animation,actors\stalker_scenario_animation
Теперь нужно запомнить анимации, прописанные в Motion reference, можно записать в блокнотик, проблем с этим возникнуть не должно. Но их нужно, запомнить, т.к. сейчас мы будем сбрасывать значение этого поля.
Делается это так: Жмем на троеточие напротив Motion reference[1]. Снимаем галочки со всех сборников анимаций[2] и жмем Ok[3]. Если же в окошке, где нужно снимать галочки, вообще нет анимаций, а просто пустое окошко, ничего страшного в этом нет. Просто в ресурсах SDK нет этих анимаций, в таком случае сразу жмем Ok.
Конвертирование сборников анимаций
Теперь пришло время вспомнить, какие сборники анимации отыгрывает модель (помнится, мы записали это в блокнотик:)). Нужно найти эти сборники. Они лежат по адресу:
Корень вашего ЧН или ЗП\gamedata\meshes\actors\...
Копируем нужные нам сборники из этой папки в корневую папку со старым добрым конвертером от bardak'a. В корне конвертера создаем текстовый документ, открываем его блокнотом и в нем пишем следующий код:
converter -omf -skls <имя_сборника_анимаций>.omf
Вместо имени сборника анимаций подставляем нужный сборник, например:
converter -omf -skls stalker_animation.omf
Сохраняем этот текст как .bat файл (как это сделать оговаривалось ранее). Запускаем батник, и через секунд 5-10 получаем рядом новый файл имя_сборника_анимаций.skls.
Теперь поочередно вставляем в батник другие названия нужных нам сборников анимаций, сохраняем и запускаем. После этих операций у нас должны появиться нужные нам сборники анимаций, но уже в формате .skls. Если все так, как надо - конвертация завершена.
Применение сконвертированных анимаций к модели
Теперь копируем все полученные сборники анимаций в каталог
$sdk_root\level_editor\import
Можно и в любой другой, но мне кажется удобнее всего именно в этот. Далее открываем Actor Editor. Как мы видим, теперь во вкладке Motions появилось поле Edit с кнопками Append, Delete и Save. Жмем Append и выбираем все наши сборники анимаций по очереди.
В итоге у меня получилось 2543 анимации во вкладке Motions (по счетчику Motion count).
Работа с костями
Справа на интерфейсе жмем Bone Parts[1], что находится на вкладке Model. В появившемся окошке жмем снизу кнопочку Reset To Default[2]. После этого действия у нас в левой верхней таблице появится множество костей. Выберите оттуда кости (это делается с помощью зажатия клавиши Ctrl):
bip01_spine
bip01_spine1
bip01_spine2
bip01_neck
bip01_l_clavicle
bip01_l_upperarm
bip01_l_forearm
bip01_l_hand
bip01_l_finger0
bip01_l_finger01
bip01_l_finger02
bip01_l_finger1
bip01_l_finger11
bip01_l_finger12
bip01_l_finger2
bip01_l_finger21
bip01_l_finger22
bip01_r_clavicle
bip01_r_upperarm
bip01_r_forearm
bip01_r_hand
bip01_r_finger0
bip01_r_finger01
bip01_r_finger02
bip01_r_finger1
bip01_r_finger11
bip01_r_finger12
bip01_r_finger2
bip01_r_finger21
bip01_r_finger22
bip01_head
и перетащите их в правую верхную таблицу. Обзовите эту таблицу "Torso"[3]. Далее выберите кости:
eye_left
eye_right
eyelid_1
jaw_1
и перетащите их в правую нижнюю таблицу и обзовите ее "Head"[4]. Все. Жмем Ok[5].
Работа с костями закончена.
Редактирование User Data для модели
Жмем строку Object[1] справа на интерфейсе. Идем в самый низ и видим строку User Data. Жмем на троеточие[2] напротив и вставляем вместо того, что там сейчас, User Dat'у, взятую у другой модели[3]. Я например взял ее у военного спецназовца. Поэтому у меня получилось вот что:
#include "models\capture\kombez_helmet_damage_low.ltx"
Жмем Ok[4].
Позже мы разберемся с тем, на что эта конструкция влияет.
Экспорт модели в .ogf
Когда мы завершили работу с моделью, нужно сконвертировать ее в формат, понятный игре. Благо для этого в Actor Editor'e для этого есть встроенный инструментарий. Жмем File>Export>Export OGF.... Думаю скрины для этого не нужны, т.к. такую же операцию мы прпоизводили с экспортом сборника анимаций. Саму модель можно обзывать как угодно и сохранять куда угодно.
Применение модели в игре
Файл textures.ltx
Нам нужно скопировать 2 файла из gamedat'ы SDK в gamedat'у нашего ТЧ. Это файл нашего сборника анимаций (помните, что его месторасположение должно быть точно как в SDK) и собственно сама модель. Затем нужно в папке textures из геймдаты нашего ТЧ найти файлик textures.ltx и вставить в секцию [types] имена текстур, которые использует наша модель. В моем случае это act\act_stalker_nebo_2 и act\act_stalker_nebo_2_bump. Текстуре должно быть присвоено нулевое значение, а бампу = 2.
ВПРИНЦИПЕ, ЭТОТ ХОД НЕОБЯЗАТЕЛЕН. ОБЫЧНО МОЖНО И БЕЗ НЕГО.
Присвоение модели любому НПС
Теперь нужно дать какому-нибудь НПС из игры нашу модель. Пусть это будет волк! Открываем файл gamedata\config\gameplay\character_desc_escape.xml с помощью блокнота. Находим там практически в самом начале секцию Волка:
<!---------------------------------------esc_wolf----------------------------------------------------->
<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>
<class>esc_wolf</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<rank>434</rank>
<reputation>5</reputation>
<money min="600" max="2000" infinitive="0"/>
<snd_config>characters_voice\human_01\stalker\</snd_config>
<crouch_type>-1</crouch_type>
<visual>actors\neytral\stalker_neytral_balon_1</visual>
<supplies>
[spawn] \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
wpn_ak74u \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>
#include "gameplay\character_criticals_4.xml"
<start_dialog>escape_lager_volk_talk</start_dialog>
<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
и заменяем ее на:
<!---------------------------------------esc_wolf----------------------------------------------------->
<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>
<class>esc_wolf</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<rank>434</rank>
<reputation>5</reputation>
<money min="600" max="2000" infinitive="0"/>
<snd_config>characters_voice\human_01\stalker\</snd_config>
<crouch_type>-1</crouch_type>
<visual>путь, к вашей модели относительно папки meshes</visual>
<supplies>
[spawn] \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
wpn_ak74u \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>
#include "gameplay\character_criticals_4.xml"
<start_dialog>escape_lager_volk_talk</start_dialog>
<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
В моем случае я писал:
<!---------------------------------------esc_wolf----------------------------------------------------->
<specific_character id="esc_wolf" team_default = "1">
<name>esc_wolf_name</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>esc_wolf_bio</bio>
<class>esc_wolf</class>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<rank>434</rank>
<reputation>5</reputation>
<money min="600" max="2000" infinitive="0"/>
<snd_config>characters_voice\human_01\stalker\</snd_config>
<crouch_type>-1</crouch_type>
<visual>actors\nebo\stalker_nebo_2</visual>
<supplies>
[spawn] \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
wpn_ak74u \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>
#include "gameplay\character_criticals_4.xml"
<start_dialog>escape_lager_volk_talk</start_dialog>
<start_dialog>dm_hello_dialog</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>
Проба в игре
Все, теперь запускаем игру. Желательно начать новую игру, в противном случае Волк может остаться при своей старой модели. Вот скрин из игры:
Автор
Статья создана: Участник:Baklan
Основа взята у: eNdimiOn
P.S. При использовании сконвертированных НПС, полученных при исполнении данной статьи, игра может вылетать без лога! Сейчас я работаю над устранением ошибок в работе, есть парочка идей, как смогу - так и проверю.