在SceneKit中按名称获取材质

时间:2016-08-08 11:59:05

标签: ios swift scenekit

我已将collada .dae文件导入到scenekit中。 我可以在场景编辑器/检查器中看到有一个包含命名材料的实体和材料列表。但我不知道如何以编程方式提出这些要求。

如果我知道一个节点和使用它的几何体,我可以通过几何对象的名称来询问材料,如下所示:

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

但是这些是在许多子几何上使用的可重用材料,因此某处应该有一个全局索引(?)

我本来期待像

这样的东西
myscene.materialWithName("carpaint")

1 个答案:

答案 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
    }
}