0

使用以下代码加载“ .obj”的常用方法Swift/MDLAsset

import ModelIO

var theURL: URL
var theAsset: MDLAsset

theURL = Bundle.main.url(forResource: "cube", withExtension: "obj")!
theAsset = MDLAsset(url: theURL)

这仅适用于应用程序主目录中的文件bundle(在app/Contents/Resources on 中macOS)。但我希望我的应用程序能够从我的文件系统上的任何位置读取文件。所以我尝试了以下

// 1st attempt
    theURL = URL(string: "file:///Users/me/cube.obj")!
    theAsset = MDLAsset(url: theURL)

// 2nd attempt
    theURL = URL(fileURLWithPath: "/Users/me/cube.obj")
    theAsset = MDLAsset(url: theURL)

// 3rd attempt
    theURL = URL(string: "cube.obj", relativeTo: URL(string:"/Users/me/")!)!
    theAsset = MDLAsset(url: theURL)

他们都失败了(带有错误消息"Could not open OBJ file")。这只发生在"cube.obj"文件不在app/Contents/Resources.

我天真的结论是这MDLAsset似乎是短视的——它只在一个地方看:app/Contents/Resources.

我确信必须有一个解决方案(除了总是将我的 obj 文件复制到应用程序的资源中)。

4

1 回答 1

0

该问题并非特定于 ModelIO 或 MDLAsset;这是沙盒应用程序的普遍问题。沙盒应用无法访问任意用户文件,它只能访问自己沙盒中的文件,除非用户交互已授予它访问其他文件的权限。

例如,如果您的应用程序要使用文件打开对话框 ( NSOpenPanel) 来要求用户选择模型对象文件,并且用户要这样做,那么您的应用程序将获得对该文件的访问权限。

于 2020-01-01T05:03:46.363 回答