How to get the name of the tracked image in Swift with RealityKit?

Viewed 145

I have multiple AR Reference images and I want to know which one I am currently tracking. How can I do that? Here is my code:

let configuration = ARImageTrackingConfiguration()

guard let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "Photos", bundle: Bundle.main) else {
      print("No images available")
      return
  }
    
  configuration.trackingImages = trackedImages
  configuration.maximumNumberOfTrackedImages = 1
  sceneView.session.run(configuration)
2 Answers

You'll want to use the renderer(_:didAdd:for:) method. When your app detects an image it recognizes it will add an anchor. You can pull the name of that image from your asset catalogue.

Add this to your ARSCNViewDelegate class:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let imageAnchor = anchor as? ARImageAnchor else { return }
    let image = imageAnchor.referenceImage
    // this is one means of getting the name of the image
    if let trackedImage = image.name {
        print(trackedImage)
    }
}

If you need RealityKit's solution, not SceneKit's one, use the following code:

import ARKit
import RealityKit

extension ViewController: ARSessionDelegate {
    
    func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        
        guard let imageAnchor = anchors.first as? ARImageAnchor,
              let name = imageAnchor.referenceImage.name
        else { return }

        print(name)
        
        let entity = ModelEntity(mesh: .generateSphere(radius: 0.05))
        let anchor = AnchorEntity(anchor: imageAnchor)
        
        anchor.addChild(entity)
        arView.scene.anchors.append(anchor)
    }
}

Don't forget implement session delegate:

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        arView.session.delegate = self
    }
}
Related