Detection of anchors (.arobject scan assets) fails after reset of sceneview

Hi, I'm relatively new to Swift and ARKit, SceneKit and the likes of which you'd use for typical AR applications.

TL;DR, I have an app with a reset button that pauses the sceneView, deletes all child nodes of the root node of sceneView.scene, and re-runs my overridden version of viewWillAppear! However, after this reset, my app refuses to detect my anchors (.arobject scan assets) in the scene. Any help would be much appreciated.

I did read up on the documentation and relevant forum & SO posts and provide my code and a list of things I tried down below.

my overridden viewWillAppear

override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        

        // Models occluded by people are shown correctly

        if #available(iOS 13.0, *) {

            print("Segmentation with depth working!")

            ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth)

        } else {

            // Fallback on earlier versions

        }

        

        guard let referenceObjects = ARReferenceObject.referenceObjects(inGroupNamed: "computer", bundle: nil) else {

            fatalError("Missing expected asset catalog resources.")

        }

        configuration.detectionObjects = referenceObjects

        print(configuration.detectionObjects)



        sceneView.session.run(configuration)

    }

my custom reset function

@IBAction func reset(_ sender: UIButton!) {

        // Pause scene view

        sceneView.session.pause()

        

        // Remove button that redirects to link

        DispatchQueue.main.async {

            self.sceneView.subviews[1].isHidden = true

        }

        

        // Remove all child nodes

        sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in

            node.removeFromParentNode()

        }

        

        viewWillAppear(true)

    }

list of things I tried

  • put everything into viewWillAppear and just trigger viewWillAppear on button press
  • call the custom reset function shown above on button press
  • call overridden viewDidLoad (yes, I know this is *****, but I wanted to see if it fixed anything)

Currently, my code is using the second setup from the list above.

Accepted Reply

After anchors have been added for your detection objects, they will persist in the scene. If you want them to be re-detected, you would need to remove them first. To do so, you can change the last line of your viewWillAppear implementation to sceneView.session.run(configuration, options: .removeExistingAnchors). Also, it's not necessary to pause the session in your reset implementation - you can simply call run again on the already running session.

Replies

After anchors have been added for your detection objects, they will persist in the scene. If you want them to be re-detected, you would need to remove them first. To do so, you can change the last line of your viewWillAppear implementation to sceneView.session.run(configuration, options: .removeExistingAnchors). Also, it's not necessary to pause the session in your reset implementation - you can simply call run again on the already running session.