Реалізація Cloud Anchors для мультипользовательського AR
Два iPhone в одній кімнаті. Користувач A ставить AR-об'єкт на стіл. Користувач B бачить той самий об'єкт на тому ж столі, в тій ж позиції — в реальному часі. Без QR-кодів, без маркерів, без попередньої калібровки.
Це Cloud Anchors — технологія, де анкор створюється локально, завантажується в облако, а інші пристрої завантажують його та локалізуються відносно нього.
Два шляхи: ARCore та ARKit
Google ARCore Geospatial API та Cloud Anchors — крос-платформене рішення. Працює на iOS через ARCore SDK для iOS та на Android нативно. Анкори зберігаються на серверах Google, живуть від 1 дня до 365 днів залежно від настроєк.
Створення анкора:
// iOS, ARCore SDK
let anchor = garSession.createAnchor(at: transform)
garSession.hostCloudAnchor(anchor, ttlDays: 30) { cloudAnchorId, error in
// cloudAnchorId — строка, відправляємо іншим учасникам через свій backend
}
Розрізнення анкора на іншому пристрої:
garSession.resolveCloudAnchor(cloudAnchorId) { anchor, error in
// anchor.transform — позиція в світовому просторі цього пристрою
}
Apple Shared AR через ARKit + MultipeerConnectivity — працює тільки між Apple-пристроями, без зовнішнього сервера. Пристрої обмінюються ARWorldMap напрямку через локальну мережу. Обмеження: потрібен один "хост", який зберігає карту та розповсюджує учасникам.
Для production-додатків з крос-платформою — ARCore Cloud Anchors. Для Apple-only та офлайн-сценаріїв — MultipeerConnectivity.
Головні проблеми мультипользовательського AR
Синхронізація стану сцени. Cloud Anchor дає спільну систему координат. Але дані про те, хто що розмістив, куди переміщував, що видалив — це ваш шар. Потрібен realtime-канал: Firebase Realtime Database, Supabase Realtime, або власний WebSocket. Типова схема: подія objectPlaced(anchorId, modelId, transform) → broadcast всім учасникам → кожен застосовує локально.
Дрейф між пристроями. Два iPhone локалізуються відносно Cloud Anchor незалежно. Помилка позиціонування — 1–5 см при хорошому освітленні. При поганому освітленні або слабкій текстурованості поверхонь — до 10–15 см. Для ігор прийнятно. Для промисловості (розмітка обладнання, збірка) — ні.
Час розрізнення анкора. resolveCloudAnchor може займати 2–10 секунд, поки пристрій не зібере достатньо feature points для збігу з хмарним анкором. Показуємо GARCloudAnchorState.taskInProgress протягом цього часу, не дозволяємо користувачу взаємодіяти зі сценою.
Ліміти API. Google Cloud Anchors: 1000 безплатних resolve-операцій на день, потім платно. При активній аудиторії цей ліміт досягається швидко — потрібно рахувати заздалегідь.
Архітектура крос-платформенного AR-мультиплеєра
Пристрій A (iOS/Android)
→ створює Cloud Anchor → отримує cloudAnchorId
→ відправляє cloudAnchorId на backend (REST/WebSocket)
Backend (Firebase / власний сервер)
→ зберігає cloudAnchorId + метадані сесії
→ розповсюджує подій учасникам
Пристрій B (iOS/Android)
→ отримує cloudAnchorId
→ resolveCloudAnchor → будує спільну систему координат
→ отримує подій → застосовує зміни локально
Кейс: AR-квест у торговому центрі, 8 одночасних учасників. ARCore Cloud Anchors на точках інтересу (вхід, відділ, каса). Кожен якорь — завдання з віртуальним об'єктом. Синхронізація через Firebase Realtime Database: подія "гравець X знайшов об'єкт Y" → об'єкт зникає у всіх. Затримка між подією та оновленням у всіх учасників — 150–300 мс через LTE.
Що входить у роботу
- Інтеграція ARCore SDK для iOS або настройка MultipeerConnectivity для Apple-only
- Створення та розрізнення Cloud Anchors з обробкою помилок та таймаутів
- Реалізація realtime-синхронізації стану сцени
- UI для статусів: очікування учасників, розрізнення анкора, десинхронізація
- Тестування з реальними пристроями в умовах різного освітлення
Сроки
| Сценарій | Сроки |
|---|---|
| Apple-only через MultipeerConnectivity | 2–3 тижні |
| Крос-платформа через ARCore Cloud Anchors | 4–6 тижнів |
| Повнофункціональний AR-мультиплеєр з синхронізацією стану | 6–10 тижнів |
Вартість розраховується індивідуально після обговорення архітектури та цільової аудиторії.







