Налаштування параметрів міжзрачкового розстояння (IPD) у коді ігр
IPD—розстояння між центрами зрачків, в середньому 63–65 мм у дорослих, реальний діапазон від 54 до 74 мм. VR-гарнітура, не враховуючи IPD конкретного користувача, дає розмите зображення, подвоєння, головний біль уже через 15–20 хвилин. Налаштування IPD—не опціональна фіча, а базова вимога до VR-додатку.
Як 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
Для 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 у користувацькому інтерфейсі
Для PSVR2 та інших гарнітур з програмним IPD—потрібен екран налаштування в додатку. Стандартний UX: горизонтальний слайдер від 54 до 74 мм з кроком 1 мм, preview у реальному часі. Застосовується через vendor-специфічний API—для PSVR2 це Unity PS VR2 Plugin з VRSamples.IPDInterop.
Тест IPD: на екрані налаштування показуються дві вертикальні лінії або кресли—одна для лівого ока, одна для правого. При правильному IPD лінії сприймаються як одна. Це стандартна техніка, використовувана самими виробниками гарнітур.
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 у існуючому camera rig | 1 робочий день |
| Реалізація програмного IPD UI з preview | 2–4 робочих дня |
| Кросс-платформенний IPD layer (Quest + OpenXR + PSVR2) | 1–2 тижні |
Вартість визначається після аналізу поточного стану camera rig та цільових платформ.





