在SceneKit中通过名称获取材质

3
我已经将一个collada .dae文件导入到了scenekit中。我可以在场景编辑器/检查器中看到一些实体和材质的列表,其中有命名的材质。但是我不知道如何通过编程来获取它们。
如果我知道一个节点和使用它的几何体,我可以通过以下方式按名称请求材质:
myscene.rootNode.childNodes[68].geometry?.materialWithName("carpaint")

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

我原以为会有类似以下的内容:

myscene.materialWithName("carpaint")

1
我常用的一种方法是在场景中添加一个不显眼的对象,该对象使用所有材质,并从那里引用材质。至少这比迭代遍历场景中的所有节点查找材质要快。 - Pro Blaster
1个回答

3
我最终做的是创建了一个扩展到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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接