2017-01-01 7 views
0

私は、daeファイルからSCNNodeのサブクラスである変数にオブジェクトをロードしたいと思います。ファイルにはモデルとアニメーションが含まれています。モデルをSCNNodeとしてロードする関数がありますが、SCNNodeサブクラスを使用するようにモデルを変更する方法はわかりません。SCNNodeのサブクラスとしてSceneKitをロードする

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) 
    } 
} 
+0

あなたがSCNNodeをサブクラス化したいのはなぜ?これはほとんど常に悪い考えです。 –

+0

テクスチャのあるdaeアニメーションをロードした後、このノードを削除すると、テクスチャの割り当てが解除されず、メモリリークが発生するという奇妙なエラーが発生しました。私はそれについてのフォーラムで同様のスレッドを発見した、それは、SceneKitエラーと思われる。彼らが提案することは、ノードを削除するときにすべての最初のマテリアルプロパティをnilに設定することです。私の場合は、後で再利用するためにこのノードをいくつかの場所に保持しているので、ノードを削除するときにこれを行うことはできません。私はSCNNodeサブクラスの初めにこれらの変数をゼロにすることを再設定することを考えていました。このラッパークラスを使用していても作業しました。 –

答えて

0

私はこれがうまくいくと思うが、それでもより多くの例を検証する必要があります。

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") 
    } 
} 
関連する問題