Сповіщення
Очистити все
02.11.2023 23:50
Інструментарій
У цій статті нам знадобиться таке програмне забезпечення:
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 .
У самому низу цього віконця ви побачите рядок, виділений блідо-рожевим кольором. Це рядок, який містить помилку.
У нашому випадку це:
Cant find shader 'models\model_pn'
Модель без налаштувань в Actor Editor'e
Це повідомлення в лозі означає, що в базі шейдерів SDK немає шейдера models\model_pn , застосованого до цієї моделі.
Це можна виправити. Ідемо на вкладку Surfaces праворуч на інтерфейсі. Surface перекладається буквально як зовнішність/поверхня .
Шукаємо нашу злощасну зовнішність, до якої застосовано шейдер models\model_pn . У моєму випадку це була єдина зовнішність act_stalker_nebo_2S [1] . У ній потрібно змінити шейдер на інший, наближений до оригіналу. Тиснемо на троє крапку [2] навпроти Shader і в віконці, що відкрилося, вибираємо шейдер models \ model [3] . Тиснемо Ok [4] .
Вибір шейдера
Застосували новий шейдер. Тепер у лозі може з'явитися нова помилка:
Cant 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] .
Робота з кістками
Експорт анімацій в .omf збірник
Тепер потрібно експортувати наші анімації до нашої власної збірки. Це робиться шляхом натискання File>Export [1] >Export OMF... [2] у верхньому правому куті інтерфейсу.
Увага! Вибирати директорію потрібно ретельно, не куди попало, а саме в папку gamedata \ meshes вашого SDK , тому що після експорту отримана збірка повинна знаходиться в тому самому місці в грі, де він був і в SDK . Наприклад, якщо у SDK він лежав за адресою:
$sdk_root\level_editor\gamedata\meshes\actors\nebo_animations.omf
то у грі він повинен лежати за адресою
Корінь ТЧ\gamedata\meshes\actors\nebo_animations.omf
А якщо ні, то модель не зможе знайти анімації і ми отримаємо миттєвий виліт. Якщо визначилися з місцем проживання збірки - тиснути Зберегти .
Експорт .omf збірки
Коли експорт завершено, відзначаємо всі анімації у вкладці Motions і тиснемо Delete . Усі анімації видалили. Тепер потрібно натиснути на три крапки навпроти Motion reference і в віконці встановити галочку навпроти збірки анімацій, яку ми щойно створили. Тепер тиснемо Ok . Роботу з кістками закінчено.
Редагування User Data для моделі
Тиснемо рядок Object [1] праворуч на інтерфейсі. Ідемо в самий низ і бачимо рядок User Data . Тиснемо на троє крапку [2] навпроти і вставляємо замість того, що там зараз, User Dat' у, взяту в іншої моделі [3] . Я, наприклад, взяв її у військового спецназівця. Тому в мене вийшло ось що:
#include "models\capture\kombez_helmet_damage_low.ltx"
Тиснемо Ok [4] .
Зміна User Data
Пізніше ми розберемося з тим, що ця конструкція впливає.
Експорт моделі в .ogf
Коли ми завершили роботу з моделлю, потрібно конвертувати її у формат, зрозумілий грі. Благо для цього Actor Editor' e для цього є вбудований інструментарій. Тиснемо File>Export>Export OGF... . Думаю скрини при цьому не потрібні, т.к. таку ж операцію ми проводили з експортом збірки анімацій. Саму модель можна обзивати як завгодно і зберігати будь-куди.
Застосування моделі у грі
Файл textures.ltx
Цей хід потрібно виконувати тільки в тому випадку, якщо ви прихильник якісної гри та граєте тільки на типі рендеру " Динамічне освітлення ". Якщо ж це не так – ви просто не помітите жодної різниці. Тож почнемо. Ідемо до директорії gamedata\textures гри і відкриваємо будь-яким зручним редактором файл textures.ltx . Далі нам потрібно вписати текстури, які використовуються моделлю нашого сконвертованого НПС. Ці текстури потрібно прописати в секціях [specification] і [types] , бажано в кінець секції, щоб потім було простіше їх шукати та редагувати. Додамо наші текстури до секції [specification] :
...
wpn\wpn_winchester1300 = bump_mode[use:wpn\wpn_winchester1300_bump], material[2.85]
wpn\wpn_zink =
bump_mode[none], material[2.85]
wpn\wpn_zink_542 = bump _57 = bump_mode[none], material[2.85]
wpn\wpn_zink_9 = bump_mode[none], material[2.85]
wpn\wpn_zink_svd = bump_mode[none], material[2.85]
; Наші тектури
act\act_stalker_nebo_2 = bump_mode[use:act\act_stalker_nebo_2_bump], material[0.50]
[types]
$bump-test = 2
$details = 0
...
Поясню, що ми вставили: act\act_stalker_nebo_2 - Ім'я текстури, що використовується НПС bump_mode[use:act\act_stalker_nebo_2_bump] - Це означає, що текстура використовує бамп текстуру "act_stalker_nebo_2_bump" material[0.50] - Швидше за все
Додамо наші текстури в розділ [types] :
...
wpn \ wpn_zink_svd = bump_mode [none], material [2.85]
; Наші тектури
act\act_stalker_nebo_2 = bump_mode[use:act\act_stalker_nebo_2_bump], material[0.50]
[types]
act\act_stalker_nebo_2 = 0
act\act_stalker_nebo_2_bump = 2
$bump-test = 2 $
details = 0 ...
Поясню, що ми вставили: act\act_stalker_nebo_2 = 0 - " 0 " - номер звичайної текстури act\act_stalker_nebo_2_bump = 2 - " 2 " - номер бамп-текстури Якщо не зрозуміло, ці рядки можна вставити з файлу textures.ltx від ЧН або ЗП .
Присвоєння моделі будь-якому НПС
Тепер потрібно дати якомусь НПС із гри нашу модель. Хай це буде вовк! Відкриваємо файл 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_ak73u
\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_ kit_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_ 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 >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.
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_ kit_dialog</actor_dialog >
<actor_dialog>tm_wolf_dialog</actor_dialog>
<actor_dialog>tm_wolf_reward</actor_dialog>
</specific_character>