В данной статье нам понадобится следующее программное обеспечение: Использование конвертера от 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' Модель без настроек в Actor Editor'e Это сообщение в логе означает, что в базе шейдеров 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]. Экспорт анимаций в .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 В противном случае модель не сможет найти анимации и мы получим мгновенный вылет.Если определились с местом проживания сборника - жмем Сохранить. Когда экспорт завершен, отмечаем все анимации во вкладке 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]. Позже мы разберемся с тем, на что эта конструкция влияет. Экспорт модели в .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_545 = bump_mode[none], material[2.85] wpn\wpn_zink_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 $shadertest = 0 $target = 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_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. При использовании сконвертированных НПС, полученных при исполнении данной статьи, игра может вылетать без лога! Сейчас я работаю над устранением ошибок в работе, есть парочка идей, как смогу - так и проверю.
|