Swift SceneKit将dae作为SCNNode的子类加载

Swift SceneKit将dae作为SCNNode的子类加载,swift,scenekit,Swift,Scenekit,我想将对象从dae文件加载到变量,该变量是SCNNode的子类。文件包含模型和动画。我有一个函数将模型加载为SCNNode,但我不知道如何将其更改为使用SCNNode子类 extension SCNNode { class func loadModel(named fileName: String) -> SCNNode? { let modelFileURL = Bundle.main.url(forResource: fileName, withExtensio

我想将对象从dae文件加载到变量,该变量是SCNNode的子类。文件包含模型和动画。我有一个函数将模型加载为SCNNode,但我不知道如何将其更改为使用SCNNode子类

extension SCNNode {
    class func loadModel(named fileName: String) -> SCNNode? {
        let modelFileURL = Bundle.main.url(forResource: fileName, withExtension: "dae")!
        let sceneSource  = SCNSceneSource(url: modelFileURL, options: [SCNSceneSource.LoadingOption.animationImportPolicy : SCNSceneSource.AnimationImportPolicy.playRepeatedly])
        return sceneSource?.entryWithIdentifier("MDL_Obj", withClass: SCNNode.self)
    }
}

我认为这是可行的,但还需要用更多的例子来验证:

class Model3D: SCNNode {

    init?(modelName: String) {
        guard let scnNode = SCNNode.loadModel(named: modelName) else { return nil }
        super.init()
        geometry = scnNode.geometry
        position = scnNode.position
        scnNode.childNodes.forEach {
            addChildNode($0)
        }
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

为什么要将SCNNode子类化?这几乎总是一个坏主意。我鼓励出现奇怪的错误,在我加载带有纹理的dae动画,然后删除此节点后,纹理不会被解除分配,并且存在内存泄漏。我在论坛上找到了类似的帖子,这似乎是一个SceneKit错误。他们建议在删除节点时将所有第一个材质属性设置为零。在我的例子中,我不能在删除节点时执行此操作,因为我将此节点保留在几个地方,以便以后重用。我在考虑在SCNNode子类的deinit中将这些变量重置为nil。即使没有它也可以工作,只需使用这个包装器类。