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 SCNScene
name__
let scene = SCNScene(named:"mug.scn", inDirectory: ls)
toujours la valeur de la scène est nil
name__. 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
À 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 {}
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)