Програмування логіки захоплення та кидання предметів у 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+ років досвіду ми жодного разу не зірвали дедлайн.






