.dae 格式的3D模型的动画大战
2018-06-01 本文已影响41人
努力才幸运
最近在看利用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"];