ARkit - 从Web服务器URL加载.scn文件到SCNScene中

10

我正在使用ARKit开发我的应用程序,并尝试从我的Web服务器(URL)动态加载.scn文件。

以下是我的代码的一部分:

 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

如何解决此问题。谢谢。

2个回答

7
关于init?(named: String), 文档中写道:

从应用程序的主 Bundle 中加载指定名称的文件对应的场景

由于你并没有这个文件,而是从下载获取,你可以尝试使用以下构造函数:
init(url: URL, options: [SCNSceneSource.LoadingOption : Any]? = nil)

因此,您的代码可能是这样的:

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

@ Andrea Mugnain。如果我在服务器端有.scn和纹理(3D模型图像)文件,我该如何加载它们?请帮帮我。谢谢。 - Raj
你想将之前下载的纹理应用到 SCNMaterial 吗?或者你需要为你的场景设置 overrideAssetURLs 吗? - mugx
是的,但我不确定如何下载和使用models.scnassets。 - Raj
这是有关在材质上编程设置纹理的解释:https://dev59.com/YYfca4cB1Zd3GeqPlqY6#34051972 - mugx

0
    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)

无法从远程URL加载模型。 - JBarros35

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接