Налаштування IPD у коді VR-ігор: програмна підтримка

Налаштування параметрів міжзіничної відстані (IPD) у коді ігор У нашій практиці ми не раз бачили проєкти, де після перших же тестів користувачі скаржилися на головний біль і розмитість картинки. Причина — ігнорування міжзіничної відстані (IPD). IPD — відстань між центрами зіниць, в середньому 63–

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1504
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1006
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    635
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    716
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    95

Налаштування параметрів міжзіничної відстані (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 під ключ. Ось покроковий план:

  1. Аудит поточного camera rig на предмет жорстко прописаних eye offset.
  2. Читання IPD через OVR SDK або OpenXR.
  3. Реалізація UI слайдера для програмного IPD (якщо необхідно).
  4. Кросплатформна інтеграція (Quest, PSVR2, PC VR).
  5. Тестування з користувачами різних IPD.
  6. Документація та навчання команди.

Ми гарантуємо, що після доопрацювання ваша гра буде комфортною для користувачів з будь-яким 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 на проєкт завдяки зменшенню кількості скарг. Напишіть нам, і ми оцінимо ваш проєкт безкоштовно.