2016-12-13 1 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) 

당신은 엑스 코드에서 장면 편집기를 사용하여 .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

감사합니다. –

관련 문제