swift - ios - 将 MDLAsset 转换为 MDLMesh 时无法打开 OBJ 文件

标签 swift scnscene

我正在演示使用 ModelIO 加载和构造 .OBJ 文件。 当我使用本地文件时,下面的代码工作正常。

guard let url = Bundle.main.url(forResource: "myVase", withExtension: "obj") else {
    fatalError("Failed to find model file.")
}

let asset = MDLAsset(url:url)
guard let object = asset.object(at: 0) as? MDLMesh else {
    fatalError("Failed to get mesh from asset.")
}

但是,当我更改我的代码以使用我的 Amazon S3 中的文件 而不是本地文件时。我收到错误消息:“无法打开 OBJ 文件”“无法从 Assets 中获取网格。” 这是我的代码:

let url = URL.init(string: "https://s3.amazonaws.com/myObject/.../object.obj")

let asset = MDLAsset(url:url!)
guard let object = asset.object(at: 0) as? MDLMesh else {
   fatalError("Failed to get mesh from asset.")
}

注意:我公开了链接并可以免费下载。

最佳答案

我解决了我的问题。我的问题是我在下载完成之前转换了文件。因此,创建了本地路径但数据为空,因为下载过程尚未完成。

为了解决这个问题,我使用async先完成下载然后再转换。

let destination: DownloadRequest.DownloadFileDestination = { _, _ in
   let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
   let fileURL = documentsURL.appendingPathComponent("myVase.obj")     
   return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
}

Alamofire.download(urlString, to: destination).response { response in
    if response.error == nil, let filePath = response.destinationURL?.path {
       print(imagePath)
       let myUrl = "file://" + filePath

       let asset = MDLAsset(url:URL(string:myUrl)!)
       guard let object = asset.object(at: 0) as? MDLMesh else {
           fatalError("Failed to get mesh from asset.")
       }
        ...
    }
}

关于swift - ios - 将 MDLAsset 转换为 MDLMesh 时无法打开 OBJ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266184/

相关文章:

ios - 图标及其颜色自动更新 | iOS |碳套件

ios - Swift 3 - 如何使用 Alamofire 和 SwiftyJSON 获取 JSON 对象

cocoapods - SCNScene 加载来自 pod 的纹理

ios - Scenekit - 将子节点(平面节点)添加到相机前面的父节点(球体节点)

ios - 使用 Scenekit sceneTime 浏览动画 iOS

ios - 使用PaypalSDK iOS iOS导航颜色在iOS中未更改

ios - 如何在 iOS 8 swift 中更改按钮文本大小

camera - 在 SceneKit 中设置相机的视角

ios - ARKit - 如何从服务器 URL 加载 .scn 和纹理文件

ios - 在 AppDelegate 上处理 persistentContainer 实例的正确方法