Розроблення мобільного VR-додатку (Google Cardboard)
Google Cardboard — найдемократичніший шлях у VR: картонний корпус за кілька доларів, смартфон усередині. Для розробника це означає: стереоскопічний рендеринг, трекинг голови через IMU, і жорсткі обмеження продуктивності — все це на звичайному мобільному залізо без спеціалізованого VR-процесора.
Google Cardboard SDK
Після того як Google відкрив вихідні коди Cardboard SDK у 2021 році, він став офіційним шляхом для Cardboard-додатків на iOS та Android. SDK забезпечує:
- Корекцію спотворення лінз (кожний корпус має свій lens distortion profile, відсканований QR-кодом)
- Head tracking через IMU fusion (дані акселерометра та гіроскопа)
- Eye matrices для правильної проекції на кожний глаз
- Обробку trigger button (магнітна кнопка в картонному Cardboard)
Інтеграція Unity — пакет UPM com.google.cardboard. Після підключення:
// CardboardHeadTracker читається через Cardboard.SDK
void Update() {
Cardboard.SDK.UpdateScreenParams();
// Позиція/ротація голови застосовується автоматично через CardboardCamera компонент
}
Нативна інтеграція Android через CardboardHeadTracker та CardboardLensDistortion:
// Ініціалізація
headTracker = CardboardHeadTracker.create();
lensDistortion = CardboardLensDistortion.create(encodedDeviceParams, width, height);
// У render loop
headTracker.getPose(monotonic_time_nanos, target_time_nanos, outEyeFromHead);
Стереоскопічний рендеринг: split-screen
Екран ділиться пополам. Ліва половина — для лівого ока, права — для правого ока. Кожна половина рендерится з невеликим зміщенням камери (IPD — міжзрачкова відстань, ~63–65mm). Різниця між двома зображеннями створює стереоефект.
У Unity це керується через компонент CardboardCamera з двома рендер-текстурами. Кожна текстура рендерится окремо, потім застосовується корекція barrel distortion.
Критична проблема продуктивності: two-pass rendering подвоює навантаження на GPU. На середньому смартфоні 2020 року при 1080p це 30–40 FPS без оптимізацій. Рішення:
- Foveated rendering — зменшення розрізнювальної здатності по краях екрана (не центральна область видна через лінзи)
- Single Pass Instanced Rendering у Unity (рендеринг обох очей за один draw call)
- Зменшення розрізнювальної здатності рендер-текстур до 0,7–0,8 від екранної
Head tracking та Motion Sickness
Motion sickness виникає, коли visual latency > 20ms. IMU працює на 200–1000Hz, але рендеринг на 60Hz. Для компенсації використовуйте ATW (Asynchronous TimeWarp) — перепроекціонування останнього кадру з урахуванням нової орієнтації голови між рендером та виводом на екран.
У Cardboard SDK ATW реалізований автоматично через додатковий compositing-pass. Переконайтеся, що Cardboard.SDK.UpdateScreenParams() викликається на початку Update(), а не рідше.
Рекомендації щодо Scene Design для зменшення укачування:
- Немає acceleration-based locomotion (телепортація переважна)
- Постійний горизонт або cockpit-reference (кабіна, інтер'єр) зменшує дискомфорт
- Не масштабуйте світ щодо гравця в runtime
Ввід: кнопка та Gaze
У базового Cardboard одна кнопка. Вся взаємодія будується на:
- Gaze input — курсор слідує за взглядом, активація за фіксацією взгляду (dwell time, зазвичай 1,5–2 сек)
- Trigger button — підтвердження вибору, телепортація
Gaze reticle (курсор) рендерится у world space на фіксованій відстані від камери. Raycast з центру кожного ока визначає об'єкт під курсором:
// Unity: Gaze Raycaster
void Update() {
Ray ray = new Ray(Camera.main.transform.position,
Camera.main.transform.forward);
if (Physics.Raycast(ray, out RaycastHit hit, maxDistance, interactableLayer)) {
gazeTarget = hit.collider.GetComponent<IGazeable>();
gazeTarget?.OnGazeEnter();
gazeTimer += Time.deltaTime;
if (gazeTimer >= DWELL_TIME) {
gazeTarget?.OnGazeActivate();
gazeTimer = 0f;
}
} else {
gazeTarget?.OnGazeExit();
gazeTimer = 0f;
gazeTarget = null;
}
}
QR-сканування профілю пристрою
При першому запуску користувач сканує QR-код з корпуса Cardboard. SDK завантажує lens distortion profile для конкретного корпуса. Без цього кроку спотворення некоректне — зображення виглядає деформованим.
Cardboard SDK зберігає профіль у SharedPreferences / NSUserDefaults після сканування. Додайте на перший екран інструкцію з іконкою QR та явну кнопку "повторно відсканувати пристрій" у налаштуваннях.
Робочий процес
Визначте тип додатку: пасивний досвід (360 відео, тур) або інтерактивний (гра, навчання).
Налаштуйте Cardboard SDK: пакет Unity або нативна інтеграція, конфігурація проекції.
Розроблюйте сцену з урахуванням VR-обмежень: без acceleration locomotion, з gaze input.
Оптимізуйте продуктивність: Single Pass Instanced, foveated rendering, LOD.
Тестуйте на пристроях різних цінових сегментів, оцініть комфорт.
Оцінка часу
Простий пасивний VR-досвід (360 контент, базова навігація взглядом) — 1–2 тижні. Інтерактивний VR-додаток з ігровою механікою, кількома сценами, повним UI — 2–3 місяці.







