Разработка приложений для дополненной реальности: грязь, баги и свет в конце камеры

от автора

Дополненная реальность давно вышла за пределы хайповых заголовков. Она превратилась в рабочий инструмент, который всё чаще мелькает в мобильных приложениях, играх, логистике и даже образовании. В этой статье — разбор инструментов, подводных камней и немного личных слёз, пролитых над 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-модель идеально вписалась в комнату пользователя — поверьте, оно того стоило.


ссылка на оригинал статьи https://habr.com/ru/articles/896680/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *