2016-08-08 63 views
2

我已将collada .dae文件导入到scenekit中。 我可以在场景编辑器/检查器中看到存在具有命名材质的实体和材质列表。但我不知道如何以编程方式提出这些要求。在SceneKit中按名称获取素材

我可以按名称从几何对象要求的材料,如果我知道的一个节点和几何使用它,就像这样:

myscene.rootNode.childNodes[68].geometry?.materialWithName("carpaint") 

但这些都是在很多次的几何形状使用可重复使用的材料,所以有应该是一个全球性的指数地方(?)

我本来期望像

myscene.materialWithName("carpaint") 
+1

我通常使用的方法是在使用的所有材料的现场,和参考材料从那里的某个位置添加一个不显眼的对象。至少比遍历场景中的所有节点寻找材质要快。 –

回答

2

我最终什么事与做是创建一个扩展SCNNode和SCNScene给我一个索引的所有材料:

import SceneKit 

extension SCNScene { 
    func buildMaterialIndex() -> Dictionary<String, SCNMaterial> { 
     return self.rootNode.buildMaterialIndex() 
    } 
} 

extension SCNNode { 
    func isPartOf(node: SCNNode) -> Bool { 
     return (node === self) || (parentNode?.isPartOf(node) ?? false) 
    } 

    private class _DictBox { 
     var dict = Dictionary<String, SCNMaterial>() 
    } 
    private func _populateMaterialIndex(dictbox: _DictBox, node: SCNNode) { 
     if let g = node.geometry { 
      for m in g.materials { 
       if let n = m.name { 
        dictbox.dict[n] = m 
       } 
      } 
     } 
     for n in node.childNodes { 
      _populateMaterialIndex(dictbox, node: n) 
     } 
    } 
    func buildMaterialIndex() -> Dictionary<String, SCNMaterial> { 
     let dictbox = _DictBox() 
     _populateMaterialIndex(dictbox, node: self) 
     return dictbox.dict 
    } 
}