使用.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/Resource
上的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文件复制到应用程序的资源中)。
最佳答案
该问题并非特定于ModelIO或MDLAset。这是沙盒应用程序的普遍问题。沙盒应用程序无权访问任意用户文件,除非用户交互已授予其访问其他文件的权限,否则它只能访问自己沙盒中的文件。
例如,如果您的应用程序使用文件打开对话框(NSOpenPanel
)来要求用户选择模型对象文件,而用户这样做,则您的应用程序将有权访问该文件。
关于swift - ModelIO/MDLA是近视的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59539225/