Програмування захоплення та кидання предметів у VR: повний гайд

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

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1504
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1005
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    635
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    716
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    95

Програмування логіки захоплення та кидання предметів у VR

Взяти предмет рукою у VR і жбурнути його в стіну — одна з найбазовіших і водночас технічно неочевидних механік. Коли вона працює добре, гравець не помічає нічого. Коли погано — предмет телепортується в руку із затримкою, тремтить при утриманні, летить не туди або провалюється крізь підлогу. Ми займаємося VR-розробкою з 2017 року, реалізували понад 50 проєктів для Quest, SteamVR та мобільних платформ — накопичили досвід, який гарантує стабільну фізику взаємодії. У цій статті розбираємо ключові проблеми та їхні рішення.

Як правильно реалізувати захоплення у VR?

Перший інстинкт — при захопленні перемістити об'єкт у позицію контролера та зробити його child. Це працює 5 секунд. Потім з'ясовується:

Rigidbody з isKinematic = false під контролером-батьком поводиться непередбачувано: фізичний рушій не знає, що об'єкт рухається кінематично, і продовжує обчислювати колізії зі старим velocity. Об'єкт проходить крізь поверхні при швидкому русі руки. З isKinematic = true об'єкт перестає брати участь у фізиці взагалі: він ігнорує колізії, не штовхає інші об'єкти. Можна розмахувати мечем крізь усе.

Правильне рішення в XR Interaction Toolkit — XRGrabInteractable з Movement Type = VelocityTracking. У цьому режимі об'єкт не телепортується до руки — до нього застосовується velocity, яка рухає Rigidbody до target позиції. Фізика залишається активною. Об'єкт стикається з перешкодами при переміщенні рукою. Параметри Track Position Strength та Track Rotation Strength визначають «жорсткість» стеження — високі значення (20–30) дають щільне прилипання до руки, низькі (5–10) — м'яке, із запізненням, ніби тримаєш важку кулю.

Чому важливий velocity smoothing при киданні?

Після release потрібно передати об'єкту швидкість, що відповідає руху руки. Здавалося б, просто rigidBody.velocity = controllerVelocity. Проблема: velocity контролера в XR Node — це миттєве значення на момент release. Якщо гравець різко зупинив руку перед кидком (що роблять багато хто), velocity = 0 і об'єкт падає вертикально вниз. Реальний фізичний кидок використовує пікову швидкість у фазі кидка, не фінальну.

Velocity smoothing — XRGrabInteractable збирає історію позицій контролера за останні N кадрів (за замовчуванням буфер 5–10 фреймів). При release обчислюється середня velocity по буферу. Це імітує фізичну інерцію. У версії XR Interaction Toolkit 2.3+ параметр Throw Velocity Scale додатково масштабує фінальну velocity — значення 1.5–2.0 дає відчуття більш «вагомого» кидка. Angular velocity для обертання: rigidBody.angularVelocity = controllerAngularVelocity * throwAngularVelocityScale — без цього об'єкт летить без обертання, неприродньо.

Порівняння підходів: child vs VelocityTracking

Параметр Child-прив'язка VelocityTracking (XRIT)
Поведінка з колізіями Проходження крізь стіни при швидкому русі Коректні зіткнення
Фізика об'єкта після відпускання Зберігається, але зі спотвореннями Природна інерція
Продуктивність Низька (часті updates) Середня (згладжування)
Необхідне доопрацювання Кастомна корекція velocity Використання XRGrabInteractable

VelocityTracking працює стабільніше в 90% випадків — ми рекомендуємо саме його для будь-яких VR-проєктів.

Специфіка для Quest та мобільного VR

На Quest controller tracking працює із затримкою 20–30 мс (Prediction компенсує частково). Velocity з InputDevice.TryGetFeatureValue(CommonUsages.deviceVelocity) вже передбачена Meta Runtime — використовувати саме її, не обчислювати вручну по дельті позицій. Haptic feedback при захопленні — обов'язковий для quality of life. XRBaseController.SendHapticImpulse(0.7f, 0.05f) на початку grab, SendHapticImpulse(0.3f, 0.02f) при release. Без вібрації VR-захоплення відчувається пластиковим.

Окрема тема — two-handed grab: зброя, яку можна тримати двома руками. XR Interaction Toolkit 2.x надає XRGrabInteractable з кількома Attach Points та логікою dominant/secondary hand. Для зброї потрібна кастомна логіка: основна рука визначає позицію, друга — додає ротацію вздовж осі ствола.

Що входить у роботу

При замовленні реалізації grab/throw механіки під ключ ми надаємо:

  • Робочий прототип сцени з інтегрованими скриптами XR Interaction Toolkit
  • Налаштовані параметри velocity smoothing та Throw Velocity Scale під платформу (Quest, SteamVR, Pico)
  • Haptic feedback для всіх інтеракцій
  • Документація з калібрування та тестування
  • Навчання команди (2-годинний воркшоп)
  • Гарантія на код — 60 днів безкоштовної підтримки

Оцінка термінів та вартості

Терміни: базова grab/throw механіка через XR Interaction Toolkit — 2–4 робочих дні; кастомна two-handed система з haptics та velocity tuning — 1–2 тижні. Вартість визначається після аналізу вимог проєкту. Оцінимо ваш проєкт безкоштовно — зв'яжіться з нами для консультації. За 7+ років досвіду ми жодного разу не зірвали дедлайн.