Разработка приложений для дополненной реальности: грязь, баги и свет в конце камеры
Дополненная реальность давно вышла за пределы хайповых заголовков. Она превратилась в рабочий инструмент, который всё чаще мелькает в мобильных приложениях, играх, логистике и даже образовании. В этой статье — разбор инструментов, подводных камней и немного личных слёз, пролитых над SDK.

Если вы когда-нибудь пытались разработать что-то в дополненной реальности, то, скорее всего, сначала всё казалось простым и волшебным — а потом начался тот самый ад из размытых плоскостей, прыгающих объектов и SDK, которые внезапно перестают видеть камеру.
Писать про AR легко — достаточно накидать пару ссылок на ARKit и Unity, и готово. А вот сделать что-то действительно рабочее — тут нужен танец с бубном, багрепорты в 3 часа ночи и здравый скепсис к любой документации. Попробуем пройти этот путь чуть-чуть осмысленнее.
Инструменты, с которыми можно жить
1. Unity + AR Foundation
Это как мультиинструмент для AR-разработчика. Он позволяет писать кроссплатформенный код для iOS и Android, используя ARKit и ARCore под капотом.
// C# — Unity, AR Foundation
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class PlaceObjectOnPlane : MonoBehaviour
{
public GameObject objectToPlace;
private ARRaycastManager raycastManager;
private GameObject spawnedObject;
void Start()
{
raycastManager = GetComponent<ARRaycastManager>();
}
void Update()
{
if (Input.touchCount == 0) return;
var touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
var hits = new List<ARRaycastHit>();
if (raycastManager.Raycast(touch.position, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
{
var hitPose = hits[0].pose;
if (spawnedObject == null)
spawnedObject = Instantiate(objectToPlace, hitPose.position, hitPose.rotation);
else
spawnedObject.transform.position = hitPose.position;
}
}
}
}
На бумаге всё просто. На практике — устройство не определяет плоскости, если света в комнате меньше, чем в офисе Google, а сам Unity может внезапно "забыть" про ARKit, если сборка шла под Android.
2. ARKit (iOS only)
Нативный SDK от Apple, работает отлично, если ваш пользователь — владелец iPhone 12+. Поддерживает SLAM, Face Tracking, Occlusion и даже совместную работу с LiDAR.
// Swift, ARKit
import ARKit
class ARViewController: UIViewController, ARSCNViewDelegate {
@IBOutlet var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.session.run(ARWorldTrackingConfiguration())
}
}
Но стоит помнить: ARKit — штука привередливая. Как только вы вылезаете за пределы "вставить кубик в сцену", нужно знать про world alignment, anchors, light estimation и ещё кучу мелких деталей, которые неочевидны из документации.
3. ARCore (Android only)
Аналог ARKit от Google. Работает нормально, но любит «отваливаться» на устройствах с кастомной прошивкой. Поддерживает примерно то же, но с задержкой на релиз новых фич.
// Kotlin, ARCore + Sceneform
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fragment = supportFragmentManager.findFragmentById(R.id.ux_fragment) as ArFragment
fragment.setOnTapArPlaneListener { hitResult, _, _ ->
val anchor = hitResult.createAnchor()
val model = ModelRenderable.builder()
.setSource(this, R.raw.model)
.build()
.get()
val anchorNode = AnchorNode(anchor)
anchorNode.renderable = model
fragment.arSceneView.scene.addChild(anchorNode)
}
}
Часто неочевидные подводные камни
SLAM и стабильность сцены. Даже в самых крутых SDK объекты со временем могут "плыть". Это физика, оптика и невозможность 100% трекинга в реальном времени.
Освещение. AR плохо дружит с темнотой. Если света мало, плоскости не распознаются, трекинг сбивается, и вообще всё ломается.
Калибровка камеры. Особенно на Android — где один и тот же телефон может иметь 3 разные камеры с разными API.
Vuforia, WebAR и прочие звери
Если хочется поддержки маркеров, интеграции с OpenCV, или AR через браузер — стоит посмотреть на:
Vuforia — отличный вариант для marker-based AR. Правда, бесплатная версия сильно ограничена.
WebAR — решение через WebXR API. Работает нестабильно и сильно зависит от браузера. Но зато — никакого App Store.
Где пригодится AR в реальности?
Навигация в помещениях. Google уже использует это в Google Maps внутри аэропортов.
Обучение и медицина. Виртуальные анатомические модели, обучающие стенды.
Ритейл. Примерка мебели, очков, одежды.
Игры. Ну конечно. Кто не слышал про Pokémon GO?
Заключение
AR — это не магия. Это череда компромиссов между UX, железом, SDK и нервами разработчика. Но если однажды вы увидите, как ваша 3D-модель идеально вписалась в комнату пользователя — поверьте, оно того стоило.