Реалізація AR-сканування площин в мобільному додатку
Plane detection — фундамент більшості AR-сценаріїв: розстановка меблів, вимірювання, навігація по етажах. Без стабільного визначення площин AR-об'єкт «плаває» та не сприймається користувачем як реальний. Реалізувати базовий detection площини просто, але довести до ощущення «стоїт як настоящее» — вже нелегко.
Платформенні API та їх реальні обмеження
ARKit (iOS). ARWorldTrackingConfiguration з planeDetection: [.horizontal, .vertical]. ARKit повертає ARPlaneAnchor з ARPlaneGeometry — меш площини, який оновлюється по мере сканування. Проблема: на перших секундах ARKit повертає маленький прямокутник, який агресивно змінює розмір та орієнтацію. Якщо розмістити об'єкт відразу — він «прострибне» при наступному оновленню.
Рішення — мінімальний confidence threshold та debounce на оновлення. ARPlaneAnchor не має явного поля confidence, але розмір площини (extent) служить косвеним показником зрілості: не показувати UI для розміщення, поки extent.x < 0.3 та extent.z < 0.3 метра.
ARCore (Android). Plane з TrackingState.TRACKING та PlaneType.HORIZONTAL_UPWARD_FACING / VERTICAL. ARCore додатково надає Plane.getSubsumedBy() — коли дві площини зливаються в одну. Це ломает логіку, якщо якорі були привязані до исходных площин — потрібно переносити Anchor на subsuming plane.
Vertical planes. ARKit стабільно визначає вертикальні площини на текстурованих поверхнях (стіна з шпалерами — добре, монотонна біла стіна — погано). ARCore з vertical detection працює ще менш впевнено. Для продуктів, де критична навіска на стіну (картини, полиці), краще комбінувати plane detection + LiDAR (iPhone 12 Pro+) для добудови недостаючої геометрії.
LiDAR та його вплив на якість сканування
На пристроях з LiDAR (iPhone 12 Pro, 13 Pro, 14 Pro, 15 Pro, iPad Pro) ARKit будує dense меш оточення через ARMeshAnchor. Plane detection з LiDAR працює принципово інакше: площини виводяться з mesh, а не з візуального SLAM. Це дає:
- Детектування площини за 1-2 секунди замість 5-10
- Стабільні границі навіть на монотонних поверхнях
- Коректне визначення сходинок, пандусів, нахилених площин
Для додатків, де LiDAR-пристрої — основна ЦА (професійна зйомка, ремонт, будівництво), переключення між ARWorldTrackingConfiguration та конфігурацією з sceneReconstruction: .mesh дає якісний стрибок.
Візуалізація прогресу сканування
Користувач не знає, що потрібно «поводити» камерою — потрібна чітка підказка. Типові паттерни:
- Анімований сканюючий промінь з нижної частини екрана
- Outline площини, який «зростає» по мере виявлення
- Текстова інструкція з автоскриттям після першого успішного detection
Для відрисовки границ площини в RealityKit — ModelEntity з wireframe матеріалом, привязаний до PlaneAnchor. В SceneKit — SCNNode з SCNGeometry з ARPlaneGeometry.boundaryVertices. В ARCore Scenekit/Filament — власний меш з Plane.getPolygon().
Типові проблеми в production
Площина «ломається» при сильному русі камери — tracking state переходить в LIMITED(.excessiveMotion). Потрібно блокувати розміщення об'єктів та показувати попередження, а не крашитися.
На темних поверхнях (темний ламінат, чорний килим) ARKit та ARCore втрачають features для візуального SLAM. Попередження через ARCamera.TrackingState.Reason.insufficientFeatures — обов'язково обробляти та повідомляти користувачеві.
Терміни
Реалізація базового plane detection з візуальною підказкою та розміщенням об'єкта — 5-8 днів. Доробка під LiDAR, multi-plane selection, збереженням ARWorldMap — ще 5-7 днів. Вартість залежить від цільових пристроїв та складності візуальної частини.







