ARkit - 在 SCNScene 中从 Web 服务器 URL 加载 .scn 文件
ARkit - Loading .scn file from Web-Server URL in SCNScene
我正在为我的应用程序使用 ARKit,我尝试从我的网络服务器动态加载 .scn 文件(URL)
这是我的部分代码
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 文件使用上述(新位置)文件路径下载.. 但是当我尝试在 SCNScene
中使用此下载文件时
let scene = SCNScene(named:"mug.scn", inDirectory: ls)
总是场景值是nil
。
错误
Thread 4: Fatal error: Unexpectedly found nil while unwrapping an Optional value
如何解决这个问题。谢谢
关于init?(named: String)
,文档说:
Loads a scene from a file with the specified name in the app’s main bundle
因为主包中没有这样的文件(来自下载),您可以尝试使用以下构造函数:
init(url: URL, options: [SCNSceneSource.LoadingOption : Any]? = nil)
所以您的代码可能是:
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)
我正在为我的应用程序使用 ARKit,我尝试从我的网络服务器动态加载 .scn 文件(URL)
这是我的部分代码
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 文件使用上述(新位置)文件路径下载.. 但是当我尝试在 SCNScene
let scene = SCNScene(named:"mug.scn", inDirectory: ls)
总是场景值是nil
。
错误
Thread 4: Fatal error: Unexpectedly found nil while unwrapping an Optional value
如何解决这个问题。谢谢
关于init?(named: String)
,文档说:
Loads a scene from a file with the specified name in the app’s main bundle
因为主包中没有这样的文件(来自下载),您可以尝试使用以下构造函数:
init(url: URL, options: [SCNSceneSource.LoadingOption : Any]? = nil)
所以您的代码可能是:
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)