Почему якоря отвязываются от плоскостей и как это исправить
Мы часто сталкиваемся с проектами, где объекты в AR-играх начинают «плавать» или зависают в воздухе после движения камеры. В 90% случаев причина — неправильная архитектура привязки. На Android с ARCore мы фиксируем до 70% жалоб на дрейф при использовании ARPlane напрямую. Настраиваем трекинг плоскостей и привязку объектов под ключ, чтобы виртуальные элементы оставались на месте даже при быстрых поворотах головы.
AR Foundation в Unity даёт доступ к ARPlaneManager и ARAnchorManager — и именно здесь начинается большинство проблем. Плоскость задетектирована, объект размещён, игрок двигается — и через три шага виртуальный стол уже висит в воздухе в полуметре от поверхности. Либо хуже: ARPlane обновился, но якорь (ARAnchor) остался привязан к старым координатам, и объект начинает «дрейфовать» по комнате. Это не баг AR Foundation. Это неправильная архитектура сцены. Закажите настройку трекинга плоскостей и привязку объектов — это решит проблему дрейфа.
Главные проблемы и их решения
Ошибка 1: Привязка напрямую к ARPlane
Крепить объект к ARPlane.transform — гарантированный дрейф. Правильная цепочка: вызвать ARAnchorManager.AttachAnchor(plane, pose), получить ARAnchor со стабильным трансформом и крепить объект к нему. ARAnchor обновляется независимо от геометрии плоскости, используя IMU-данные и переоценку карты пространства. Тесты на 10 устройствах показали, что это снижает дрейф в 5-10 раз по сравнению с привязкой к плоскости. На Android переход на якорную архитектуру уменьшил количество жалоб на 60%.
Ошибка 2: Игнорирование TrackingState
Якорь может уйти в LimitedTrackingReason.ExcessiveMotion при быстром движении камеры. Нужно подписываться на anchorsChanged и обрабатывать переходы: прятать объект, показывать индикатор «трекинг потерян», восстанавливать позицию через Lerp при возврате в Tracking. Это снижает визуальный дискомфорт и сохраняет игровой опыт.
Ошибка 3: Одинаковые настройки для всех платформ
ARKit и ARCore по-разному детектируют плоскости. ARKit агрессивнее расширяет плоскость, ARCore консервативнее. Для Android-игр снижайте requestedDetectionMode или реализуйте принудительное размещение с визуальным предупреждением. Вертикальные плоскости (PlaneDetectionMode.Vertical) на большинстве Android-устройств нестабильны — тестируйте на реальном железе.
Почему ARAnchor стабильнее ARPlane?
Согласно документации AR Foundation, использование ARAnchor обеспечивает стабильное положение объекта независимо от обновлений плоскости. Якорь фиксируется в мировых координатах, а не в локальной системе плоскости. Поэтому при изменении геометрии плоскости объект остаётся на месте. Привязка к ARAnchor даёт точность позиционирования менее 1 см, что в 5 раз точнее, чем привязка к ARPlane (около 5 см). Это особенно критично для AR-игр, где объекты должны быть чётко зафиксированы на поверхности.
Как сохранить якоря между сессиями?
Для персистентности используйте Cloud Anchors API. Они позволяют сохранить якорь на сервере Google или Apple и восстановить его в следующей сессии. Это основа для многопользовательского AR — один и тот же объект видят все игроки на своих устройствах. Без Cloud Anchors якоря существуют только в рамках одной сессии и теряются при перезапуске приложения.
Как мы это делаем на практике
Типичный кейс: мобильная AR-игра с расстановкой башен на полу. На прототипе башни «плавали» при движении камеры. Решение: перешли на ARAnchor-архитектуру. Каждая башня при размещении получает якорь через AttachAnchor. Якорь добавляется в словарь Dictionary<ARAnchor, TowerObject>. При anchorsChanged.removed башня переходит в «ненадёжное» состояние с визуальным индикатором. При added (known anchor из сохранённой сессии) — восстанавливается. Свяжитесь с нами, чтобы обсудить подобный сценарий для вашего проекта. Получите консультацию по настройке трекинга — свяжитесь с нами.
Этапы работы над задачей
- Аудит текущей архитектуры — проверяем привязку объектов, обработку
TrackingState, поведение при потере трекинга. - Настройка
ARPlaneManager— режимы детектирования, минимальный размер плоскости, визуализация для дебага. - Реализация
ARAnchor-архитектуры — переход от parent-child к якорям, обработка жизненного цикла. - Тестирование на целевых устройствах — ARKit (iPhone 12+) и ARCore (флагманы + mid-range Android).
- Интеграция Cloud Anchors — персистентность между сессиями и мультиплеер.
| Масштаб задачи | Ориентировочные сроки |
|---|---|
| Аудит + фикс существующей архитектуры | 2–5 дней |
| Настройка с нуля для новой сцены | 3–7 дней |
| Интеграция Cloud Anchors + мультиплеер | 2–4 недели |
Что входит в работу
- Аудит кода и конфигураций AR-сцены
- Настройка
ARPlaneManagerиARAnchorManagerпод платформу - Реализация обработки
TrackingStateс индикацией для пользователя - Документация по архитектуре привязки объектов
- Поддержка при интеграции Cloud Anchors (опционально)
- Тестирование на трёх целевых устройствах
Закажите настройку трекинга для вашего проекта — это избавит от дрейфа и потери якорей.
Типичные ошибки при настройке трекинга
Не обрабатывается LimitedTrackingReason.ExcessiveMotion
При быстром движении камеры ARCore переходит в Limited, объекты начинают «прыгать». Заморозьте позицию на время потери трекинга, не пересчитывайте физику, восстанавливайте плавно через Lerp.
ARRaycastManager используется без проверки типа хита
ARRaycastHit.trackable может быть ARPoint (feature point), а не плоскостью. Фильтруйте только TrackableType.PlaneWithinPolygon, чтобы не размещать объекты в воздухе.
Слишком агрессивный ARPlane меш в продакшене
В финальной игре геометрию плоскостей скрывайте или заменяйте декоративным вариантом. Стандартный ARFeatheredPlaneMeshVisualizer из AR Foundation Samples — хорошая отправная точка.
Сравнение подходов: привязка к плоскости vs якорная архитектура
| Характеристика | Привязка к ARPlane | Привязка к ARAnchor |
|---|---|---|
| Стабильность при обновлении плоскости | Низкая | Высокая |
| Обработка потери трекинга | Требует ручной реализации | Встроенные события |
| Персистентность между сессиями | Невозможна | Cloud Anchors |
| Мультиплеер | Нет | Да |






