服务器URL中的.obj文件不起作用

时间:2018-02-15 09:32:17

标签: ios swift4 scenekit modelio

我需要从服务器URL导入3D模型,但它无法正常工作。 这是我的代码:

guard let path = modelPath, !path.isEmpty else {
    fatalError("Failed to find model file path.")
}

guard let modelURL = URL(string: path) else {
    fatalError("Failed to find model URL.")
}

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

...在object崩溃。

2 个答案:

答案 0 :(得分:2)

MDLAsset(url:)无法处理从服务器下载模型,仅适用于URL指向本地存储的模型。

您必须自己下载(使用URLSession或Alamofire这样的框架)。

使用URLSession的示例:

下载任务将返回在回调闭包返回后将被删除的文件的临时位置,因此如果您需要重复使用该文件,则必须将其重新保存在某处。

tempLocation文件的扩展名为.tmpMDLAsset将无法处理。即使您不需要保留文件,我也没有提出一个更好的方法,而不是使用所需的扩展名(.obj)重新保存它。

let fileManager = FileManager.default
let localModelName = "model.obj"
let serverModelURL = URL(...)
let localModelURL = fileManager
        .urls(for: .documentDirectory, in: .userDomainMask[0]
        .appendingPathComponent(localModelName)

let session = URLSession(configuration: .default)
let task = session.downloadTask(with: modelURL) { tempLocation, response, error in
    guard let tempLocation = tempLocation else {
        // handle error
        return
    }

    do {
        // FileManager's copyItem throws an error if the file exist
        // so we check and remove previously downloaded file
        // That's just for testing purposes, you probably wouldn't want to download
        // the same model multiple times instead of just persisting it

        if fileManager.fileExists(atPath: localModelURL.path) {
            try fileManager.removeItem(at: localModelURL)
        }

        try fileManager.copyItem(at: tempLocation, to: localModelURL)

    } catch {
        // handle error
    }

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

task.resume() // don't forget to call resume to start downloading

答案 1 :(得分:0)

我认为.obj对象还需要至少一个.mlt文件,可能还需要一个.jpg格式的文件,检查是否有错误,因为这些文件丢失了