[Перевод] Почему броски в VR такие отстойные, и что с этим делать?
Броски — одно из первых действий, которые игроки пробуют в виртуальной реальности. Берём виртуальную кружку с кофе и выбрасываем её. Кружка, пончик или мяч начинает дико вращаться. Не успеешь оглянуться, как игрок уже швыряет цветочными горшками в обучающего бота.
Некоторые броски бывают слишком сильными. Другие — чрезвычайно слабыми. Один-два раза всё-таки удаётся попасть в преследуемого NPC. Наверно, самый первый урок в VR — кидать точно довольно сложно. Когда я испытал это чувство, то сначала подумал, что плохо играю в VR. Мы считаем естественным, что освоение схемы управления — часть кривой обучения игры. Но когда броски одинаковыми движениями приводят к совершенно разным результатам, то это очень расстраивает.
Резкий бросок с замахом заканчивается коротким полётом предмета…
Пытаюсь бросить бутылку воды с замахом руки
…а лёгкий взмах запястьем может отправить предмет в долгий полёт.
Я просто слегка двинул запястьем…
Rescuties: игра с подбрасыванием детей
Этим летом я работал над казуальной экшн-игрой под названием Rescuties. Это VR-игра о бросании и ловле детей и других милых животных.
Если в виртуальной реальности мир реагирует на наши действия контринтуитивно, это мешает погружённости игроков в процесс или напрягает их. Весь геймплей связан с бросанием, поэтому Rescuties не могли положиться на столь неудобную по своей сути механику.
Раздражение — неотъемлемая часть дизайна таких игр. Если вкратце, то бросать в VR сложно, потому что невозможно ощутить вес виртуального объекта. Подходы могут быть разными, но в большинстве игр стремятся сделать физику виртуального объекта как можно более правдоподобной. Игрок хватает объект, придаёт ему виртуальный импульс, и тот улетает.
Но вот проблема: существует различие между тем, что игрок ощущает в своей руке и тем, что происходит в виртуальном мире. При поднятии виртуального объекта центр тяжести объекта и ощущаемый в руке центр тяжести не совпадают. Мышцы получают неверные данные.
Если бы игрок при броске просто толкал руками в каком-то направлении, это несовпадение было бы не очень важно. Но при броске он сгибает руку и поворачивает запястье. (В чём секрет хорошего броска? «Всё дело в запястье!») При повороте своей реальной руки игрок прикладывает к виртуальному объекту излишний момент, как будто он кидает его маленькой ложечкой.
Это очень бескомпромиссное явление. Во многих VR-играх пользователь может «поднять» объект, находящийся в полуметре от его руки. При нажатии кнопки объект прилетает в руку, но остаётся на постоянном расстоянии, превращая руку в катапульту. Разница между семью и тридцатью сантиметрами может означать, что движение запястьем заставит объект летать по всей комнате или просто слегка толкнёт его вперёд.
Движение запястья как катапульты
В Rescuties игрок ловит летящих быстро детей и стремится как можно скорее перебросить их в безопасное место. Использование традиционного подхода приводило к слишком капризному управлению и раздражающему игровому процессу. «Почему я просто не могу бросить ребёнка так, как ощущаю правильным?»
Физический и виртуальный вес
Ключ к успешной механике бросания — учитывать то, как управление ощущается пользователем, а не то, что предлагает физика игры.
Вместо измерения скорости броска виртуального объекта, который держит игрок. нужно выполнять измерения для объекта, который держит игрок — реального объекта, т.е. контроллера HTC Vive или Oculus Touch. Именно его вес и момент он ощущает в руке. И на эти вес и момент откликается его мышечная память (физический навык и инстинкт, развившийся за время жизни).
Центр тяжести, ощущаемый игроком, не изменяется, какой бы виртуальный объект он ни поднял
Связать физический и виртуальный вес для определения внутриигровой скорости можно с помощью центра тяжести физического контроллера. Во-первых, нужно определить, где находится этот реальный центр тяжести в игре. Контроллеры сообщают о своём местоположении в игровом пространстве. Игрок сам может взглянуть из-под наголовного дисплея, чтобы откалибровать положение центра тяжести. При отслеживании этой точки относительно контроллера вычисляется скорость при изменении его положения.
После внесения таких изменений тестеры стали играть в Rescuties намного лучше, но я всё равно видел и ощущал сильное несоответствие.
(В этой статье есть интересные соображения о передаче информации о виртуальном весе игрокам. Этот подход противоположен, вместо максимального использования физических ощущений веса контроллера он даёт пользователю виртуальные сигналы о поведении виртуальных объектов.)
Выбор времени
В какой именно момент игрок намерен бросить объект?
В реальной жизни при броске мы расслабляем пальцы, объект вырывается из захвата, а кончики пальцев продолжают толкать его в нужном направлении, пока мы совсем не потеряем над ним контроль. Мы можем крутить или катить объект до самой последней доли секунды.
Вместо такой тактильной обратной связи в большинстве VR-игр используется триггер под указательным пальцем. Это лучше, чем кнопка: в Rescuties нажатие триггера на 20% сжимает виртуальную перчатку примерно на 20%, а 100-процентное нажатие сжимает кулак полностью. Но игрок не ощутит объект, вырывающийся из захвата и скользящий по пальцам. Описанное выше разжатие пальцев реализуется простым отпусканием триггера (возможно, постепенным). Я выяснил, что нужно определять сигнал броска от игрока сразу же, когда он начинает расслаблять пальцы. Броски распознаются, когда давление на триггер ослабляется, не только до 0% или до небольшого значения, а до экспериментально найденного.
На графике показано изменение давления на триггер в цикле «захват-удерживание-бросок». В этом случае пользователь не нажимает на триггер на 100%. Такое часто бывает, потому что у контроллеров HTC триггер можно легко нажать примерно до 80%, а потом нужно приложить гораздо большее усилие, чтобы нажать до 100%. Сначала игрок нажимает триггер для поднятия объекта. Затем давление более-менее постоянно. потому что игрок захватил объект и замахивается для броска. Здесь виден небольшой шум датчика триггера. Игрок отпускает триггер при броске или выбрасывании объекта.
Шум сигнала и пульс игрока может привести к колебаниям усилия нажатия на триггер. Поэтому необходим порог распознавания действий игрока. В частности, это значит, что игра регистрирует выбрасывание, когда давление на триггер (например) на 20% меньше, чем пиковое давление, зафиксированное при поднятии объекта игроком. Порог должен быть достаточно большим, чтобы игрок случайно не выронил ребёнка. Нужное значение мы с тестерами нашли методом проб и ошибок. Кроме того, если распознать действие как захват при слишком малом давлении, не останется достаточного интервала для надёжного определения броска или отпускания. У вас получится то же, что и у меня в одной из неудачных итераций: странный сверхбыстрый цикл «поднятие-бросок-поднятие-бросок».
Шум скорости
Измерение правильной скорости и улучшение выбора времени достаточно хорошо снижают эффект несоответствия бросков. Но сами исходные данные — измерения скорости, поступающие с датчиков оборудования — довольно шумные. Шум особенно заметен, когда наголовный дисплей или контроллеры двигаются быстро. (Скажем, когда игрок что-нибудь бросает!)
Работа с шумом требует сглаживания.
Я попробовал сгладить скорость скользящим средним (также известным как фильтр нижних частот), но в результате хоть как-то усреднялись только самый медленный (замах) и самый быстрый (отпускание) этапы броска. Моим тестерам показалось, что бросать очень сложно, как будто они находятся под водой. (Именно это я обычно ощущал в игре Rec Room.)
Усреднение скорости контроллера даёт надёжные, но слишком медленные результаты, совершенно отличающиеся от ощущений в Job Simulator
Я попробовал брать пиковые значения последних измеренных скоростей, и по крайней мере дети у тестеров начали летать с той скоростью, с которой они хотели, но не всегда в нужном направлении, потому что последнее измеренное направление тоже подвергалось воздействию шума.
Мне нужно было взять несколько последних кадров измерений, и пронаблюдать, как они развиваются, т.е. нарисовать линию тренда. Простая линейная регрессия измерений дала нам значительно более надёжный результат. Наконец мне удалось бросать детей когда и куда я хочу!
Отладочная визуализация скорости показывает красным последние четыре кадра измеряемой скорости, а жёлтым — результат регрессии, используемый в игре
Как я усовершенствовал броски в Rescuties (tl; dr)
- Измеряем скорость броска от центра тяжести, который ощущается пользователем, т.е от центра тяжести контроллера.
- Распознаём бросок точно в момент, когда игрок собирается бросить, т.е. при частичном отпускании триггера.
- Преобразуем большую часть измеренных данных скорости регрессией, чтобы лучше оценивать намерения игрока.
Если вам интересно потестировать эти разные подходы и сравнить их, в Rescuties есть меню «Labs!», где можно переключать разные режимы бросков, выбирать способ измерения скорости и управлять количеством кадров измерений, используемых для регрессии/сглаживания.
Но эта проблема ни в коем случае не решена. В VR-играх используется множество разных подходов к броскам, и они нравятся игрокам. При создании бросков в Rescuties я хотел сделать так, чтобы физические ожидания мышечной памяти как можно сильнее соответствовали ощущениям в виртуальной реальности летающих детишек. Сейчас они уже гораздо лучше, но я хочу ещё улучшить их.
Поэтому приветствуются любые предложения по моему подходу и любая критика: можете в любой момент связаться со мной в Твиттере или по почте.