Tracking Multiple Instances of the Same Object on the Apple Vision Pro

Hello everyone,

I'm currently working through this example project Exploring object tracking with ARKit to learn how to use Object Tracking with visionOS.

I was able to modify the example project to overlay a different model onto the detected object. However, with the example code, I'm only able to track 1 instance of the trained object at a time. I'm wondering if there is a way to track multiple instances of 1 object?

For example, I have a usdz model of a box, then trained that box for object tracking, I'm able to overlay a model of a chair over that box once it's detected. But now, I have multiple copies of that same box, and I want to arrange them so that when I wear the Vision Pro, I can see the chairs arranged however I want.

I'm still new to visionOS development, so I'm not sure if there's a way to accomplish that by just training 1 object and having copies of it.

If it helps, this is my current modification to overlay a virtual object ontop of a detected object.

    func loadReferenceObjects() async -> [ReferenceObject] {
        // Get a list of all reference object files in the app's main bundle and attempt to load each.
        var referenceObjectFiles: [String] = []
        if let resourcesPath = Bundle.main.resourcePath {
            print("resource path: \(resourcesPath)")
            try? referenceObjectFiles = FileManager.default.contentsOfDirectory(atPath: resourcesPath).filter { $0.hasSuffix(".referenceobject") }
        }
        
        
        await withTaskGroup(of: Void.self) { group in
            for file in referenceObjectFiles {
                let objectURL = Bundle.main.bundleURL.appending(path: file)
                
                
                group.addTask {
                    // get the file name
                    let fileNameWithoutExtension = (file as NSString).deletingPathExtension
                    
                    // load each ref objs as task
                    await self.loadSingleReferenceObject(url: objectURL, fileName: fileNameWithoutExtension)
                }
            }
        }
        
        return self.referenceObjects
    }
    
    // Private helper method to load a single object
    // and assign entity to it.
    private func loadSingleReferenceObject(url: URL, fileName: String) async {
        var referenceObject: ReferenceObject
        
        do {
            print("Loading reference object from \(url)")
            // Load the file as a `ReferenceObject` - this can take a while for larger objects.
            try await referenceObject = ReferenceObject(from: url)
        } catch {
            fatalError("Failed to load reference object with error \(error)")
        }
        
        // add the ref obj to the ref objs array
        self.referenceObjects.append(referenceObject)
        
        // entity with each file
        var model: Entity = Entity()
        
        // add entity according to the file name
        switch fileName {
        // Box1 ref obj binds with Chair1
        case "Box1":
            // try to load the model
            do {
                try await model = Entity(named: "chair1", in: realityKitContentBundle)
            } catch {
                print("Failed to load chair1")
            }
            
        // Box2 ref obj binds with Chair2
        case "Box2":
            // try to load the model
            do {
                try await model = Entity(named: "chair2", in: realityKitContentBundle)
            } catch {
                print("Failed to load chair2")
            }
            
            
        default:
            print("no model associated with this file name: \(fileName)")
            break
        }
        
        // map entity to ref objs
        usdzPerReferenceObject[referenceObject.id] = model
    }

Any help or suggestions would be greatly appreciated.

Thank you.

Answered by Vision Pro Engineer in 814760022

Hi @yun531

Tracking more than one instance of an object is possible, but requires the Object-tracking parameter adjustment entitlement which is part of enterprise apis for visionOS. After that entitlement is configured, you can use ObjectTrackingProvider.TrackingConfiguration.maximumTrackableInstances to increase the total number of object instances that you can track at the same time.

For more information on enterprise apis for visionOS, including how to apply for this entitlement, see Building spatial experiences for business apps with enterprise APIs for visionOS.

How about to try:

  • Web Demo:

https://developers.curvsurf.com/WebDemo/

  • iOS app (iPhone Pro, iPad Pro):

https://github.com/CurvSurf/FindSurface-iOS

  • visionOS app (Vision Pro):

https://github.com/CurvSurf/FindSurface-visionOS

Accepted Answer

Hi @yun531

Tracking more than one instance of an object is possible, but requires the Object-tracking parameter adjustment entitlement which is part of enterprise apis for visionOS. After that entitlement is configured, you can use ObjectTrackingProvider.TrackingConfiguration.maximumTrackableInstances to increase the total number of object instances that you can track at the same time.

For more information on enterprise apis for visionOS, including how to apply for this entitlement, see Building spatial experiences for business apps with enterprise APIs for visionOS.

Tracking Multiple Instances of the Same Object on the Apple Vision Pro
 
 
Q