Чому кидки в VR такі відстійні, і що з цим робити?



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

image

Деякі кидки бувають дуже сильними. Інші — надзвичайно слабкими. Один-два рази все-таки вдається потрапити в переслідуваного NPC. Напевно, самий перший урок у VR — кидати точно досить складно. Коли я відчув це почуття, то спочатку подумав, що погано граю у VR. Ми вважаємо природним, що освоєння схеми управління — частина кривої навчання гри. Але коли кидки однаковими рухами приводять до абсолютно різних результатів, то це дуже засмучує.

Різкий кидок з замахом закінчується коротким польотом предмета…

image
Намагаюся кинути пляшку води з замахом руки

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

image
Я просто злегка ворухнув зап'ястям...

Rescuties: гра з підкиданням дітей

Цього літа я працював над казуальної екшн-грою під назвою Rescuties. Це VR-гра про киданні і ловлі дітей і інших милих тварин.

Якщо у віртуальній реальності світ реагує на наші дії контринтуитивно, це заважає заглибленості гравців в процес або напружує їх. Весь геймплей пов'язаний з киданням, тому 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.)

image
Усереднення швидкості контролера дає надійні, але надто повільні результати, які абсолютно відрізняються від відчуттів у Job Simulator

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

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

image
Налагоджувальна візуалізація швидкості показує червоним останні чотири кадри вимірюваної швидкості, а жовтим — результат регресії, використовуваний в грі

Як я удосконалив кидки в Rescuties (tl;dr)
  • Вимірюємо швидкість кидка від центру ваги, який відчувається користувачем, т. е від центру тяжкості контролера.
  • Розпізнаємо кидок точно в момент, коли гравець збирається кинути, тобто при частковому відпускання тригера.
  • Перетворимо більшу частину виміряних даних швидкості регресією, щоб краще оцінювати наміри гравця.
image

Якщо вам цікаво потестувати ці різні підходи і порівняти їх, Rescuties є меню «Labs!», де можна перемикати різні режими кидків, вибирати спосіб вимірювання швидкості і управляти кількістю кадрів вимірювань, що використовуються для регресії/згладжування.

Але ця проблема ні в якому разі не вирішена. У VR-іграх використовується безліч різних підходів до кидків, і вони подобаються гравцям. При створенні кидків в Rescuties я хотів зробити так, щоб фізичні очікування м'язової пам'яті як можна сильніше відповідали відчуттів у віртуальній реальності літаючих діточок. Зараз вони вже набагато краще, але я хочу ще поліпшити їх.

Тому вітаються будь-які пропозиції щодо мого підходу і будь-яка критика: можете в будь-який момент зв'язатися зі мною Twitter або поштою.

image
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.