Програмування системи тактильної відачі (Haptics) контролерів
Haptics у VR—це різниця між «тримаю щось» та «чую, що тримаю щось». Тактильна відача правильної інтенсивності та паттерну посилює ілюзію присутності сильніше, ніж багато графічних поліпшень. При цьому типова реалізація haptics—одна вібрація при дотику об'єкта—використовує 10% можливостей контролера.
Що реально вміють контролери
Контролери Meta Quest 2/3 та Touch Pro працюють через OVRInput.SetControllerVibration(frequency, amplitude, controller). Параметри: frequency від 0.0 до 1.0 (маппіться приблизно на 160–320 Гц), amplitude від 0.0 до 1.0. Touch Pro додатково підтримує TriggerHaptics через OVRInput.SetControllerHapticsState()—окремена вібрація в триггері, незалежна від основного контролера.
Valve Index controllers—найбагатші за haptics. Підтримують PCM haptics через SteamVR Skeletal Input API: можна передавати масив семплів довільної форми хвилі. Розробник буквально описує форму вібрації у вигляді float[] буфера. Це дозволяє симулювати конкретні текстури поверхонь, удари з нарастаючим затуханням, ритмічні паттерни.
Pico 4—стандартні haptics через OpenXR xrApplyHapticFeedback з XrHapticVibration: frequency, amplitude, duration. Без PCM, але з управлінням тривалістю в наносекундах—достатньо для детальних паттернів.
Паттерни haptics: від простого до детального
Проста вібрація: OVRInput.SetControllerVibration(0.5f, 0.5f, OVRInput.Controller.RTouch) на 100 мс—база. Працює для загальних взаємодій: захват, натиск кнопки, попадання.
Нарастаюча вібрація з корутиною:
IEnumerator HapticRamp(OVRInput.Controller controller, float duration) {
float elapsed = 0f;
while (elapsed < duration) {
float t = elapsed / duration;
OVRInput.SetControllerVibration(0.3f + t * 0.5f, t, controller);
elapsed += Time.deltaTime;
yield return null;
}
OVRInput.SetControllerVibration(0f, 0f, controller);
}
Ефект нарастаючої дрожі—наприклад, гравець бере вібруючий механізм або заряджає зброю.
Ударний паттерн з затуканням—імітація удару о поверхню. Спочатку короткий високоамплітудний імпульс (80 мс, amplitude 1.0), потім кілька зменшуючихся відзвуків (60 мс → 40 мс з меншою амплітудою). Це ощущується як реальний удар, а не просто вібрація.
Текстурна симуляція: при русі контролера вздовж поверхні—вібрація, частота та амплітуда якої залежать від швидкості руху та типу матеріалу. Шершава поверхня: випадковий noise в amplitude з частотою оновлення 20 мс. Гладка: низька постійна амплітуда. Реалізується через Update() з перевіркою швидкості контролера через OVRInput.GetLocalControllerVelocity().
OpenXR Haptics для кросс-платформних проектів
Для проектів, які працюють через OpenXR (Unity XR Interaction Toolkit), haptics через XRBaseController.SendHapticImpulse(amplitude, duration)—стандартний шлях. Обмеження: нема прямого доступу до frequency на рівні OpenXR base API.
Для частотного контролю через OpenXR—UnityEngine.XR.HapticCapabilities дозволяє перевірити підтримку frequency на конкретному пристрої, після чого через native binding (Oculus XR Plugin або OpenXR Plugin з vendor extension) отримати доступ до розширених параметрів.
Важливо: haptics працює лише при активному focus додатку. При втраті фокуса (overlay з'явився, пауза) вібрації автоматично припиняються платформою. Код повинен це враховувати—не пробувати возобновляти haptics після втрати фокуса без явного триггера.
Типові помилки при реалізації haptics
Haptic spam: кожен контакт з будь-яким об'єктом генерує вібрацію без throttle. Якщо в сцені щільна геометрія, контролер вібрує безперервно. Рішення: HapticCooldown компонент з мінімальним інтервалом між подіями (100–200 мс).
Симетричність за замовчуванням: обидві руки завжди отримують однаковий haptic. У реальних взаємодіях ліва та права рука частіше робять різні речі. Незалежне управління через OVRInput.Controller.LTouch / RTouch—базова вимога.
| Масштаб задачі | Орієнтовні строки |
|---|---|
| Базова система haptics для 5–10 типів взаємодій | 2–4 робочих дня |
| Розширена система з паттернами та TextureHaptics | 1–2 тижні |
| Кросс-платформенний haptics layer (Quest + Index + Pico) | 2–3 тижні |
Вартість визначається після аналізу проекту та списку взаємодій, що потребують haptic-зворотного зв'язку.





