无法显示缓存目录中的 3d 文件
Posted
技术标签:
【中文标题】无法显示缓存目录中的 3d 文件【英文标题】:Can't display 3d file from cache directory 【发布时间】:2015-07-17 20:12:23 【问题描述】:你能帮我确定这里的问题吗?
似乎我。我遇到了这个错误 SceneKit IO: error, COLLADA files are not supported on this platform.
我保存在缓存目录中的 zip 文件包含 .dae 文件和纹理的 .png。 使用 Scene Kit,您可以:
导入 COLLADA 3D 对象并构建由相机、灯光和网格组成的场景。 https://developer.apple.com/library/mac/documentation/3DDrawing/Conceptual/SceneKit_PG/Introduction/Introduction.html
谢谢。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^
NSURL *url = [NSURL URLWithString:@"my url"
NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];
if(!error)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *zipPath = [path stringByAppendingPathComponent:@"zipfile.zip"];
[data writeToFile:zipPath options:0 error:&error];
if(!error)
ZipArchive *za = [[ZipArchive alloc] init];
if ([za UnzipOpenFile: zipPath])
BOOL ret = [za UnzipFileTo: path overWrite: YES];
if (NO == ret) [za UnzipCloseFile];
NSString *floorFilePath = [path stringByAppendingPathComponent:@"house1.dae"];
NSURL *floorPathURL = [NSURL fileURLWithPath:floorFilePath];
dispatch_async(dispatch_get_main_queue(), ^
SCNView *sceneView = (SCNView *)self.view;
sceneView = (SCNView *)self.view;
sceneView.allowsCameraControl = YES;
sceneView.autoenablesDefaultLighting = YES;
sceneView.backgroundColor = [UIColor whiteColor];
sceneView.scene = [SCNScene sceneWithURL:floorPathURL options:nil error:nil];
);
else
NSLog(@"Error saving file %@",error);
else
NSLog(@"Error downloading zip file: %@", error);
);
【问题讨论】:
在调试器中更容易做到。只需在该方法上设置一个断点,并在每一步检查对象/变量是否处于预期状态。 @***foe 是的,我确实放了一个断点,它在 tge 右目录中有文件,问题是它没有显示在我的场景视图中 “.dae”文件是 COLLADA 文件,错误消息显示“此平台不支持 COLLADA 文件”。这很混乱吗? 我尝试在本地运行 .dae 文件,它正在工作。 使用 Scene Kit,您可以: 导入 COLLADA 3D 对象并构建由相机、灯光和网格组成的场景。 developer.apple.com/library/mac/documentation/3DDrawing/… 【参考方案1】:SCNSceneSource Class Reference 有一张桌子:
Format Filename Extension Supported in
Collada Digital Asset Exchange .dae OS X v10.8 and later
Alembic .abc OS X v10.10 and later
SceneKit compressed scene .dae or .abc OS X v10.10 and later
ios 8.0 and later
SceneKit archive .scn OS X v10.10 and later
iOS 8.0 and later
您确定您的.dae
文件是“SceneKit 压缩场景”吗?显然,iOS 只支持从.dae
文件加载压缩场景。 Xcode 应该在编译您的应用程序时自动将您的 Collada .dae
转换为压缩场景(具有相同的扩展名)。如果您从应用程序包外部加载文件(例如从运行时的 URL),除非您已采取措施将其转换到其他位置,否则它将不是 SceneKit 压缩场景。
我在this answer上发现了以下评论:
要将 dae 文件转换为 SCNScene(named:...) 可以读取的文件,您可以在终端中使用以下命令行手动转换文件:/Applications/Xcode.app/Contents/Developer /usr/bin/scntool --convert InFile.dae --format c3d --output OutFile.dae --force-y-up --force-interleaved --look-for-pvrtc-image(当然,用您自己的文件名替换 InFile.dae 和 OutFile.dae)抱歉,在 cmets 中无法进行真正的格式化。- Marcus 2 月 2 日 18:23
我不知道所有这些标志是否都适合您使用。根据this web site,还有一个名为copySceneKitAssets
(在同一个Xcode子目录中)的命令行程序可以转换.scnassets
目录,所以也许这就是你想要使用的。
【讨论】:
我不确定,但是 zip 文件包含 .dae 和 .png 文件的纹理,我已经尝试在本地显示 .dae 文件并且它有效,但是当我执行此过程时这是我从 url 获取 zip 文件,然后将其解压缩并将其保存在缓存目录中,这表明不支持 COLLADA 文件。 我已经更新了我的答案。如果.dae
文件不是您的应用程序包的一部分,则其格式不正确。
好的,谢谢,这很有道理,你认为我可以用它做什么来使它成为一个 ScenKit 压缩场景?
使用scntool
的转换解决了我的问题,现在我可以显示远程dae
文件。谢谢!以上是关于无法显示缓存目录中的 3d 文件的主要内容,如果未能解决你的问题,请参考以下文章
linux无法显示cdrom没有安装处理块设备文件的应用程序