Настройка параметров межзрачкового расстояния (IPD) в коде игр
В нашей практике мы не раз видели проекты, где после первых же тестов пользователи жаловались на головную боль и размытость картинки. Причина — игнорирование межзрачкового расстояния (IPD). IPD — расстояние между центрами зрачков, в среднем 63–65 мм у взрослых, но реальный диапазон от 54 до 74 мм. 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
| Параметр | Механический IPD | Программный IPD |
|---|---|---|
| Точность регулировки | 1-3 мм | 0.1 мм |
| Поддержка во время сессии | Фиксирован | Динамический |
| Необходимость UI | Нет | Да |
| Стоимость реализации | Встроен в гарнитуру | Требует разработки |
Что входит в работу по настройке IPD
- Аудит текущего camera rig на предмет жёстко прописанных eye offset.
- Чтение IPD через OVR SDK или OpenXR.
- Реализация UI слайдера для программного IPD (если необходимо).
- Кросс-платформенная интеграция (Quest, PSVR2, PC VR).
- Тестирование с пользователями разных IPD.
- Документация и обучение команды.
Мы гарантируем, что после доработки ваша игра будет комфортна для пользователей с любым IPD. Наши инженеры имеют сертификаты по Unity и Unreal Engine, а также более 10 лет опыта в VR-разработке. См. документацию Unity OVRPlugin.
| Задача | Ориентировочные сроки |
|---|---|
| Аудит и исправление IPD в существующем camera rig | 1 рабочий день |
| Реализация программного IPD UI с preview | 2–4 рабочих дня |
| Кросс-платформенный IPD layer (Quest + OpenXR + PSVR2) | 1–2 недели |
Стоимость рассчитывается индивидуально после анализа текущего состояния camera rig и целевых платформ. Свяжитесь с нами для получения консультации по вашему проекту. Закажите доработку IPD и обеспечьте комфорт вашим пользователям.






