web-dev-qa-db-fra.com

ARkit - Chargement du fichier .scn à partir de l'URL du serveur Web dans SCNScene

J'utilise ARKit pour mon application et j'essaie de charger dynamiquement des fichiers .scn à partir de mon serveur Web (URL).

Voici une partie de mon code

 let urlString = "https://da5645f1.ngrok.io/mug.scn"
        let url = URL.init(string: urlString)
        let request = URLRequest(url: url!)
        let session = URLSession.shared
        let downloadTask = session.downloadTask(with: request,
                completionHandler: { (location:URL?, response:URLResponse?, error:Error?)
                -> Void in
                print("location:\(String(describing: location))")
                let locationPath = location!.path
                let documents:String = NSHomeDirectory() + "/Documents/mug.scn"
                ls = NSHomeDirectory() + "/Documents"
                let fileManager = FileManager.default
                if (fileManager.fileExists(atPath: documents)){
                     try! fileManager.removeItem(atPath: documents)
                }
                try! fileManager.moveItem(atPath: locationPath, toPath: documents)
                print("new location:\(documents)")
                let node = SCNNode()
                let scene =  SCNScene(named:"mug.scn", inDirectory: ls)
                let nodess = scene?.rootNode.childNode(withName: "Mug", recursively: true)
                node.addChildNode(nodess!)
                let nodeArray = scene!.rootNode.childNodes
                for childNode in nodeArray {
                    node.addChildNode(childNode as SCNNode)
                }
                 self.addChildNode(node)
                 self.modelLoaded = true

        })
        downloadTask.resume()

Nslog:

location:Optional(file:///private/var/mobile/Containers/Data/Application/A1B996D7-ABE9-4000-91DB-2370076198D5/tmp/CFNetworkDownload_duDlwf.tmp)

new location:/var/mobile/Containers/Data/Application/A1B996D7-ABE9-4000-91DB-2370076198D5/Documents/mug.scn

Téléchargement de fichier .scn avec le chemin de fichier mentionné ci-dessus (nouvel emplacement) .. mais quand j'essaie d'utiliser ce fichier téléchargé dans SCNScenename__

let scene =  SCNScene(named:"mug.scn", inDirectory: ls)

toujours la valeur de la scène est nilname__. Erreur

Thread 4: erreur irrécupérable: trouvé de façon inattendue nil lors du déroulement d'une valeur facultative

comment résoudre ces problèmes. Je vous remercie

8
Raj

À propos de init?(named: String), la documentation indique:

Charge une scène à partir d'un fichier avec le nom spécifié dans le bundle principal de l'application

comme vous n'avez pas ce fichier dans le bundle principal (provient d'un téléchargement), vous pouvez essayer avec le constructeur suivant:

init(url: URL, options: [SCNSceneSource.LoadingOption : Any]? = nil)

alors votre code pourrait être:

do {
   let documents = "yourValidPath"
   let scene = try SCNScene(url: URL(fileURLWithPath: documents), options: nil)
} catch {}
6
Andrea Mugnaini
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let pathToObject = documentDirectory + "ship.scn"
    let fileUrl = URL(fileURLWithPath: pathToObject)

    guard let cshipScene = try? SCNScene(url: fileUrl, options: nil) else { return }
    let shipNode = SCNNode()
    let shipSceneChildNodes = shipScene.rootNode.childNodes
    for childNode in shipSceneChildNodes {
        shipNode.addChildNode(childNode)
    }

    node.addChildNode(shipNode)
0
Aayushi