在设备上运行时没有childNodes

时间:2015-10-03 15:59:21

标签: ios objective-c cocoa-touch scenekit

我创建了一个简单的项目来尝试使用SceneKit,添加了一个包含man角色和相机的场景。

问题是代码在模拟器和设备上的行为方式不同。

当将man字符加载到SCNNode对象中时,在模拟器中,这个“man”节点有子节点,它们本身包含几何。

但是,在设备上运行时,man节点不包含子节点,并且本身具有几何体。

为什么会这样?有人可以解释我到底搞砸了什么吗?

我已将示例项目上传到GitHub,因此您可以将其检出并在模拟器和设备上运行。

https://github.com/iamBlueGene/SceneKitExperiment

谢谢,Eli。

2 个答案:

答案 0 :(得分:1)

我想我已经把它想出来了。

问题是因为顶点在.dae文件中的容器之间分割是由于顶点数量的限制,不同的配置可以以不同的方式打开文件。

您可以尝试再次打开场景并再次导出(如果可以的话,可以只输出该角色)并再次检查。

答案 1 :(得分:0)

我向您的ViewController.m添加了以下方法,只是为了看看发生了什么。

- (void)printNodeTree: (SCNNode*)node levelIndent:(NSString*) indent{

    if (node != nil) {
        BOOL hasGeom = node.geometry == nil;
        NSString *nodeName = [NSString stringWithFormat:@"%@%@", indent, node.name];
        NSString *geomStr = [NSString stringWithFormat:@"%@ has geometry: %@", indent, hasGeom ? @"YES" : @"NO"];
        printf("%s \n", [nodeName UTF8String]);
        printf("%s \n", [geomStr UTF8String]);

        for (id childNode in [node childNodes]) {
            [self printNodeTree:childNode levelIndent:[NSString stringWithFormat:@"%@   ",indent]];
        }
    } else {
        return;
    }
}

在模拟器和设备上运行时(在传递对man节点的引用时)收到以下输出。

Model_1 
 has geometry: YES 
   Model_1-splitContainer 
    has geometry: YES 
      Model_1-splitContainer-split0 
       has geometry: NO 
      Model_1-splitContainer-split1 
       has geometry: NO 
      Model_1-splitContainer-split2 
       has geometry: NO 
      Model_1-splitContainer-split3 
       has geometry: NO 
      . . .

这似乎与您在设备上运行时看到的内容一致。查看XCode场景编辑器和Blender都显示有几个组件显然正在合并。

导入场景时可以指定一些选项。默认情况下记录为不展平场景(正如我们观察到的那样),但只是为了确认我尝试了以下内容。这产生了与上面相同的输出。

NSDictionary* sceneLoadOpts = [NSDictionary dictionaryWithObjectsAndKeys:
    SCNSceneSourceFlattenSceneKey, [NSNumber numberWithBool:NO],
    nil];

SCNScene *characterScene = [SCNScene sceneNamed:@"character-male-muscle.dae"
    inDirectory:nil 
    options:sceneLoadOpts];

设备(或模拟器)不直接加载.dae文件。这由scntool编译成c3d文件。我将dae转换为c3d文件,然后返回dae并发现不同的组件仍然存在。压扁不是压缩过程的结果。

最后,我将模型加载到Blender中并重新排列模型树,以便所有几何节点与父节点处于同一级别。这确实在模拟器和设备上产生了多个几何组件,但这可能有点远......

顶点计数(65535)和这些组件的名称(" splitContainerX")似乎表明由于顶点索引(2 ^ 16)的约束,它们只是单独的几何组件。简而言之,我并不认为您真的希望将此模型视为单独的组件。目前的理论是dae文件中的某个标志,表明这些组件应尽可能合并。