Настройка параметров межзрачкового расстояния (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 и целевых платформ.





