2016-12-13 7 views
4

私はSCNViewを動的に作成するビューを持っています。シーンは空ですが、ボタンを押すと別のscnファイルからノードを追加したいと思います。このファイルにはアニメーションが含まれており、メインシーンでアニメートしたいと思います。問題は、シーンにオブジェクトを追加した後でアニメーション化されていないことです。このファイルをSCNViewのシーンとして使用すると動作します。 isPlayingとループが有効です。このようなノードをアニメーションでインポートするには、他に何が必要ですか?以下のサンプルコード:SceneKit独立したscnファイルのアニメーション付きノードロード

override func viewDidLoad() { 
    super.viewDidLoad() 

    let scene = SCNScene() 
    let sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) 
    sceneView.scene = scene 
    sceneView.loops = true 
    sceneView.isPlaying = true 
    sceneView.autoenablesDefaultLighting = true 
    view.addSubview(sceneView) 


    let subNodeScene = SCNScene(named: "Serah_Animated.scn")! 
    let serah = subNodeScene.rootNode.childNode(withName: "main", recursively: false)! 

    scene.rootNode.addChildNode(serah) 


} 
+0

同じ問題を、あなたはそれを解決しましたか? – ooOlly

答えて

3

あなたがCAAnimation対象になりますあなたのシーンSerah_Animated.scn、からアニメーションを取得する必要があります。そのアニメーションオブジェクトをメインシーンのrootNodeに追加します。以下に示すように

let animScene = SCNSceneSource(url:<<URL to your scene file", options:<<Scene Loading Options>>) 
let animation:CAAnimation = animScene.entryWithIdentifier(<<animID>>, withClass:CAAnimation.self) 

あなたは、Xcodeでシーンエディタを使用して.scnファイルからanimIDを見つけることができます。

SceneKit AnimationID from the Xcode Scene Editor

今すぐあなたのルートノードにアニメーションオブジェクトを追加することができます。

scene.rootNode.addAnimation(animation, forKey:<<animID>>) 

animIDを再利用しているため、ノードからアニメーションも削除できます。上記

scene.rootNode.removeAnimation(forKey:<<animId>>) 
  • 私のソリューションは、あなたのアニメーションは、単一のアニメーションである前提としています。たくさんのアニメーションがある場合は、すべてのアニメーションノードを追加する必要があります。私のワークフローでは、私はColladaフォーマットにエクスポートしたファイルをBlenderに持っていて、Automated Collada Converterを使って私が単一のアニメーションノードを持つようにしています。
  • Related SO answer
  • また、あなたはちょうど手の前にanimIDを気にせずにアニメーションを追加する上記またはかのようにあなたの代わりに、単一のアニメーションのアニメーションの束を持っている場合に便利entriesWithIdentifiersOfClass(CAAnimation.self)を、使用してプログラムanimIDを取得することができます。
  • Apple Sample Code for scene kit animations注:サンプルコードはObjCにありますが、Swiftへの翻訳は簡単です。
+2

.scnファイルにエンティティリストが見つかりませんでした。 .daeファイル内にのみ存在します – ooOlly

4

必要なのは、アニメーションを取得している:あなたと

 [childNode enumerateChildNodesUsingBlock:^(SCNNode *child, BOOL *stop) { 
     for(NSString *key in child.animationKeys) {    // for every animation key 
      CAAnimation *animation = [child animationForKey:key]; // get the animation 
      animation.usesSceneTimeBase = NO;      // make it system time based 
      animation.repeatCount = FLT_MAX;      // make it repeat forever 
      [child addAnimation:animation forKey:key];   // animations are copied upon addition, so we have to replace the previous animation 
     } 
    }]; 
+0

ありがとうございます@ooOlly。 –

関連する問題