Half Life : Alyx это игра, которая стоила ожидания двенадцати лет. Мы все ждали не совсем её, но какое-нибудь продолжение серии Half Life, в которой каждая игра задавала такой уровень качественных инноваций, который становился определяющим в жанре на многие годы вперёд. Half-Life : Alyx не исключение — безобразно очаровательная, как и предшествующие игры серии, она становится новым эталоном для жанра виар шутеров. Открывая для игроков возможность потрогать и рассмотреть омерзительные красоты этого мира, она создает игровой опыт, который не забудется еще долго.
Но без VR гарнитуры игру, очевидно, не запустить. Даже ради такого ожидаемого проекта приобретение дефицитной нынче VR аппаратуры оправдано не для всех. Авторы сознательно ограничили возможность запуска, чтобы только игроки с виар гарнитурой по достоинству оценили их разработку. Без этого эффекта игра сильно теряет свой шарм. Однако многим все равно хочется попробовать, хотя бы для оценки того, насколько эффект погружения в виртуальную реальность значителен.
Поэтому я подумал — почему бы не имитировать наличие виар гарнитуры программно? Valve OpenVR API описывает как соорудить драйвер, совместимый со SteamVR, так что должны уже быть похожие решения. И вот — я обнаружил проект с открытым кодом — ALVR, превращающий Samsung GearVR (недорогой коробок с линзами для смартфона) в беспроводную VR гарнитуру к ПК путем эмуляции подключения HTC Vive и стриминга данных о повороте с очков на ПК, а видеопотока — обратно. Отлично!
Прежде чем приступать к написанию собственного решения, я решил опробовать виртуальную реальность через ALVR на Samsung GearVR. Эта гарнитура обладает только 3 степенями свободы для поворота головы, и столь же ограниченным джойстиком, который можно лишь поворачивать, но не сдвигать в пространстве. Для сидячего виара в приложениях, рассчитанных на указатель, это работает очень неплохо. Но там, где нужно протягивать руку чтобы взаимодействовать с окружением или уклоняться, ты становишься «инвалидом», неспособным к движению… Однако, автор ALVR большой молодец, и добавил даже поддержку библиотеки позиционирования из Google ARCore в специальной версии клиентского приложения! Если установить эту версию, появляется полноценный inside-out трекинг положения головы за счёт оптической оценки смещения как в более дорогих очках Rift и Quest. Качество позиционирования, конечно, остается посредственным, и срабатывает только в хороших условиях видимости неподвижных контрастных объектов окружения, но этого вполне достаточно для нужд большинства игр — приседание и небольшое уклонение в сторону регистрируется как надо, хоть и добавляет нашему инвалиду эффект опьянения и периодического улетания в сторону. Забавный, почти жизненный компромисс.
В таком режиме удалось не без удовольствия прогуляться по начальной локации HL:A. Эффект глубины пространства вкупе с объемным звуком создали отличные ощущения, почти не уступающие полноценной VR гарнитуре. Слегка более выразительная москитная сетка перед глазами быстро перестала отвлекать, а сниженное до 60гц обновление экрана и вовсе не было проблемой, как и незначительная задержка (около 80мс). Однако отчаянно хотелось потрогать окружение и хотя бы дотянуться до кнопки, необходимой для продвижения в игре…
Здесь на помощь пришла другая опенсорс программа — FreePIE, к которой есть плагин ALVR. Благодаря ей можно быстро написать скрипт на Python который превратит управление с клавиатуры, мыши или с джойстика в данные положения и поворота виар контроллера для ALVR. Я быстро придумал решение и сделал телескопическую выдвижную руку, длина которой регулируется касанием трекпада на джойстике, и легко смог нажимать кнопки, хватать и разбрасывать рукой мусор, и даже открывать двери и рисовать каракули фломастером на стекле. Телепортация и повороты удобно легли на нажатия трекпада также как в настоящем Vive, и пройти первый эпизод игры не составило труда. Но лишь до момента, где в распоряжение игрока попадают гравитационные перчатки.
Здесь меня ждал неприятный сюрприз. Гравитационные перчатки — блестящее решение геймдизайнеров Valve, позволившее органично вписать удобную игровую механику притяжения предметов в мир игры. Однако никакие попытки повторить жест притяжения не приводили к нужному эффекту… Я пробовал выполнить его джойстиком. Я даже написал скрипт в котором закрепил руку на «носу» и кнопкой задавал фиксированное смещение и поворот руки вокруг различных осей, думая что причина в исполнении самого жеста. Но нет… Я также некоторое время провел в The Lab пытаясь метнуть палку для робо-пса вдаль, подобно тому как это можно было сделать на Vive, но объекты выпадали из инвалидной телескопической руки практически без сохранения скорости. Я предположил, что настоящий контроллер может передавать игре не только положение и поворот, но и другие данные — о скорости и ускорении. Так как хорошие датчики могут определять их с высокой точностью и частотой, это могло бы дать преимущество при отслеживании контроллера и экстраполяции положения. Моя гипотеза быстро нашла подтверждение, как только я изучил OpenVR API и обнаружил функцию GetPose, возвращающую структуру с данными о скорости и ускорении контроллера.
И тут я погрузился в пучину С++ кода, где и провёл всю неделю, терзая саргасовы путы логики программы и ища ответы в мутных водах документации, не соответствующей местами реальности. Удалось пересобрать программу ALVR с вычислением линейной скорости по измененному положению контроллера и передачей этих данных в структуру OpenVR. И, о чудо! Именно данные о линейной скорости и были необходимы. Жест заработал легко и интуитивно. Удалось даже схватывать объект на лету с первой попытки. Более того, это вернуло в игру возможность бросать объекты с сохранением импульса. Я добавил заодно вычисление угловой скорости используя навыки работы с кватернионами, и это открыло возможность бросать объекты с кручением.
Дальнейшую сложность для полноценного погружения представляла только перезарядка оружия, которая вызывает затруднения и при использовании настоящих контроллеров. Однако благодаря включению режима управления одной рукой в настройках игры можно перезаряжаться заводя руку за плечо и нажимая кнопку сжатия (которую в виду отсутствия дополнительных кнопок пришлось также изобретать, и сделать переключение кнопкой «назад» между функцией гашетки и сжатия). Дальнейшая фантазия подсказывает создание множества разных вариантов управления: через два джойстика, через две мыши, через заскриптованные действия, через leap motion, или любые другие имеющиеся под рукой средства.
Но можно ли вовсе отказаться от очков, если заставить драйвер отправлять фейковые показания игре? Для удобства тестирования управления хотя бы. Конечно! Тут меня ждало несколько подводных камней в коде ALVR которые больно ударили загадочными проблемами, похожими на race-condition при инициализации классов для виртуальных устройств, но методом пристального всматривания в код удалось изобрести необходимые изменения в порядке вызовов.
Теперь при запуске ALVR сразу инициализирует HMD и контроллер, и начинает получать данные через FreePIE, давая возможность управлять персонажем. А при подключении реального GearVR передача данных пополняется поступившими сетевыми пакетами.
Но играть в Alyx с клавиатуры и мыши без VR не очень интересно, что ожидаемо. Мешает и специфическое управление, и крайне узкий угол обзора в режиме наблюдателя, что вынуждает вращать камеру будто осматриваешь мир через трубу. Пока никакой консольной команды для изменения угла обзора не нашлось. Можно только поискать и изменить в памяти игры матрицу проекции камеры, но на этом этапе я удовлетворен экспериментом и оставлю столь изощренные поиски возможных припарок для улучшения качества жизни виар-инвалидов на будущее.
Подобную эмуляцию можно задействовать и в любых других виар приложениях, если это будет иметь смысл.
Но уже сейчас благодаря этому подходу можно попробовать вжиться в тело потрёпанного жизнью героя — лишенного руки и нескольких пальцев, контуженного или даже одноглазого, но все же способного на подвиги и приключения! 🙂
Запуск программы:
1) Установить игру, Steam и SteamVR
2) Загрузить ALVR 2.3.1-NoVR mod (скачать ALVR.7z распаковать в любую удобную папку)
3) Загрузить FreePIE и перенести в его папку Plugins файл ALVRFreePIE.dll из папки моего архива с ALVR — это позволит модифицировать управление через скрипты
4) Запустить FreePIE и открыть им скрипт управления из архива ALVR/freepie-samples/GearVR_HL-Alyx_MouseKeyboard.py Нажать Script/Run или (F5)
5) Запустить ALVR, перейти на вкладку about и нажать install driver — это зарегистрирует драйвер виртуального устройства в SteamVR
6) Нажать Start Server и дождаться автоматического запуска SteamVR. Если обнаружен HMD и контроллер, то все готово, можно запускать игры и пробовать управление.
*) Можно также подключить GearVR, для этого надо загрузить приложение ALVR Client, следуя инструкциям автора ALVR и подключиться к общей сети, а затем в ALVR нажать Connect напротив обнаруженного устройства. Для GearVR также есть скрипт управления в папке freepie-samples.
Управление для мыши и клавиатуры:
Мышь вращает обзор;
Левая кнопка — стрельба или хватание предметов;
Правая кнопка поднимает руку и уводит ее за плечо чтобы можно было достать или положить патроны;
Колесико мыши меняет длину руки чтобы схватить или бросить предмет;
Кнопка R это кнопка сжатия контроллера, отвечающая за перезарядку или выброс магазина;
Боковые кнопки мыши это нажатия на тачпад контроллера вверх и вниз. Вниз позволяет телепортироваться, вверх — выбирать оружие;
Средняя кнопка мыши это кнопка «меню» которая используется игрой для взведения затвора оружия после перезарядки;
Кнопка Q это вызов меню игры;
WSAD — трекпад левого контроллера.
Примечание:
Так как игра рендерит на каждый глаз квадратный кадр, рекомендую запускать ее в оконном режиме с параметрами -width 1024 -height 1024 чтобы угол обзора по вертикали не оказался обрезан из-за растягивания квадратного кадра на прямоугольный экран
Можно повысить Resolution Scale в настройках SteamVR для улучшения картинки
В скрипте управления реализованы еще не все необходимые для полноценной игры действия. Возможно вам будет затруднительно проходить пространственные паззлы с вращением точек на сфере. Также не известно, как будет работать перезарядка других видов оружия. Все эти действия можно будет заскриптовать через FreePIE, не бойтесь попробовать.