Программирование системы тактильной отдачи (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 на конкретном устройстве, после чего через нативный 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-обратную связь.





