Как я создал VR-мод для F.E.A.R. с помощью нейронки и почему я неожиданно проиграл

Добрый вечер, дэтээферы.
Сегодня я расскажу вам, как я решился создать VR-модификацию для игры 2005 года при помощи некронки, что из этого получилось и как я опоздал.
Знаю, что заочно собираю бинго из «Кому это надо в 2026?», «Кому-то ещё интересен VR?», «Не ты сделал, а нейронка!», но... Чё вы мне сделаете? Я в другом городе.
Так что налейте себе чаёчку (или того, что вам больше по душе в субботу вечером), включите музыку и готовьтесь почитать историю одиссеи, что началась месяц назад и потихоньку подходит к своему логическому завершению. Впереди стена текста и пачка видео, а пока фоном могу предложить включить немножечко хардкора от Antreib на радость соседям.
В общем, всё началось достаточно невинно. В январе у меня появился Quest 3, с помощью которого я начал регулярно играть во всякое-разное, отдавая предпочтение PCVR. Достойных игр много, но всё же я со временем заметил, что крупных релизов становится меньше, а инди-сегмент всё же уступает крупным релизам. Впрочем, в случае с PCVR в дело вступают VR-модификации для обычных, «плоских» игр.
И вот прошёл я потрясающие VR-моды для Half-life 2 и эпизодов и подумал: «Не вижу, почему бы не попробовать поиграть в F.E.A.R. в VR». Смотрю, а на него мода и нет. Но есть SDK, который разрабы из Monolith (RIP) выкладывали. И есть некронки вкупе со свободным временем и желанием умеренного челленджа.
И тут всё заверте~
Прежде всего, очевидно, я скачал игру в стиме и освежил свои воспоминания. Заодно и составил перечень нюансов и моментов, которые надо будет учесть. В другой колонке организовал перечень хотелок, стараясь отбрасывать самые утопические варианты.
Потом раскурил немного матчасти и составил для некронки сперва skill.md , затем и своего рода стартовое ТЗ.
Первой задачей было подружить игру 2005 года с современным-модным-молодежным OpenXR. Это, если кому интересно, рантайм, с помощью которого шлем и ПК взаимодействуют. SteamVR более старый и более прожорливый до ресурсов, OpenXR более свежий.
F.E.A.R. работает через DirectX 9, мой Quest 3 подключается через Virtual Desktop, а всю эту хурму надо как-то связать.
Пачкой итераций с постоянными корректировками прошёл от теста «Передаётся ли с тестового скрипта на ПК картинка на шлем», затем добился от некронки, чтобы работало отслеживание головы. Потом отделили совместными трудами прицеливание мышью от движения камеры.
Ещё одной пачкой итераций удалось добиться и передачи картинки. Сперва это была трансляция плоского flat-изображения, затем запихнули и передачу объемной картинки. Тут догадался поручить некронке внедрить логирование и функцию снятия скриншотов по кнопке, притом скриншотов именно того, что передаётся с ПК мне в шлем, т.к. были казусы.
Из того, что сходу могу вспомнить забавного на этом этапе: перепутанные глаза, растянутые предметы, гигантские баллоны, изображение в квадрате слева сверху, мой короткий выход наружу всех измерений, когда один глаз показывал игру так, как она обычно выглядит, а второй — локацию целиком откуда-то издалека.
Постепенно подобрались правильные пропорции, адекватное поле зрения, так что мир игры стал чуть менее упоротым.
Итак, камеру и полноценную объемную картинку сделали, круто. Управление, правда, только с клавомыши, что херня и неинтересно. Ну ладно, это дело наживное, я уже почуял, что дело может и выгореть, так что и список хотелок стал расти, как на дрожжах.
И всё же было то, что портило мне кайф: опыты показали, что спустя где-то равные промежутки времени начинает вдвое резаться FPS, т.е. вместо 120 кадров я получаю около 60. Вроде и не критично, но явно же чувствуется и вообще не прикольно.
Стал душнить нейронку дальше. Перебрал опытами разные разрешения, MSAA и прочее. Проблема, неожиданно, оказалась в DirectInput, который регулярно домогался до всех подключенных к компьютеру HID-устройств, даже до микрофона. С каждой минутой игры это увеличивало задержку, в итоге приводя к дропу FPS.
Нейронка шустро смастерила фикс для этого странного прикола и я продолжил возню над прочими моментами. Постфактум, кстати, я узнал, что эта проблема присутствует и во flat-версии игры, давно известна и свойственна играм от монолитов тех времён, а для F.E.A.R. и Condemned есть фан-фиксы.
Рендер-то с помощью некронки переключили на VR, но оказалось, что ряд эффектов игры использует уже отрисованное изображение сцены.
Огонь из пробитых труб превращался в прозрачную плоскость, похожую на прозрачный экран для проекта с куском сцены в нём. Пули в слоу-мо летели внутри прямоугольных туннелей. Взрывная волна от гранаты тоже выглядела так, словно игра на мгновенье решила показать экран внутри другого экрана.
В итоге порешалось и это.
Идти нормальным путём и сразу бежать пилить стрельбу мне не хотелось. Неудобно, черт возьми, когда ты не видишь количество патронов, аптечек, да и субтитры отсутствуют. Тем более, что по умолчанию в F.E.A.R. максимально всратые субтитры и интерфейс, абсолютно не читаемые на современных экранах. Да и как я буду стрелять, если у меня даже целиться нечем?
Добавили собственные субтитры, счётчик патронов, красную точку прицеливания, тонкий лазерный лучик и основные показатели: здоровье, броню, заряд слоу-мо aka рефлекс, аптечки и гранаты.
С субтитрами получилась какая-то нереальная задница: они то двоились, то сливались в кучу, то обрезались. Пришлось просить передвигать выше-ниже-дальше-ближе, менять размер шрифта, смещение слоев относительно глаз. Но в итоге удалось сделать читабельными.
ЛЦУ тоже обеспечил геморроем: то он указывал не туда, куда стрелял ствол, то упирался в невидимые хитбоксы, то ещё что-нибудь. В конечном итоге, этот вятский цирк стал нормально работать: пули полетели туда, куда указывал ствол оружия, из которого, в свою очередь, шёл тонкий лучик, заканчивающийся точкой на конце.
Окей, теперь есть интерфейс, но как этим всем управлять?
Сначала контроллеры просто заменяли клавиатуру и мышь. Оно как бы работало, но скучновато, потанцевал не раскрыт и вот это всё.
Левый стик отвечает за движение, правый — за поворот, прыжок и приседание. Триггеры для взаимодействия и стрельбы, отдельные кнопки — для перезарядки, гранат, фонарика и замедления времени. Где-то в это же время добрался до отображения меню (да, я до этого момента продолжал сидеть перед мониторами, т.к. меню отображалось только там).
Штош, теперь можно и начать уже целиться в шутере, не так ли? Вот и я так подумал.
После этого правый контроллер начал непосредственно управлять оружием. Не с первой итерации, с кучей правок, которые приходилось требовать внести, но оно заработало.
Полную модельку персонажа пришлось скрыть, она всрато смотрелась и руинила всё погружение. Но просто ствол, висящий в воздухе, тоже как-то не комильфо. Остановился на том же, на чем разрабы HL2 VR, да и сами Valve в Alyx — просто перчатки в воздухе, держащие ствол. Или не держащие. Но об этом далее.
После ряда итераций с некронкой добиться удалось следующего: правая рука удерживает оружие, а левую можно поднести к нему и зажать Grip для двуручного хвата: отдача становится меньше (для одноручного хвата я её изначально увеличил), а вибрация при выстреле передаётся в оба контроллера вместо одного.
Также щущуть пришлось возиться с тем, чтобы оружие не стреляло сквозь физические преграды и чтоб пули не застревали в воздухе. Ну и чтоб само оружие не проваливалось сквозь стены. Да, прикольно иногда, конечно, сунуть руку сквозь стену соседнего офиса и вышибить мозги очередном клону Феттела, но как-то это неправильно. В конечном счёте довел до ума и это.
Удар ногой в прыжке пришлось убрать. Увы, нормально для VR это не отследить, да и удары рукопашные пришлось переделать. Теперь анимации для этого нет, но можно просто втащить противнику (или стеклу) махом контроллера с зажатым оружием в нём. В том числе и в прыжке.
Одна вещь бесила меня в F.E.A.R. всегда — нереально дохлые китайские батарейки у фонарика. К последующей Condemned, очевидно, разрабы сами поняли, что спороли горячку в «Фире», и сделали фонарик бесконечным. Ну а я что? Я взял и сделал бесконечным фонарик в своем моде, после того, как приклеил его к левой руке персонажа.
Переключаться на кнопки скучно, когда есть возможность переключаться иначе, не так ли? Тем более, когда аксакалы VR уже показали более интересные варианты (которые я и подсмотрел, конечно же).
Первое оружие теперь можно достать с правого бедра, второе оружие — из-за левого плеча, третье — из-за правого. Нужно протянуть руку к нужной зоне, зажать Grip и «вытянуть» оружие. Если отпустить Grip, модель не исчезает мгновенно, а уезжает обратно в слот, как варежки на резинках в моём детстве.
Аптечке не осталось физической кнопки, так что её использование назначили на жест «Поднести руку к лицу и нажать Grip».
Граната или мина берётся с груди. Да, Пойнтмен настолько суров, что у него в разгрузке не только гранаты, но и мины со взрывпакетами. Переключение между типами взрывчатки сделал на кнопку левого контроллера.
Можно зажать гранату в левой или правой свободной руке, сделать бросковое движение и отпустить Grip, чтобы бросить снаряд. Направление и сила зависят от движения контроллера. Если просто разжать руку без движения, граната падает рядом, а Пойнтмен отправляется в Вальгаллу. Тут пришлось долго возиться с бросками, ускорением снаряда и прочим матаном, но под моим чутким руководством нейронка таки сделала это в том виде, в каком я бы хотел это видеть.
Отдельно пришлось убирать штатную задержку броска, потому что в ваниле игра ждёт, пока воспроизведется анимация броска после нажатия кнопки. Во flat-режиме это нормально, в VR довольно странным экспириенсом ощущается ситуация, когда ты размахнулся, бросил гранату, она повисает в воздухе примерно на 1.5 секунды, затем отправляется в путь.
И вот сижу я такой на третью неделю (а началось это к середине июля), ковыряю всё это, нереально кайфую от того, что в мой мод уже не только можно играть, а даже и приятно играть (мне самому, конечно же). И тут я вижу на DTF пост, мол, вышел VR-мод для F.E.A.R. от DR-89.
Надо ли говорить, какое нереальное чувство обиды, досады и вообще фрустрации меня накрыло? Ну типа это в духе историй, когда чувак ночью в тумане на безлюдной дороге решает высунуть голову из машины, чтобы было видно куда ехать хоть как-то, а навстречу ВНЕЗАПНО ему попадается такой же гениус?
Тут, честно сказать, я хотел бросить всё и сразу переходить к варианту, который созрел у меня в голове после успешной реализации управления оружием (о нём ниже). А потом задница перестала пылать и я осознал, что, в принципе, изначально и делал это для челленджа себе и нейронке. Тем более, у меня есть фичи, которые я уже реализовал / допиливаю, которые тот чувак пока не сделал (и не факт, что будет делать, у него ж вполне может быть своё видение, отличающееся от моего).
В сущности, багов, к моему личному удивлению, осталось не так и густо. В игре разнобой с катсценами, с ними проблема возникла и у меня. Те, где используется камера от лица персонажа, отображаются более-менее исправно. Те же, где используется кинематографическая камера, ведут себя пока по-разному.
Больше всего мозг мне пока сломала стартовая катсцена, где Альма в огне, психушка, Пакстон-едрить-его-в-сраку-Феттел, клоны. В какой-то момент я вообще увидел эту сцену вот так:
Да, это набор павильонов, где куча моделек Феттела и прочих делают свои заскриптованные дела, а камера прыгает по павильонам. А на заднем плане жыпег с раскрытым глазом. А еще дальше огонь. Магия кино, все дела.
Но худо-бедно это всё чинится, хоть и требует времени и сил, затрачиваемых на тестирование, последующие описание проблемы и выдвижение идеи нейронке, как ей попробовать решить это.
И хотя для оружия коллизия реализована, для головы-камеры её нет, так что я всё ещё могу в мире игры сунуть голову сквозь стену, если постараюсь. Но, в общем-то, я даже удивлен, что дошёл до того, до чего дошёл. Учитывая, что делал я это во время, свободное от работы, бытовухи, семьи и других хобби, прогресс мне кажется неплохим.
А дальше я допинаю это до состояния, когда оно будет нравиться мне и возьмусь за что-то ещё. Пока что хотел бы добавить возможность стрельбы с двух рук и, вероятно, сделать «мануальную» перезарядку. Потом, вероятно, закину на гитхаб для желающих поглядеть.
После этого... ну, у меня есть мысль ковырять Condemned. Там тот же движок, соответственно, многие наработки можно попытаться передрать со своего же поделия. Правда, там надо неплохо так поразмыслить над реализацией рукопашного боя, чтобы не получить «боевую мельницу», но кое-какие идеи уже были.
А вы пробовали запилить VR-моды для любимых игр? Получилось?