Swift SceneKit将dae作为SCNNode的子类加载
我想将对象从dae文件加载到变量,该变量是SCNNode的子类。文件包含模型和动画。我有一个函数将模型加载为SCNNode,但我不知道如何将其更改为使用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
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。即使没有它也可以工作,只需使用这个包装器类。