How to export Reality Entity to a USDZ file

I found that the app AirDraw can export users' draw scenes to a USDZ file. So how can I implement this function using RealityKit?

Answered by Vision Pro Engineer in 792976022

I don't know of an easy way to save an entity as a usd file using swift, but that doesn't mean there isn't one. I'll do some digging and reply if I find anything.

It is possible to save an entity as a .reality file. If your goal is to allow users to save and load an entity in your application (or another application capable of displaying a .reality file), consider using Entity.write(to:) to save the entity as a .reality file. A .reality file can be loaded as an Entity. Here's a snippet that creates a cube, rotates it, saves it, loads it into a new entity and adds it to the scene.

RealityView { content in
    // create a cube, rotate it 45 degrees and add it to the scene
    let cube = ModelEntity(mesh: .generateBox(size: 0.2), materials: [SimpleMaterial(color: .red, isMetallic: true)])
    cube.transform.rotation = simd_quatf(angle: .pi/3, axis: [0, 1, 0])
    cube.position = [-0.2, 1.4, -1.2]
    content.add(cube)
    
    // save the file to a temp directory then read it back as an entity.
    let fileURL = URL(fileURLWithPath: "cube.reality", relativeTo: FileManager.default.temporaryDirectory)
    
    do {
        try await cube.write(to: fileURL)
        let cubeFromFile = try await Entity(contentsOf: fileURL)
        cubeFromFile.position = [0.2, 1.4, -1.2]
        
        // add the saved entity to the screen
        content.add(cubeFromFile)
    }
    catch {
        // TODO: handle the error
        print("Error while saving/loading", error)
    }
}
Accepted Answer

I don't know of an easy way to save an entity as a usd file using swift, but that doesn't mean there isn't one. I'll do some digging and reply if I find anything.

It is possible to save an entity as a .reality file. If your goal is to allow users to save and load an entity in your application (or another application capable of displaying a .reality file), consider using Entity.write(to:) to save the entity as a .reality file. A .reality file can be loaded as an Entity. Here's a snippet that creates a cube, rotates it, saves it, loads it into a new entity and adds it to the scene.

RealityView { content in
    // create a cube, rotate it 45 degrees and add it to the scene
    let cube = ModelEntity(mesh: .generateBox(size: 0.2), materials: [SimpleMaterial(color: .red, isMetallic: true)])
    cube.transform.rotation = simd_quatf(angle: .pi/3, axis: [0, 1, 0])
    cube.position = [-0.2, 1.4, -1.2]
    content.add(cube)
    
    // save the file to a temp directory then read it back as an entity.
    let fileURL = URL(fileURLWithPath: "cube.reality", relativeTo: FileManager.default.temporaryDirectory)
    
    do {
        try await cube.write(to: fileURL)
        let cubeFromFile = try await Entity(contentsOf: fileURL)
        cubeFromFile.position = [0.2, 1.4, -1.2]
        
        // add the saved entity to the screen
        content.add(cubeFromFile)
    }
    catch {
        // TODO: handle the error
        print("Error while saving/loading", error)
    }
}
How to export Reality Entity to a USDZ file
 
 
Q