ARkit - Download .scn file from web server URL to SCNScene

I am using ARKit for my application and I am trying to dynamically download .scn files from my web server (URL)

Here is part of my 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 

.scn uploading the file with the above method (new location) file path .. but when i try to use this downloaded file in SCNScene

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

always the value of the scene is nil . error

Topic 4: Fatal error: Zero unexpectedly found while deploying optional value

how to solve these problems. thank you

+5
source share
1 answer

About init?(named: String) , the documentation says:

Loads a scene from a file with the specified name in the main application bundle

since you do not have such a file inside the main package (comes from the download), you can try with the following constructor:

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

so your code could be:

 do { let documents = "yourValidPath" let scene = try SCNScene(url: URL(fileURLWithPath: documents), options: nil) } catch {} 
+3
source

Source: https://habr.com/ru/post/1274881/


All Articles