在Scenekit中如何将一个SCNNode拆分成多个节点?

时间:2016-03-30 02:19:51

标签: ios scenekit

我尝试加载.obj文件。如何加载后,secenekit只生成一个具有巨大几何体的节点,该节点具有许多子网格。任何人都知道如何将这个巨大的节点分成许多节点,每个节点拥有一个原始节点的子网格?因为我需要对它们应用不同的物理。提前谢谢。

我尝试了以下方法:

  1. 手动解析.obj文件。这可行,但吃掉了太多的记忆
  2. 加载文件后,我得到了庞大的节点。然后我做了

            let geometry = SCNGeometry(sources: rootNode.geometry!.geometrySources, elements: [rootNode.geometry!.geometryElementAtIndex(count)])
            geometry.firstMaterial = rootNode.geometry!.materials[count]
            let node = SCNNode(geometry: geometry)
    
  3. 每个网格

    (从.obj文件获取) 这也有效,但需要很长时间才能渲染,我猜是因为我复制了每个节点的整个源代码。

1 个答案:

答案 0 :(得分:1)

听起来您已经找到了几种方法可以为您提供正确的结果,但是它们在运行时需要很长时间。所以跟那些一起运行,但提前做好。

在辅助程序中运行手动OBJ解析或每元素几何检索。将结果归档到SCNScene(或者SCNNodes)。将存档/存档嵌入公共项目中。取消归档.SCN文件将比解析和实例化大型OBJ文件快得多。

这是将场景存档到文件的功能。然后,您可以将该文件嵌入到项目中,并按照模板代码中打开太空飞船的方式打开它,或使用Xcode场景编辑器进行调整。

func archiveToFile(fileName: String) -> Bool {
    let data = NSKeyedArchiver.archivedDataWithRootObject(gameView!.scene!)

    // Save data to file
    let DocumentDirURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)

    let fileURL = DocumentDirURL.URLByAppendingPathComponent(fileName).URLByAppendingPathExtension("scn")
    print("FilePath:", fileURL.path)

    if (!data.writeToURL(fileURL, atomically: true)) {
        return false
    }
    return true
}