.dae 格式的3D模型的动画大战

最近在看利用Scenekit显示3D模型,选用了自带动画的模型。需求是要求能自己控制模型的动画。

.dae格式模型在加载后如果有动画,会自动加载模型动画,永久重复。

一、移除动画

想要控制模型的动画就要先将自身的动画移除,因为不知道会在那个子节点带有动画,所以排除掉一层一层过滤带动画节点的方式。挣扎好久终于找出了方法:

//移除模型自带的动画效果

NSArray *allNodes = [sceneSource identifiersOfEntriesWithClass:[SCNNode class]];

for (NSString *nodeName in allNodes) {

    SCNNode *nodeKey = [sceneSource entryWithIdentifier:nodeName withClass:[SCNNode class]];

    [nodeKey removeAllAnimations];

}

先找到模型中的所有节点的名字,再通过方法找到节点,移除节点所带有的动画。

二、添加动画

要添加动画其实很容易,获取到动画数据,就可以直接添加到模型上了。

NSArray *animationIDs = [sceneSource identifiersOfEntriesWithClass:[CAAnimation class]];

NSUInteger animationCount = [animationIDs count];

NSMutableArray *longAnimations = [[NSMutableArray alloc]initWithCapacity:animationCount];

CFTimeInterval maxDuration = 0;

for (NSInteger index = 0; index<animationCount; index++) {

   CAAnimation *animation = [sceneSource entryWithIdentifier:animationIDs[index] withClass:[CAAnimation class]];

    if (animation) {

        maxDuration = animation.duration;

        [longAnimations addObject:animation];

    }

}

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];

animationGroup.animations = longAnimations;

animationGroup.duration = duration;

animationGroup.repeatCount = repeat;

[node addAnimation:animationGroup forKey:@"animation"];

推荐阅读更多精彩内容