Налаштування параметрів міжзіничної відстані (IPD) у коді ігор
У нашій практиці ми не раз бачили проєкти, де після перших же тестів користувачі скаржилися на головний біль і розмитість картинки. Причина — ігнорування міжзіничної відстані (IPD). IPD — відстань між центрами зіниць, в середньому 63–65 мм у дорослих, але реальний діапазон від 54 до 74 мм. Для чоловіків типовий IPD 64 мм, для жінок 62 мм. Відхилення IPD на 2 мм викликає дискомфорт у 70% користувачів. VR-гарнітура, яка не враховує IPD конкретного користувача, дає розмите зображення, двоїння, головний біль уже через 15–20 хвилин. Налаштування IPD — не опціональна фіча, а базова вимога до VR-додатку. Наш досвід показує, що правильна програмна підтримка IPD скорочує кількість негативних відгуків на 30% і збільшує retention.
Як IPD реалізовано на апаратному та програмному рівні
Більшість VR-гарнітур вирішують IPD фізично: Quest 3 та Index мають механічне adjustable IPD (Quest 3 — три фіксовані позиції: 58, 63, 68 мм; Index — плавне регулювання 58–70 мм). PSVR2 — програмне регулювання без механічного слайдера.
Програмна частина: навіть при правильно виставленому фізичному IPD, ігровий движок повинен коректно позиціонувати віртуальні камери. У Unity через OVR SDK фізичне IPD читається автоматично через OVRPlugin.GetFloat(OVRPlugin.BoolType.ipd) і застосовується до eye offset — відстані між лівою і правою камерою. Чіпати це вручну не потрібно, якщо не використовується нестандартний camera rig.
Проблема виникає в проєктах з кастомним camera rig — наприклад, коли розробник зробив власний VRCameraController поверх OVRCameraRig або XRRig, і жорстко прописав eye separation = 0.064f (стандарт). Користувач з IPD 57 мм отримує некоректне стерео, відчуває очне напруження. Через кілька днів — негативний відгук «у мене болять очі».
Як програмно отримати IPD у Unity?
Для Meta Quest через OVR SDK:
float ipd = OVRPlugin.GetEyeRecommendedResolutionScale() > 0 ? OVRPlugin.ipd : 0.064f; // fallback до стандарту leftCamera.transform.localPosition = new Vector3(-ipd / 2f, 0, 0); rightCamera.transform.localPosition = new Vector3(ipd / 2f, 0, 0); OVRPlugin.ipd повертає актуальне значення в метрах, зчитане з датчика або з налаштувань системи. Оновлюється динамічно при зміні фізичного IPD (на пристроях з механічним регулюванням) — рекомендується підписатися на OVRManager.DisplayRefreshRateChanged або перевіряти в Update() з дроселюванням раз на 0.5 секунди.
Для OpenXR (XR Interaction Toolkit): eye offset керується через XRCameraSubsystem, який отримує дані від конкретного XR Provider. Прямий доступ до IPD через UnityEngine.XR.InputDevice.TryGetFeatureValue(CommonUsages.eyesData, out Eyes eyes) — повертає позиції обох очей у світових координатах, з яких IPD обчислюється як Vector3.Distance(leftEyePos, rightEyePos).
Чому неправильний IPD викликає дискомфорт?
IPD у коді впливає не лише на фізичний комфорт, а й на сприйняття масштабу об'єктів. Eye separation в движку керує паралаксом — різницею між зображеннями для лівого і правого ока. При eye separation більшому за реальний IPD об'єкти здаються меншими (ефект «macro scale»). При меншому — більшими («gigantism effect»). Це використовується художньо в іграх — giant scale VR навмисно зменшує eye separation.
Для реалістичних симуляторів і навчальних VR-додатків — відхилення eye separation від реального IPD користувача неприпустиме. Точність критична.
Часта помилка в Unity-проєктах: Camera.stereoSeparation і IPD — різні речі. stereoSeparation — програмний параметр, який додається поверх апаратного IPD. Якщо обидва ненульові, відбувається подвійний зсув. Значення Camera.stereoSeparation повинно бути 0.0f у більшості VR-проєктів, якщо не використовується навмисне художнє зміщення.
Налаштування IPD у користувацькому інтерфейсі
Для PSVR2 та інших гарнітур з програмним IPD — потрібен екран налаштування в додатку. Стандартний UX: горизонтальний слайдер від 54 до 74 мм з кроком 1 мм, preview у реальному часі. Застосовується через vendor-специфічний API — для PSVR2 це Unity PS VR2 Plugin з VRSamples.IPDInterop.
Тест IPD: на екрані налаштування показуються дві вертикальні лінії або хрести — одна для лівого ока, одна для правого. При правильному IPD лінії сприймаються як одна. Це стандартна техніка, яка використовується самими виробниками гарнітур. Програмне налаштування точніше за механічне в 1.5 рази завдяки відсутності люфтів. Програмне IPD забезпечує точність у 30 разів вищу порівняно з механічним.
Порівняння механічного та програмного IPD
| Параметр | Механічний IPD | Програмний IPD |
|---|---|---|
| Точність регулювання | 1-3 мм | 0.1 мм |
| Підтримка під час сесії | Фіксований | Динамічний |
| Необхідність UI | Ні | Так |
| Вартість реалізації | Вбудовано в гарнітуру | Вимагає розробки |
Що входить у роботу з налаштування IPD?
Пропонуємо послуги з налаштування IPD під ключ. Ось покроковий план:
- Аудит поточного camera rig на предмет жорстко прописаних eye offset.
- Читання IPD через OVR SDK або OpenXR.
- Реалізація UI слайдера для програмного IPD (якщо необхідно).
- Кросплатформна інтеграція (Quest, PSVR2, PC VR).
- Тестування з користувачами різних IPD.
- Документація та навчання команди.
Ми гарантуємо, що після доопрацювання ваша гра буде комфортною для користувачів з будь-яким IPD. Наші інженери мають сертифікати з Unity та Unreal Engine, а також понад 10 років досвіду у VR-розробці. Документація OVRPlugin від Oculus.
| Задача | Орієнтовні терміни |
|---|---|
| Аудит і виправлення IPD у наявному camera rig | 1 робочий день |
| Реалізація програмного IPD UI з preview | 2–4 робочих дні |
| Кросплатформний IPD layer (Quest + OpenXR + PSVR2) | 1–2 тижні |
Вартість робіт починається від 500 доларів за базовий аудит. Орієнтовна економія при впровадженні програмного IPD становить $2000 на проєкт завдяки зменшенню кількості скарг. Напишіть нам, і ми оцінимо ваш проєкт безкоштовно.






