Search code examples
iosxcodeaugmented-realityarkitrealitykit

How to change the reference anchor Image dynamically in RealityKit


I want to use an image load from the network as an anchor to attach my object in the real world.

However, I found that reality kit only provides using the image in the asset folder as an anchor, which seems can't be added by code.

AnchorEntity(.image(group: "", name: ""))

So is there a possible way for ARKit to do such things?


Solution

  • I found a way to load ARreferenceImage in the code:

    //create a CIImage
    let image = UIImage(named: "refimage.jpg",
                                            in: Bundle(for: type(of:self)),
                                            compatibleWith: nil)
            let ciimage = CIImage(image: image!)
            let cgimage = convertCIImageToCGImage(inputImage: ciimage!)!
            let arReference = ARReferenceImage(cgimage, orientation: .up, physicalWidth: 0.05)
    //add this image into ARReferenceImage<Set>
            refImage.insert(arReference)
    //add this set to the ARView Tracking Config
            let config = ARImageTrackingConfiguration()
            config.trackingImages = refImage
    //run the config
            arView.session.run(config)
    

    Then you can get notified when the system detects the image in your ARSessionDelegate

     func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
            for i in anchors{
                if let a = i as? ARImageAnchor{
                    DispatchQueue.main.async {
                        print("find anchor")
                        let imageAnchor = AnchorEntity(anchor: a)
                        self.boxEntity = ModelEntity(mesh: MeshResource.generateBox(size: 0.005),materials: [SimpleMaterial(color: .green, isMetallic: true)])
                        imageAnchor.addChild(self.boxEntity)
                        self.arView.scene.addAnchor(imageAnchor)
                    }
                }
            }
        }