Інтеграція ARKit у iOS-додаток
ARKit 6 — це не просто накладання 3D-об'єктів на камеру. Це комбінація LiDAR-сканера, Visual Inertial Odometry та нейромережевих моделей розуміння сцени, яка при неправильному використанні дає нестабільний tracking, артефакти окклюзії та краш при ARSession у фоні.
Що найчастіше ломається
Tracking падає при поганому освітленні. ARWorldTrackingConfiguration будує карту за точками інтересу — у темних приміщеннях або на одноколірних поверхнях tracking деградує до ARCamera.TrackingState.limited(.insufficientFeatures). Ігнорувати цей стан неможна: якщо не показувати користувачеві, що потрібно освітити сцену, anchors починають дрейфувати, і 3D-об'єкт летить убік. Правильно — підписатися на session(_:cameraDidChangeTrackingState:) і показувати відповідну інструкцію.
Площини виявляються з затримкою. ARPlaneDetection.horizontal знаходить пол за 2–4 секунди при гарному освітленні. Якщо користувач намагається розмістити об'єкт раніше — промах. Частое рішення: зробити plane detection опціональним та додавати raycast проти ARMeshAnchor з LiDAR — на iPhone 12 Pro+ це дає точність попадання ~1 см без очікування.
Окклюзія працює тільки з LiDAR. ARView.environment.sceneUnderstanding.options з .occlusion працює виключно на пристроях з LiDAR (Pro-серія з iPhone 12). На iPhone без LiDAR об'єкт завжди поверх реального світу. Потрібно перевірити ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) при старті та деградувати gracefully.
Стек та підходи
Для більшості AR-завдань використовуємо RealityKit поверх ARKit — він абстрагує низькорівневий Metal-рендеринг та підтримує фізику, анімації USDZ, окклюзію. Для складних кейсів з кастомними шейдерами або інтеграцією SceneKit працюємо напрямку через ARSCNView.
Базова конфігурація сесії для розміщення об'єктів:
let config = ARWorldTrackingConfiguration()
config.planeDetection = [.horizontal, .vertical]
config.environmentTexturing = .automatic
if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
config.sceneReconstruction = .meshWithClassification
}
arView.session.run(config, options: [.resetTracking, .removeExistingAnchors])
environmentTexturing = .automatic включає захист кубічної карти оточення та застосовує її до PBR-матеріалів — об'єкти відображають реальне світло сцени.
Розміщення об'єкта по raycast (правильний сучасний спосіб, не застарілий hitTest):
let query = arView.makeRaycastQuery(
from: arView.center,
allowing: .estimatedPlane,
alignment: .horizontal
)
if let query = query,
let result = arView.session.raycast(query).first {
let anchor = ARAnchor(name: "placed-object", transform: result.worldTransform)
arView.session.add(anchor: anchor)
let modelEntity = try! ModelEntity.loadModel(named: "model.usdz")
let anchorEntity = AnchorEntity(anchor: anchor)
anchorEntity.addChild(modelEntity)
arView.scene.addAnchor(anchorEntity)
}
Робота з Image Tracking
ARImageTrackingConfiguration з maximumNumberOfTrackedImages = 4 — для маркерного AR. Завантажуємо референс-зображення з ARReferenceImage з фізичним розміром:
let referenceImage = ARReferenceImage(
cgImage,
orientation: .up,
physicalWidth: 0.15 // 15 см у реальному світі
)
config.trackingImages = [referenceImage]
physicalWidth критичний — ARKit використовує його для обчислення дистанції та масштабу. Неверний розмір = об'єкт висить не там де потрібно.
Face Tracking та TrueDepth
ARFaceTrackingConfiguration працює тільки на пристроях з TrueDepth-камерою (Face ID). Доступно 52 коефіцієнта blend shape через ARFaceAnchor.blendShapes — від .jawOpen до .eyeBlinkLeft. На цьому будуємо віртуальні примерки, AR-аватари та Liveness Detection.
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor else { return }
let jawOpen = faceAnchor.blendShapes[.jawOpen]?.floatValue ?? 0
// Керуємо анімацією персонажа
}
Продуктивність та профілювання
ARKit + RealityKit навантажують GPU та CPU одночасно. Інструменти діагностики: Xcode's Reality Composer Pro для превью сцени, GPU Frame Capture для аналізу draw calls, Metal System Trace в Instruments для діагностики GPU bubbles.
Типові вузькі місця:
- USDZ з > 100K полігонів на середнячку — просадка до 30 FPS
- Кілька
ModelEntityбез інстансингу копіюють геометрію в пам'ять -
arView.renderOptions— вимкнення.disableDepthOfFieldта.disableMotionBlurдає +15% FPS на старих пристроях
Етапи розробки
Аудит вимог: які пристрої підтримувати, потрібен LiDAR, тип tracking (world/image/face/body). Проектування деградації на несумісних пристроях. Розробка AR-ядра з сесією та плейсментом. Інтеграція 3D-контенту (конвертація з FBX/OBJ у USDZ через Reality Converter). Тестування на фізичних пристроях — симулятор AR не підтримує. Оптимізація продуктивності під цільові моделі iPhone/iPad.
Терміни
Базова інтеграція ARKit з розміщенням USDZ-об'єкта по площині: 3–5 днів. Image tracking з маркерами та накладанням контенту: 4–7 днів. Комплексне рішення з face tracking, LiDAR occlusion та кастомними Metal-шейдерами: 3–6 тижнів. Вартість залежить від складності 3D-контенту та вимог до підтримуваних пристроїв.







