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

Job Simulator
image

Некоторые броски бывают слишком сильными. Другие — чрезвычайно слабыми. Один-два раза всё-таки удаётся попасть в преследуемого NPC. Наверно, самый первый урок в VR — кидать точно довольно сложно. Когда я испытал это чувство, то сначала подумал, что плохо играю в VR. Мы считаем естественным, что освоение схемы управления — часть кривой обучения игры. Но когда броски одинаковыми движениями приводят к совершенно разным результатам, то это очень расстраивает.

Резкий бросок с замахом заканчивается коротким полётом предмета…

Пытаюсь бросить бутылку воды с замахом руки
image

…а лёгкий взмах запястьем может отправить предмет в долгий полёт.

Я просто слегка двинул запястьем…
image

Rescuties: игра с подбрасыванием детей


Этим летом я работал над казуальной экшн-игрой под названием Rescuties. Это VR-игра о бросании и ловле детей и других милых животных.

Если в виртуальной реальности мир реагирует на наши действия контринтуитивно, это мешает погружённости игроков в процесс или напрягает их. Весь геймплей связан с бросанием, поэтому Rescuties не могли положиться на столь неудобную по своей сути механику.

Rescuties
image

Раздражение — неотъемлемая часть дизайна таких игр. Если вкратце, то бросать в VR сложно, потому что невозможно ощутить вес виртуального объекта. Подходы могут быть разными, но в большинстве игр стремятся сделать физику виртуального объекта как можно более правдоподобной. Игрок хватает объект, придаёт ему виртуальный импульс, и тот улетает.

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

Если бы игрок при броске просто толкал руками в каком-то направлении, это несовпадение было бы не очень важно. Но при броске он сгибает руку и поворачивает запястье. (В чём секрет хорошего броска? «Всё дело в запястье!») При повороте своей реальной руки игрок прикладывает к виртуальному объекту излишний момент, как будто он кидает его маленькой ложечкой.

Это очень бескомпромиссное явление. Во многих VR-играх пользователь может «поднять» объект, находящийся в полуметре от его руки. При нажатии кнопки объект прилетает в руку, но остаётся на постоянном расстоянии, превращая руку в катапульту. Разница между семью и тридцатью сантиметрами может означать, что движение запястьем заставит объект летать по всей комнате или просто слегка толкнёт его вперёд.

Движение запястья как катапульты
image

В Rescuties игрок ловит летящих быстро детей и стремится как можно скорее перебросить их в безопасное место. Использование традиционного подхода приводило к слишком капризному управлению и раздражающему игровому процессу. «Почему я просто не могу бросить ребёнка так, как ощущаю правильным?»

Физический и виртуальный вес


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

Вместо измерения скорости броска виртуального объекта, который держит игрок. нужно выполнять измерения для объекта, который держит игрок — реального объекта, т.е. контроллера HTC Vive или Oculus Touch. Именно его вес и момент он ощущает в руке. И на эти вес и момент откликается его мышечная память (физический навык и инстинкт, развившийся за время жизни).

image
Центр тяжести, ощущаемый игроком, не изменяется, какой бы виртуальный объект он ни поднял

Связать физический и виртуальный вес для определения внутриигровой скорости можно с помощью центра тяжести физического контроллера. Во-первых, нужно определить, где находится этот реальный центр тяжести в игре. Контроллеры сообщают о своём местоположении в игровом пространстве. Игрок сам может взглянуть из-под наголовного дисплея, чтобы откалибровать положение центра тяжести. При отслеживании этой точки относительно контроллера вычисляется скорость при изменении его положения.

После внесения таких изменений тестеры стали играть в Rescuties? намного лучше, но я всё равно видел и ощущал сильное несоответствие.

этой статье есть интересные соображения о передаче информации о виртуальном весе игрокам. Этот подход противоположен, вместо максимального использования физических ощущений веса контроллера он даёт пользователю виртуальные сигналы о поведении виртуальных объектов.)

Выбор времени


В какой именно момент игрок намерен бросить объект?

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

Вместо такой тактильной обратной связи в большинстве VR-игр используется триггер под указательным пальцем. Это лучше, чем кнопка: в Rescuties нажатие триггера на 20% сжимает виртуальную перчатку примерно на 20%, а 100-процентное нажатие сжимает кулак полностью. Но игрок не ощутит объект, вырывающийся из захвата и скользящий по пальцам. Описанное выше разжатие пальцев реализуется простым отпусканием триггера (возможно, постепенным). Я выяснил, что нужно определять сигнал броска от игрока сразу же, когда он начинает расслаблять пальцы. Броски распознаются, когда давление на триггер ослабляется, не только до 0% или до небольшого значения, а до экспериментально найденного.

image

На графике показано изменение давления на триггер в цикле «захват-удерживание-бросок». В этом случае пользователь не нажимает на триггер на 100%. Такое часто бывает, потому что у контроллеров HTC триггер можно легко нажать примерно до 80%, а потом нужно приложить гораздо большее усилие, чтобы нажать до 100%. Сначала игрок нажимает триггер для поднятия объекта. Затем давление более-менее постоянно. потому что игрок захватил объект и замахивается для броска. Здесь виден небольшой шум датчика триггера. Игрок отпускает триггер при броске или выбрасывании объекта.

Шум сигнала и пульс игрока может привести к колебаниям усилия нажатия на триггер. Поэтому необходим порог распознавания действий игрока. В частности, это значит, что игра регистрирует выбрасывание, когда давление на триггер (например) на 20% меньше, чем пиковое давление, зафиксированное при поднятии объекта игроком. Порог должен быть достаточно большим, чтобы игрок случайно не выронил ребёнка. Нужное значение мы с тестерами нашли методом проб и ошибок. Кроме того, если распознать действие как захват при слишком малом давлении, не останется достаточного интервала для надёжного определения броска или отпускания. У вас получится то же, что и у меня в одной из неудачных итераций: странный сверхбыстрый цикл «поднятие-бросок-поднятие-бросок».

Шум скорости


Измерение правильной скорости и улучшение выбора времени достаточно хорошо снижают эффект несоответствия бросков. Но сами исходные данные — измерения скорости, поступающие с датчиков оборудования — довольно шумные. Шум особенно заметен, когда наголовный дисплей или контроллеры двигаются быстро. (Скажем, когда игрок что-нибудь бросает!)

Работа с шумом требует сглаживания.

Я попробовал сгладить скорость скользящим средним (также известным как фильтр нижних частот), но в результате хоть как-то усреднялись только самый медленный (замах) и самый быстрый (отпускание) этапы броска. Моим тестерам показалось, что бросать очень сложно, как будто они находятся под водой. (Именно это я обычно ощущал в игре Rec Room.)

Усреднение скорости контроллера даёт надёжные, но слишком медленные результаты, совершенно отличающиеся от ощущений в Job Simulator
image

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

Мне нужно было взять несколько последних кадров измерений, и пронаблюдать, как они развиваются, т.е. нарисовать линию тренда. Простая линейная регрессия измерений дала нам значительно более надёжный результат. Наконец мне удалось бросать детей когда и куда я хочу!

Отладочная визуализация скорости показывает красным последние четыре кадра измеряемой скорости, а жёлтым - результат регрессии, используемый в игре
image

Как я усовершенствовал броски в Rescuties (tl;dr)


  • Измеряем скорость броска от центра тяжести, который ощущается пользователем, т.е от центра тяжести контроллера.
  • Распознаём бросок точно в момент, когда игрок собирается бросить, т.е. при частичном отпускании триггера.
  • Преобразуем большую часть измеренных данных скорости регрессией, чтобы лучше оценивать намерения игрока.

image

Если вам интересно потестировать эти разные подходы и сравнить их, в Rescuties есть меню «Labs!», где можно переключать разные режимы бросков, выбирать способ измерения скорости и управлять количеством кадров измерений, используемых для регрессии/сглаживания.

Но эта проблема ни в коем случае не решена. В VR-играх используется множество разных подходов к броскам, и они нравятся игрокам. При создании бросков в Rescuties я хотел сделать так, чтобы физические ожидания мышечной памяти как можно сильнее соответствовали ощущениям в виртуальной реальности летающих детишек. Сейчас они уже гораздо лучше, но я хочу ещё улучшить их.

Поэтому приветствуются любые предложения по моему подходу и любая критика: можете в любой момент связаться со мной в Твиттере или по почте.

image
Поделиться с друзьями
-->

Комментарии (25)


  1. mortimoro
    12.01.2017 11:21
    +20

    Я один не могу читать текст, вокруг которого мелькают и дергаются анимированные картинки, или кто-то еще испытывает такие проблемы?


    1. PatientZero
      12.01.2017 11:50
      +9

      Уберу все gif под спойлеры.


      1. mortimoro
        12.01.2017 12:46

        Спасибо, совсем другое дело. Что касается мышечных ощущений, то я думаю, что с манипуляторами, которые имеются на данный момент, сделать более реалистичное ощущение веса не получится. Манипулятор должен оказывать давление на определенную часть руки, чтобы создавать иллюзию массы. К примеру, если зажать подушечку под большим пальцем, а затем последовательно касаться другими пальцами большого, то ощущения в области подушечки будут различными (так начинающие повара плотность стейка при прожарке замеряют). Для ощущения массы давление скорее всего должно создаваться даже не в кисти руки, а выше. И дополнительные грузы на манипуляторе вряд ли дадут нужный эффект. Потому, чтобы покидаться детишками, их лучше визуально сделать такими, чтобы они соответствовали весу манипулятора.


    1. Goodkat
      12.01.2017 11:53
      +3

      Я не испытываю, так как корпоративный файрвол уже несколько лет блокирует habrastorage.org как file sharing/adult content.


    1. Oplkill
      13.01.2017 21:45

      Одна из причин популярности блокировщиков рекламы


  1. vadim_ig
    12.01.2017 11:22
    +3

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


    1. Suvitruf
      12.01.2017 14:24

      Я так люстру сбил, когда гранату в игре кидал :C


  1. Markscheider
    12.01.2017 11:56
    +1

    Аналогичные проблемы стали впервые хорошо заметны на Nintendo Wii и его контроллере. В часть игр без предварительной тренировки играть вообще нереально. Боулинг, например, где отпускание шара = отпусканию кнопки. И чтобы научиться подкручивать шар приходится кучу времени потратить.
    А, например, с теннисом на Wii сильно проще, т.е. и ракетка и джойстик суть палки со сходной геометрией.


  1. deinlandel
    12.01.2017 13:29

    Vive Tracker в будущем может помочь уменьшить несоответствие реального и виртуального предмета в плане формы и веса.


  1. kraidiky
    12.01.2017 14:25

    Очень хорошая статья. Даже если не планируешь в ближайшее время прогать VR сам — хотя бы понимаешь какого порядка и нажористости проблемы присутствуют в современном VR


  1. igentuman
    12.01.2017 15:24

    Отлично. Я столкнулся с такими проблемами когда начал делать игру с бросанием файрболов под кинект 2.0.


  1. amarao
    12.01.2017 15:36

    Порог должен быть достаточно большим, чтобы игрок случайно не выронил ребёнка.

    Я рад, что живу в эпоху развитого киберпанка.


  1. mrjj
    12.01.2017 16:21
    -2

    Продвинутые вариации фильтра Калмана не?


  1. Ckpyt
    12.01.2017 19:24

    Как считается физика в вашем игровом движке? «Пляски костей» у вас, случайно, не наблюдается? Попробуйте поставить шарики друг на друга и посмотрите, что получится. Если более-менее реалистичное поведение, то все ок… Можете еще попробовать испытать физику движка на кумулятивный эффект(в идеальную полуссферу кладется много-много мячиков и она роняется с двух-трех метров, шарики по центру должны высоко взлететь) в ряде движков наблюдается очень странное поведение при этом эффекте.
    Ну и ключевое — несколько примитивных качелей — бревно, на нем доска, на лежащем конце брусок весом 2 кг. С разных высот на верхний конец падают бруски массой в 10 кг. Посмотрите, что получится. Если все ок — то таки да, дело в неправильном определении центра масс. А вот если нет — то можно задуматься.
    Все это может влиять на бросок предмета — просто неправильно передается импульс предмету.


    1. twofaced
      13.01.2017 11:17

      Боюсь что автор статьи не читает хабр) А стоило бы)


  1. IgeNiaI
    12.01.2017 19:53
    +2

    А есть ли контроллеры в виде перчаток? Как по мне, они бы дали наиболее интуитивное управление.


    1. twofaced
      13.01.2017 08:39

      Масса их, но все на стадии глубокой разработки как и сами хедсеты. Проблема текущей итерации в ограниченной рабочей области. Большая часть проектов основана на камере глубины, которая либо на HMD крепится, либо перед юзером.
      Есть классное видео на тему управления и вообще интерфейсов VR записанное Майком Алгером. Мы используем его постоянно в своей разработке. И нам его философия перчатка — джойстик очень нравится.


  1. Shortki
    12.01.2017 22:47

    А не пробовали механику игры приближать к возможностям контроллера? Например ловить детей и зверей некой “волшебной палочкой/силовым полем джедаев” и этим же перебрасывать дальше. Думается ощущения от контроллера в руке в данном случае будут совпадать с визуальным образом, погружение будет выше, а необходимость освоить “магию” станет дополнительным игровым моментом, опять же когда все дети людей будут спасены, можно спасать детёнышей слонов, динозавров и сказочных великанов )


  1. Torvald3d
    13.01.2017 11:05

    Нужно просто к контроллерам прикрутить гравитационный генератор мгновенного действия, тогда можно будет ощущать вес предмета. осталось его изобрести.
    Мне в голову пришла дурацкая идея с трубочками-шлангами к контроллеру, которые тянутся от емкости где-нибудь на полу и быстро накачивают или выкачивают жидкость в контроллерах. Но это не получится сделать быстро + трубочки будут мешаться.


    1. Markscheider
      13.01.2017 11:54
      +2

      Мне в голову пришла дурацкая идея с трубочками-шлангами к контроллеру

      Сверхмощный электромагнит в полу + железные вставки в перчатки\контроллер? Скорость реакции, как минимум, будет нормальная. Но что случится со всей электроникой, попавшей в зону действия магнитного поля, я и подумать боюсь :)


      1. Torvald3d
        14.01.2017 13:57

        а разве сверхмощный магнит будет работать на расстоянии в 1.5 метра? Но даже если будет, учитывая его силу, малейший косяк в электронике — и ваши руки расплющит об пол)


        1. Markscheider
          14.01.2017 17:21

          Для того и смайлик


    1. SergioD
      13.01.2017 18:31

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


      1. Torvald3d
        14.01.2017 13:55

        Шумно и очень не равномерно) Будут всякие завихрения, качения, дрожания и тп


    1. mayorovp
      14.01.2017 18:17

      Гравитационный генератор позволит ощущать вес предмета только до тех пор пока его не попытаются бросить. Нужен генератор массы :-)