无法显示缓存目录中的 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没有安装处理块设备文件的应用程序

ICO图标无法在网页上显示

无法在 webview 中显示本地存储中的 html 文件

无法使用 Qt3D 查看/加载 .obj 文件,用 cpp 编写

VisualSVN的一例图标无法显示解决办法

React - 无法显示路径存储在 json 文件中的 svg 图像