我已将collada .dae文件导入到scenekit中。 我可以在场景编辑器/检查器中看到有一个包含命名材料的实体和材料列表。但我不知道如何以编程方式提出这些要求。
如果我知道一个节点和使用它的几何体,我可以通过几何对象的名称来询问材料,如下所示:
myscene.rootNode.childNodes[68].geometry?.materialWithName("carpaint")
但是这些是在许多子几何上使用的可重用材料,因此某处应该有一个全局索引(?)
我本来期待像
这样的东西myscene.materialWithName("carpaint")
答案 0 :(得分: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
}
}