我有一个完全适用于OS X的动画示例,启动,暂停,更改速度等。
现在我开始将其移植到iOS,甚至无法启动动画。我将代码简化到最小 - 它在OS X中运行,但在iOS上运行。
我的工作是
如果我从运行场景而不是空闲,它工作 - 字符运行。问题是当我加载场景后开始动画(任何)。它使用动画加载模型但不播放。
在OS X和iOS版本之间进行详细比较后,我发现了2个不同之处,这可能是相关的,但我无法弄清楚如何修复它们:
在OS X版本中,在我开始动画之前,角色不会动画。在iOS版本中,当我将节点从空闲(或其他任何)场景附加到根时,它是动画的。我不知道如何改变这一点。
OS X版本的scene.dae附加到Storyboard中的Scene View中 - iOS中也是如此。但是在iOS中出于某种原因,这种附件无效,'self.scene'是零。这就是我必须以编程方式实例化和分配场景的原因。我无法修复它,尝试重新添加场景视图,分配插座等。
使用故事板添加场景工具包视图。 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
答案 0 :(得分:1)
哦,我找到了。在iOS中,似乎我必须传递选项,在这种情况下:
@{SCNSceneSourceAnimationImportPolicyKey:SCNSceneSourceAnimationImportPolicyPlayRepeatedly}
在OS X中我不是 - 可能默认值不同。