Как включить постоянство / отслеживание объекта с помощью ARKit?

Я создал сверхпростое приложение AR в Swift (расширяя шаблон) для отображения 3D-моделей на привязках изображений. Но когда привязка изображения выходит за пределы кадра, прикрепленные модели исчезают - они перезагружаются при следующем обнаружении привязки.

Было бы намного лучше, если бы модели сохранялись, пока пользователи перемещаются вокруг. Как я могу включить постоянство объекта?

Мой код:

import UIKit
import RealityKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Load scenes 
        let OneAnchor = try! One.loadFace()
        let TwoAnchor = try! Two.loadFace()
        let ThreeAnchor = try! Three.loadFace()
        let FourAnchor = try! Four.loadFace()

        // Add anchors
        arView.scene.anchors.append(OneAnchor)
        arView.scene.anchors.append(TwoAnchor)
        arView.scene.anchors.append(ThreeAnchor)
        arView.scene.anchors.append(FourAnchor)
    }
}

person D_C_E    schedule 15.11.2019    source источник


Ответы (1)


Для сохранения необходимо использовать класс ARWorldTrackingConfiguration со свойством экземпляра .detectionImages вместо класс ARImageTrackingConfiguration.

Вот что говорится в официальной документации:

ARWorldTrackingConfiguration может создавать эффект присутствия в дополненной реальности: виртуальный объект может оставаться в одном и том же месте относительно реального мира, даже если пользователь наклоняет устройство, чтобы смотреть выше или ниже объекта, или перемещает устройство, чтобы увидеть стороны объекта и назад.

Ваш код внутри viewWillAppear(animated) метода жизненного цикла может выглядеть так:

label.text = "Track your environment"

guard let refImages = ARReferenceImage.referenceImages(inGroupNamed: "Pictures", 
                                                             bundle: nil)
else { 
    return 
}

let config = ARWorldTrackingConfiguration()
config.detectionImages = refImages
config.maximumNumberOfTrackedImages = 4

let options = [ARSession.RunOptions.removeExistingAnchors,
               ARSession.RunOptions.resetTracking]

arView.session.run(config, options: ARSession.RunOptions(options))
person Andy Fedoroff    schedule 16.11.2019