{"id":3824,"url":"\/distributions\/3824\/click?bit=1&hash=a0d33ab5520cacbcd921c07a49fc8ac5b78623b57936b992ce15c804b99210d4","title":"\u041a\u0430\u043a\u0443\u044e \u0440\u0435\u043a\u043b\u0430\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043d\u0430 DTF \u0438 \u043a\u0442\u043e \u0435\u0451 \u0443\u0432\u0438\u0434\u0438\u0442","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"75ec9ef4-cad0-549d-bbed-1482dc44e8ee","isPaidAndBannersEnabled":false}
Игры
Александр Милашев

S.T.A.L.K.E.R. на движке Doom 2. Начало

В связи с происходящими событиями верным фанатам серии S.T.A.L.K.E.R. не остается ничего, кроме как ждать у моря погоды и надеяться на нормализацию геополитической обстановки.

А ведь может случиться, что мы никогда не увидим Heart of Chornobyl. Учитывая времена, в которые возвращается наш Мир, предлагаю вооружиться инструментарием для модификации Doom 2 и создать свой собственный S.T.A.L.K.E.R., с маслинами и монолитовцами.

Сразу скажу, что я не буду подробно останавливаться на процессе создания уровней или работе со Slade3, так как это уже сделали за меня.

Нам потребуется:

В этой статье я расскажу о том, с какими трудностями столкнулся уже спустя десять минут после начала процесса, и объясню, как добавлять в Doom новые объекты.

X-Ray SDK

Eсли с моддингом Doom я давно знаком, то с моддингом S.T.A.L.K.E.R. сталкивался только в качестве потребителя контента. Первым делом я решил распаковать все необходимые данные из архивов S.T.A.L.K.E.R. Shadow of Chernobyl, то есть текстуры, модели и звуки.

Программу для распаковки архивов я нашел довольно быстро. Называется она Unpacker for Steam by E1nher1. Как видно из названия, работает эта программа только со Steam версией игры.

Все архивы лежат в корневой папке S.T.A.L.K.E.R. Shadow of Chernobyl с расширениями от db0 до dbd. В этих архивах хранятся текстуры, звуки, музыка, модели, скрипты, файлы конфигурации и данные уровней. Я распаковал их в одну папку. Это потребуется в будущем для работы с X-Ray SDK.

Нам нужны следующие разделы:

  • textures (все текстуры хранятся в формате dds. Для преобразования этих файлов в png я использовал программу XnView);
  • meshes (модели в формате ogf. О них чуть позже);
  • levels (для работы с уровнями нужно настроить X-Ray SDK);
  • sounds (звуки и музыка в формате ogg).

После этого начался длительный и мучительный поиск рабочей версии X-Ray SDK. Я облазил десятки форумов, руководств в Steam и просмотрел несколько YouTube-роликов, прежде чем мне помогли. В этом ролике парень подробно объясняет, как установить и настроить X-Ray SDK, а также, как преобразовать игровые уровни в понятный редактору формат. Дело в том, что официальная версия X-Ray SDK была выложена GSC аж в 2007 году. Соответственно, на современных системах она работать отказывается.

Для распаковки уровня потребуется утилита converter. В дополнение к сказанному в видео скажу, что в BAT-файле необходимо прописать наименование исходного уровня и его название при распаковке. А в файле converter.ini прописать абсолютные пути к папкам levels и gamedata. Подробная информация лежит здесь.

Уровень распакован и лежит в папке maps. Открываем его в редакторе уровней.

Управление в редакторе нестандартное. В обычном режиме перемещение камеры по X и Y осуществляется с помощью SHIFT + LMB, по Z — SHIFT+RMB, а поворот камеры — SHIFT+LMB+RMB. Для дальнейших действий это не очень полезная информация, но если хочется изучить карту и использовать ее в качестве референса — это хороший вариант.

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

Blender

Если с текстурами для геометрии уровня все просто: конвертируем dds из папки textures в png, предварительно просмотрев больше тысячи файлов и отделив нужные, то что же делать со спрайтами оружия и окружения?

GZDoom поддерживает три варианта:

  • Плоские спрайты в формате png;
  • Воксельные модели;
  • Полигональные модели.

Изначально я пошел по первому пути, для чего потребовался Blender. Я решил, что буду рендерить модели из S.T.A.L.K.E.R. покадрово с разных сторон.

Чтобы экспортировать модели из S.T.A.L.K.E.R. в Blender, можно воспользоваться плагином blender-xray. Процесс установки описан в readme.

В S.T.A.L.K.E.R. cуществует два вида моделей:

  • Модели, которые используют физический движок, в формате ogf. Они находятся в папке meshes. Это и персонажи, и коробки с патронами, и оружие, и разнообразные модели окружения (лампы, ящики, бочки), и даже вырезанный из игры транспорт;
  • Модели, из которых состоит уровень (aka лоды), в формате object. К ним относятся здания, сломанный транспорт, мосты, поезда и прочее. Эти модели лежат в папке rawdata/objects. Ради этих моделей мы и конвертировали уровень.

В первом случае все просто. Открываем Blender, импортируем объект из папки meshes в формате ogf, и вот он наш Камаз.

С моделями на уровне все немного сложнее. Сперва надо найти название нужного объекта в редакторе уровней S.T.A.L.K.E.R. Для этого подлетаем к нему, правой кнопкой мыши открываем параметры и смотрим на поле name. В данном случае этот автобус называется l01_escape_lod0060

Возвращаемся в Blender, импортируем объект в формате object из папки rawdata\levels\l01_escape и любуемся ржавым автобусом в нормальном редакторе.

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

Создание спрайтов автобуса

Все спрайтовые объекты в Doom могут быть плоскими (например, взрывающиеся бочки) или иметь 8 или 16 ракурсов (например, монстры). Этот автобус мы отрендерим с 16 позиций. Это можно сделать вручную, перемещая камеру по координатам, а можно поступить более хитро. Сразу скажу, что я мало что понимаю в 3D моделировании, поэтому могу ошибаться в своих решениях.

Выставляем камеру на нужную позицию, туда же добавляем источник света и направляем его на модель. После этого создаем Bezier Circle и делаем его родителем камеры и источника света с параметром Path Following (Ctrl + P). В настройках Bezier Circle нужно включить Path Animation и установить 16 фреймов анимации.

После этого в настройках рендера включаем прозрачность и нажимаем Render Animation (Ctrl + F12). Получится 16 изображений. Их надо обрезать, чтобы занимали чуть меньше места.

Сразу скажу, что такой способ лучше использовать для маленьких или симметричных моделей (лампы, бочки, патроны и т.д.), потому что вот такой автобус будет выглядеть очень нелепо при переносе в Doom. Для примера, конечно, сойдет. Как я и говорил, его лучше импортировать в Doom в виде обычной 3D модели, чем мы вскоре и займемся.

Перенос автобуса в Doom в виде спрайтов

Открываем Slade3 и создаем новый архив формата pk3. Дело в том, что такой архив позволит хранить файлы упорядоченно. Классический wad файл этого не позволяет. Подробно о хранении ресурсов в архиве pk3 можно прочитать здесь.

Прежде чем переносить файлы в архив, нужно их переименовать. Наименования спрайтов в Doom состоят из 6 символов в формате AAAA X N, где AAAA — название спрайта, X — название анимационного фрейма (от A до Z и /), N — номер спрайта при смене ракурса, при этом N меняется от 1 до 8 при восьми ракурсах и от 1 до G при 16 ракурсах (ноль — если объект плоский и не меняет спрайты при смене ракурса). Более подробная информация.

Получается следующее:

Переносим эти спрайты в архив и приступаем к созданию объекта. Первым делом нужно идентифицировать параметры спрайтов. Для этого выбираем все спрайты и правой кнопкой добавляем в файл (или ламп) textures. В корне архива будет создан новый файл с параметрами текстур.

После этого открываем редактор текстур и меняем тип каждого изображения на Sprite, а потом уменьшаем изображения в размерах. Придется поэкспериментировать, чтобы объект не выглядел огромным или слишком маленьким. Помимо этого нужно расположить каждый спрайт над уровнем «земли», то есть настроить offsets.

Код новых объектов находится в лампе decorate. По сути своей это набор классов, которые называются Actors. При этом можно наследовать новые классы от уже имеющихся в Doom. Decorate должен находиться в корне архива. Создаем Actor нового автобуса.

Actor StalkerBus 30000 { Radius 64 Height 64 +SOLID States { Spawn: BUS1 A -1 Stop } }

Каждый Actor имеет поля, флаги и состояния (states). Мы создаем самый простейший Actor, поэтому он содержит всего одно состояние — Spawn, в которое объект переходит при появлении на уровне. Число 30000 после названия определяет номер этого объекта в редакторе уровней.

Про поля и флаги говорить особо нечего. Radius определяет радиус объекта, а Height — высоту. Чтобы сквозь автобус нельзя было пройти, добавляем ему флаг Solid. После этого прописываем состояние Spawn. BUS1 — это название спрайтов, A — единственный кадр, а (-1) — это количество времени, которое показывает, сколько наш объект будет отображать кадр A. Так как это число равно (-1), то меняться кадр не будет. Stop означает, что после отрисовки единственного кадра, объект не будет возвращаться в начало состояния Spawn.

Если бы у нас был анимированный автобус (например, с моргающими фарами), то код выглядел бы так:

States { Spawn: BUS1 A 8 BUS1 B 8 Loop } }

Слово Loop означает, что объект зацикливает состояние Spawn, и в каждой итерации меняет последовательно два кадра с задержкой в 8 тиков. Один тик равен 1/35 секунды.

Создаем в Ultimate Doom Builder простенький уровень. Помещаем на этот уровень автобус.

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

Перенос автобуса в Doom в виде полигональной модели

Процесс переноса 3D моделей в GZDoom может показаться запутанным, но на самом деле все не так сложно.

Первым делом нужно экспортировать модель из Blender в формат obj, но при этом полученный файл нужно немного модифицировать.

Для этого открываем файл любым текстовым редактором, удаляем строчку, которая начинается c mtllib, а также удаляем все строчки, которые начинаются c usemtl. Это нужно для того, чтобы Doom при запуске уровня не пытался обратиться к несуществующим файлам материалов. Сразу оговорюсь, что это нужно делать не всегда. Если модель покрывают несколько материалов (читай, текстур), то в строках usemtl нужно прописать абсолютный путь к этим текстурам.

Находим нужную текстуру в папке с ресурсами из S.T.A.L.K.E.R.

В архиве создаем папку models, внутри нее папку busmdl и помещаем туда файл obj и текстуру в формате png. Дальше начинается самое интересное.

Сперва нужно занести данные о модели в ламп modeldef, который также всегда создается в корне архива.

Model StalkerBusModel { Path "models\busmdl" Model 0 "Bus.obj" Skin 0 "vehbus.png" Scale 32 32 32 USEACTORPITCH USEACTORROLL FrameIndex BUS2 A 0 0 }

Path — это путь до папки с моделью. Model — имя файла obj. При этом моделей может быть несколько. За номер модели отвечает индекс перед названием файла. Таким же образом прописываются текстуры — Skin определяет имя файла. Scale отвечает за размер модели. Так как в S.T.A.L.K.E.R. используется система измерения, основанная на реальной метрической системе, а в Doom — собственная система, то модель необходимо увеличить в 32 раза (в данном случае).

Useactorpitch и Useactorroll подстраивают наклон и поворот будущего объекта под поворот и наклон модели.

FrameIndex определяет наименование нашей модели, которое будет использоваться при создании объекта (читай, имя спрайта). BUS2 — наименование спрайта, A — имя кадра. Первый нуль отвечает за номер модели, а второй — за номер кадра.

После того, как мы идентифицировали модель, нужно создать игровой объект в файле decorate.

Actor StalkerBusModel 30001 { Radius 8 Height 64 States { Spawn: BUS2 A -1 Stop } }

Объект модели создается точно также, как и обычный спрайтовый объект. В глаза сразу бросается, что радиус автобуса составляет всего 8 пунктов. Это связано с тем, что объекты в Doom всегда имеют квадратную коллизию, а автобус довольно длинный. Поэтому будет проще поместить автобус на уровень и ограничить движение игрока отдельными линиями с присвоением им флага impassable. Из-за этого не нужно добавлять флаг solid, как мы делали в предыдущем случае.

В состоянии Spawn нужно прописать то название модели, которое мы вносили в файл modeldef, то есть BUS2.

Добавляем автобус на уровень и смотрим, что получается.

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

На сегодня можно заканчивать. В следующий раз, если будем живы, еще больше углубимся в процесс создания новых объектов для Doom на примере S.T.A.L.K.E.R. Я расскажу про различные состояния объектов, мы создадим новое оружие (склоняюсь к двустволке, потому что это намного интереснее, чем делать банальный ПМ) и патроны к нему.

Всем Мира!

0
36 комментариев
Написать комментарий...
Старый Телевизор

Неплохо, хороший хабар.

Ответить
Развернуть ветку
Althero

Сталкер 2 возможно не выйдет поэтому мы перенесем ТЧ НА ДВИЖОК ВТОРОГО ДУМА НАХУЙ.

Ответить
Развернуть ветку
Направленный лолипоп
В связи с происходящими событиями верным фанатам серии S.T.A.L.K.E.R. не остается ничего, кроме как ждать у моря погоды и надеяться на нормализацию геополитической обстановки.

Эм, торренты? 🤨

Ответить
Развернуть ветку
Александр Милашев
Автор

Мы не ищем лёгких путей:)

Ответить
Развернуть ветку
Обугленное целомудрие

фар край последний прошел уже?

Ответить
Развернуть ветку
Антон Ефремов

Нет, но Watch Dogs Legion и Assasins Creed Valhalla таки удалось пройти;)

Ответить
Развернуть ветку
Обугленное целомудрие

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

Ответить
Развернуть ветку
Антон Ефремов

Куплю левый акк в Стиме и чё ты мне сделаешь? Да и сталкер 2 не выйдет вообще

Ответить
Развернуть ветку
Обугленное целомудрие

разговор за торренты зашел, и ты вроде его поддержал.
еще в Казахстан можно съездить, там купить

Ответить
Развернуть ветку
Направленный лолипоп

Даже не планировал 🗿

Ответить
Развернуть ветку
lecsus

Сообщение удалено

Ответить
Развернуть ветку
Валерий Петров

Для торрента нужно что бы игра вышла, про это и цитата.

Ответить
Развернуть ветку
GoldSrcFreeman

О! Вот это очень годно! Аж прям самому захотелось что-то сделать на движке. Но вот вопрос, как движок рассчитывает освещение на таких моделях? Просто берет значение освещенности с пола как в Кваке, или там какой-то продвинутый алгоритм?

Ответить
Развернуть ветку
Александр Милашев
Автор

Движок очень прост в освоении, но если делать что-либо не на ванили, а на GZDoom с 3д полами, моделями и прочим, то придется привыкать к диким костылям:)

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Александр Милашев
Автор

Честно, пока не разбирался в этом, но что-то мне подсказывает, что именно первый вариант

Ответить
Развернуть ветку
Вячеслав Мурыгин

Zandronum LEST из 2017 передаёт привет :-)

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Foxtrot

Ещё пили!

Ответить
Развернуть ветку
Александр Милашев
Автор

Обязательно, там ещё много про что рассказать можно)

Ответить
Развернуть ветку
Павел Невашедело
Ответить
Развернуть ветку
Александр Милашев
Автор

Не видел. Выглядит круто)

Ответить
Развернуть ветку
Igr Ksrv

"Мало того, что игра не подтормаживает от постоянной смены спрайтов, так и выглядит модель более аутентично."

Чел, у тебя уровень 10x10 и 1 одна модель автобуса. Попробуй сделать полноценный (по меркам Doom) уровень и поставить туда несколько моделей автобусов/машин, мне кажется тогда Doom вообще не запустится. А вообще охуенно, продолжай.

Ответить
Развернуть ветку
Александр Милашев
Автор

Согласен. Но тут получается, что даже один спрайтовый объект в хайрезе подтормаживает игру при смене спрайтов (если на него смотреть). А модели отрисовываются с помощью opengl, поэтому намного стабильнее. Но я тестировал возможности, разместил на карте где-то 300+ моделей и все было ок. При том, что там были помимо этого и 3д полы и 3д слопы.
Но это опять же от компа зависит. Чувствую , получится так, что сталкер на движке дума будет требовать больше ресурсов, чем оригинальная игра:)

Ответить
Развернуть ветку
verbaler
S.T.A.L.K.E.R. на движке Doom 2

Давай тогда сразу S.T.A.L.K.E.R. 2 на движке Doom

Ответить
Развернуть ветку
st0ke

А почему физическая модель камаза такая детализированная для 2007 года? Но это даже пофиг, откуда на физической модели текстуры?

Ответить
Развернуть ветку
Albert Wesker

Статья здоровская, пили ещё, авось сотворим свой сталкер с кровососами и какодемонами)

Ответить
Развернуть ветку
Блайд

От души вообще!

Ответить
Развернуть ветку
John Galt

Теперь понятно о чем там Firelake пели про "Earth's doom day is close"

Ответить
Развернуть ветку
Dmitry Danilin

S.T.A.L.K.E.R. 2 на движке Doom?

Ответить
Развернуть ветку
GameDev

Да

Ответить
Развернуть ветку
Game User

Интересно, но повторять я конечно же не буду

Ответить
Развернуть ветку
GameDev

Я разработчик unity и unreal engine, сам сделаю ждалкер без украинцев

Ответить
Развернуть ветку
Tverrtuk Usopoles

Его и делать ненадо, уже моддники всё сделали, накатываем моды на предыдущий сталкер, новые задания с писаниной, оружием, нпц = сталкер 2 готов

Ответить
Развернуть ветку
GameDev

Свой можно продать и он качественный будет, а не 10 летней давности

Ответить
Развернуть ветку
Невероятный космос

Не знаю, мне спрайтовый автобус больше нравится.

Ответить
Развернуть ветку
Читать все 36 комментариев
null