Chirag Joshi
Chirag Joshi

Reputation: 29

LiDAR | Swift | How to Export real texture 3d model using LiDAR Scanner

How to export same model with real world texture?

We used many demo and combine logic for export 3d model (usdz) with real texture. But, We get success in only export blank (white/gray) model.

we used below code for export 3d model.

func exportModel() {
        
        guard let camera = sceneView.session.currentFrame?.camera else {return}

        
        func convertToAsset(meshAnchors: [ARMeshAnchor]) -> MDLAsset? {
             
                guard let device = MTLCreateSystemDefaultDevice() else {return nil}
                
                let asset = MDLAsset()

            
            guard let frame = sceneView.session.currentFrame else { return nil }
            guard let cameraImage = captureCamera() else { return nil }

            for anchor in meshAnchors {
                
                
                // Below commented code help in showing preview model in sceneView
//                guard let node = sceneView.node(for: anchor) else { continue }
//                let geometry = scanGeometory(frame: frame, anchor: anchor, node: node, needTexture: true, cameraImage: cameraImage)
//                node.geometry = geometry
                
                
                let mdlMesh = anchor.geometry.toMDLMesh(device: device, camera: camera, modelMatrix: anchor.transform)
                asset.add(mdlMesh)
            }

            return asset
        }
        func export(asset: MDLAsset) throws -> URL {
            let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
            let url = directory.appendingPathComponent("scaned.usdc")

            try asset.export(to: url)

            return url
        }
        func share(url: URL) {
            let vc = UIActivityViewController(activityItems: [url],applicationActivities: nil)
            // vc.popoverPresentationController?.sourceView = sender
            self.present(vc, animated: true, completion: nil)
        }
        if let meshAnchors = sceneView.session.currentFrame?.anchors.compactMap({ $0 as? ARMeshAnchor }),
           let asset = convertToAsset(meshAnchors: meshAnchors) {
            do {
                let url = try export(asset: asset)
                share(url: url)
            } catch {
                print("export error")
            }
        }
    }

Upvotes: 1

Views: 1282

Answers (1)

Chirag Joshi
Chirag Joshi

Reputation: 29

Try below code :

let documentDirURL = try! FileManager.default.url(for: .documentDirectory,
                                                         in: .userDomainMask,
                                                         appropriateFor: nil,
                                                         create: true)

let filename = documentDirURL.appendingPathComponent("3d_Model.usdz")

self.sceneView.scene.write(to: filename, options: nil, delegate: nil, progressHandler: nil)

let activityController = UIActivityViewController(activityItems: [filename], applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)

Upvotes: 1

Related Questions