2016-08-08 29 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 
    } 
}