SceneKit动画无法在iOS中播放

时间:2014-09-05 21:30:07

标签: ios8 scenekit

我有一个完全适用于OS X的动画示例,启动,暂停,更改速度等。

现在我开始将其移植到iOS,甚至无法启动动画。我将代码简化到最小 - 它在OS X中运行,但在iOS上运行。

我的工作是

  1. 显示一个带有(动画)字符的场景(空闲动画) - 适用于OS X和iOS
  2. 在角色上开始运行动画。这适用于OS X,运行动画启动和循环。在iOS上,角色位于运行动画的开头。但它没有运行......
  3. 如果我从运行场景而不是空闲,它工作 - 字符运行。问题是当我加载场景后开始动画(任何)。它使用动画加载模型但不播放。

    在OS X和iOS版本之间进行详细比较后,我发现了2个不同之处,这可能是相关的,但我无法弄清楚如何修复它们:

    1. 在OS X版本中,在我开始动画之前,角色不会动画。在iOS版本中,当我将节点从空闲(或其他任何)场景附加到根时,它是动画的。我不知道如何改变这一点。

    2. OS X版本的scene.dae附加到Storyboard中的Scene View中 - iOS中也是如此。但是在iOS中出于某种原因,这种附件无效,'self.scene'是零。这就是我必须以编程方式实例化和分配场景的原因。我无法修复它,尝试重新添加场景视图,分配插座等。

    3. 使用故事板添加场景工具包视图。 idle和run是.dae文件。它们中的每一个都包含一个包含角色的完整模型和动画。我只是仔细检查了动画标识符与.dae文件中的相同。这些模型实际上是在Apple的一个例子中提供的,并且在OS X上完美运行......

      这是代码:

      查看控制器:

      #import "ViewController.h"
      
      @interface ViewController ()
      
      @end
      
      @implementation ViewController
      
      - (void)viewDidLoad {
          [super viewDidLoad];
      }
      
      - (void)viewDidAppear:(BOOL)animated {
          [self.sceneView loadScene];
      
      }
      
      @end
      

      场景工具包视图标题:

      //  ASCView.h
      
      #import <UIKit/UIKit.h>
      #import <SceneKit/SceneKit.h>
      
      
      
      
      @interface ASCView : SCNView
      
      
      
      - (void)loadScene;
      
      
      @end
      

      场景工具包视图实现:

      //
      //  ASCView.m
      //  anim_test
      //
      //
      
      #import "ASCView.h"
      
      @implementation ASCView
      
      - (void)loadScene {
      
          self.backgroundColor = [UIColor blueColor];
      
          self.allowsCameraControl = YES;
      
          [self loadSceneAndAnimations];
      }
      
      
      #pragma mark - Animation loading
      
      - (void)loadSceneAndAnimations {
          // Load the character from one of our dae documents, for instance "idle.dae"
          NSURL    *idleURL   = [[NSBundle mainBundle] URLForResource:@"idle" withExtension:@"dae"];
          SCNScene *idleScene = [SCNScene sceneWithURL:idleURL options:nil error:nil];
      
          SCNScene *scene = [SCNScene sceneNamed:@"scene.dae"];
          self.scene = scene;
      
          NSLog(@"scene: %@", self.scene);
      
          // Merge the loaded scene into our main scene in order to
          //   place the character in our own scene
          for (SCNNode *child in idleScene.rootNode.childNodes)
              [self.scene.rootNode addChildNode:child];
      
          // Load and start run animation
          // The animation identifier can be found in the Node Properties inspector of the Scene Kit editor integrated into Xcode
          [self loadAndStartAnimation:@"run" withIdentifier:@"RunID"];
      
      }
      
      - (void)loadAndStartAnimation:(NSString *)sceneName withIdentifier:(NSString *)animationIdentifier {
          NSURL          *sceneURL        = [[NSBundle mainBundle] URLForResource:sceneName withExtension:@"dae"];
          SCNSceneSource *sceneSource     = [SCNSceneSource sceneSourceWithURL:sceneURL options:nil];
          CAAnimation    *animationObject = [sceneSource entryWithIdentifier:animationIdentifier withClass:[CAAnimation class]];
      
      
          NSLog(@"duration: %f", [animationObject duration]); //0.9
      
          animationObject.duration = 1.0;
          animationObject.repeatCount = INFINITY;
      
      
          [self.scene.rootNode addAnimation:animationObject forKey:@"foofoofoo"];
      
          NSLog(@"animation: %@",[self.scene.rootNode animationForKey: @"foofoofoo"]);
          NSLog(@"is paused: %@",[self.scene.rootNode isAnimationForKeyPaused: @"foofoofoo"] ? @"yes" : @"no"); //NO
      }
      
      
      
      @end
      

1 个答案:

答案 0 :(得分:1)

哦,我找到了。在iOS中,似乎我必须传递选项,在这种情况下:

@{SCNSceneSourceAnimationImportPolicyKey:SCNSceneSourceAnimationImportPolicyPlayRepeatedly}                                                                                              

在OS X中我不是 - 可能默认值不同。