Броски — одно из первых действий, которые игроки пробуют в виртуальной реальности. Берём виртуальную кружку с кофе и выбрасываем её. Кружка, пончик или мяч начинает дико вращаться. Не успеешь оглянуться, как игрок уже швыряет цветочными горшками в обучающего бота.
Некоторые броски бывают слишком сильными. Другие — чрезвычайно слабыми. Один-два раза всё-таки удаётся попасть в преследуемого 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.)
Я попробовал брать пиковые значения последних измеренных скоростей, и по крайней мере дети у тестеров начали летать с той скоростью, с которой они хотели, но не всегда в нужном направлении, потому что последнее измеренное направление тоже подвергалось воздействию шума.
Мне нужно было взять несколько последних кадров измерений, и пронаблюдать, как они развиваются, т.е. нарисовать линию тренда. Простая линейная регрессия измерений дала нам значительно более надёжный результат. Наконец мне удалось бросать детей когда и куда я хочу!
Как я усовершенствовал броски в Rescuties (tl;dr)
- Измеряем скорость броска от центра тяжести, который ощущается пользователем, т.е от центра тяжести контроллера.
- Распознаём бросок точно в момент, когда игрок собирается бросить, т.е. при частичном отпускании триггера.
- Преобразуем большую часть измеренных данных скорости регрессией, чтобы лучше оценивать намерения игрока.
Если вам интересно потестировать эти разные подходы и сравнить их, в Rescuties есть меню «Labs!», где можно переключать разные режимы бросков, выбирать способ измерения скорости и управлять количеством кадров измерений, используемых для регрессии/сглаживания.
Но эта проблема ни в коем случае не решена. В VR-играх используется множество разных подходов к броскам, и они нравятся игрокам. При создании бросков в Rescuties я хотел сделать так, чтобы физические ожидания мышечной памяти как можно сильнее соответствовали ощущениям в виртуальной реальности летающих детишек. Сейчас они уже гораздо лучше, но я хочу ещё улучшить их.
Поэтому приветствуются любые предложения по моему подходу и любая критика: можете в любой момент связаться со мной в Твиттере или по почте.
Комментарии (25)
vadim_ig
12.01.2017 11:22+3Автор близок к разгадке тайны хорошего погружения. Остается совсем чуть-чуть — запустить контроллером в ближайшее зеркало. По-моему, некорректно выбран жанр для игры — он практически полностью привязан к корректному мышечному отклику.
Markscheider
12.01.2017 11:56+1Аналогичные проблемы стали впервые хорошо заметны на Nintendo Wii и его контроллере. В часть игр без предварительной тренировки играть вообще нереально. Боулинг, например, где отпускание шара = отпусканию кнопки. И чтобы научиться подкручивать шар приходится кучу времени потратить.
А, например, с теннисом на Wii сильно проще, т.е. и ракетка и джойстик суть палки со сходной геометрией.
deinlandel
12.01.2017 13:29Vive Tracker в будущем может помочь уменьшить несоответствие реального и виртуального предмета в плане формы и веса.
kraidiky
12.01.2017 14:25Очень хорошая статья. Даже если не планируешь в ближайшее время прогать VR сам — хотя бы понимаешь какого порядка и нажористости проблемы присутствуют в современном VR
igentuman
12.01.2017 15:24Отлично. Я столкнулся с такими проблемами когда начал делать игру с бросанием файрболов под кинект 2.0.
amarao
12.01.2017 15:36Порог должен быть достаточно большим, чтобы игрок случайно не выронил ребёнка.
Я рад, что живу в эпоху развитого киберпанка.
Ckpyt
12.01.2017 19:24Как считается физика в вашем игровом движке? «Пляски костей» у вас, случайно, не наблюдается? Попробуйте поставить шарики друг на друга и посмотрите, что получится. Если более-менее реалистичное поведение, то все ок… Можете еще попробовать испытать физику движка на кумулятивный эффект(в идеальную полуссферу кладется много-много мячиков и она роняется с двух-трех метров, шарики по центру должны высоко взлететь) в ряде движков наблюдается очень странное поведение при этом эффекте.
Ну и ключевое — несколько примитивных качелей — бревно, на нем доска, на лежащем конце брусок весом 2 кг. С разных высот на верхний конец падают бруски массой в 10 кг. Посмотрите, что получится. Если все ок — то таки да, дело в неправильном определении центра масс. А вот если нет — то можно задуматься.
Все это может влиять на бросок предмета — просто неправильно передается импульс предмету.
IgeNiaI
12.01.2017 19:53+2А есть ли контроллеры в виде перчаток? Как по мне, они бы дали наиболее интуитивное управление.
twofaced
13.01.2017 08:39Масса их, но все на стадии глубокой разработки как и сами хедсеты. Проблема текущей итерации в ограниченной рабочей области. Большая часть проектов основана на камере глубины, которая либо на HMD крепится, либо перед юзером.
Есть классное видео на тему управления и вообще интерфейсов VR записанное Майком Алгером. Мы используем его постоянно в своей разработке. И нам его философия перчатка — джойстик очень нравится.
Shortki
12.01.2017 22:47А не пробовали механику игры приближать к возможностям контроллера? Например ловить детей и зверей некой “волшебной палочкой/силовым полем джедаев” и этим же перебрасывать дальше. Думается ощущения от контроллера в руке в данном случае будут совпадать с визуальным образом, погружение будет выше, а необходимость освоить “магию” станет дополнительным игровым моментом, опять же когда все дети людей будут спасены, можно спасать детёнышей слонов, динозавров и сказочных великанов )
Torvald3d
13.01.2017 11:05Нужно просто к контроллерам прикрутить гравитационный генератор мгновенного действия, тогда можно будет ощущать вес предмета. осталось его изобрести.
Мне в голову пришла дурацкая идея с трубочками-шлангами к контроллеру, которые тянутся от емкости где-нибудь на полу и быстро накачивают или выкачивают жидкость в контроллерах. Но это не получится сделать быстро + трубочки будут мешаться.Markscheider
13.01.2017 11:54+2Мне в голову пришла дурацкая идея с трубочками-шлангами к контроллеру
Сверхмощный электромагнит в полу + железные вставки в перчатки\контроллер? Скорость реакции, как минимум, будет нормальная. Но что случится со всей электроникой, попавшей в зону действия магнитного поля, я и подумать боюсь :)Torvald3d
14.01.2017 13:57а разве сверхмощный магнит будет работать на расстоянии в 1.5 метра? Но даже если будет, учитывая его силу, малейший косяк в электронике — и ваши руки расплющит об пол)
SergioD
13.01.2017 18:31проще добавить в контроллер воздушный насос, с изменяющим направление соплом. Для чувства массы он включается, и воздушный поток дает руке почувствовать наличие дополнительной массы. Направление потока может быть обратным от направления падения предмета.
Torvald3d
14.01.2017 13:55Шумно и очень не равномерно) Будут всякие завихрения, качения, дрожания и тп
mayorovp
14.01.2017 18:17Гравитационный генератор позволит ощущать вес предмета только до тех пор пока его не попытаются бросить. Нужен генератор массы :-)
mortimoro
Я один не могу читать текст, вокруг которого мелькают и дергаются анимированные картинки, или кто-то еще испытывает такие проблемы?
PatientZero
Уберу все gif под спойлеры.
mortimoro
Спасибо, совсем другое дело. Что касается мышечных ощущений, то я думаю, что с манипуляторами, которые имеются на данный момент, сделать более реалистичное ощущение веса не получится. Манипулятор должен оказывать давление на определенную часть руки, чтобы создавать иллюзию массы. К примеру, если зажать подушечку под большим пальцем, а затем последовательно касаться другими пальцами большого, то ощущения в области подушечки будут различными (так начинающие повара плотность стейка при прожарке замеряют). Для ощущения массы давление скорее всего должно создаваться даже не в кисти руки, а выше. И дополнительные грузы на манипуляторе вряд ли дадут нужный эффект. Потому, чтобы покидаться детишками, их лучше визуально сделать такими, чтобы они соответствовали весу манипулятора.
Goodkat
Я не испытываю, так как корпоративный файрвол уже несколько лет блокирует habrastorage.org как file sharing/adult content.
Oplkill
Одна из причин популярности блокировщиков рекламы