ios - 将 MDLAsset 转换为 MDLMesh 时无法打开 OBJ 文件
ios - Could not open OBJ file when convert MDLAsset to MDLMesh
我正在演示使用 ModelIO 加载和纹理化 .OBJ 文件。
当我使用 local file.
时,下面的代码工作正常
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 的 文件而不是本地文件时。我收到错误:"Could not open OBJ file" & "Failed to get mesh from asset."
这是我的代码:
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.")
}
注:我制作了linkpublic免费下载
我解决了我的问题。我的问题是我在下载完成之前转换了文件。因此,创建了本地路径但数据为空,因为下载过程尚未完成。
为了解决这个问题,我使用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.")
}
...
}
}
我正在演示使用 ModelIO 加载和纹理化 .OBJ 文件。 当我使用 local file.
时,下面的代码工作正常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 的 文件而不是本地文件时。我收到错误:"Could not open OBJ file" & "Failed to get mesh from asset." 这是我的代码:
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.")
}
注:我制作了linkpublic免费下载
我解决了我的问题。我的问题是我在下载完成之前转换了文件。因此,创建了本地路径但数据为空,因为下载过程尚未完成。
为了解决这个问题,我使用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.")
}
...
}
}