我正在尝试创建一个测试应用,用户可以通过单击SceneView暂停动画。 SceneView从在3d应用程序(Cinema 4D)中创建的.dae文件加载动画。该应用程序在启动时成功播放并循环播放动画。
要暂停动画,我使用Technical Q&A QA1673作为参考。在这个.dae文件的情况下,动画实际上是作为动画的层次结构进行的,所以我尝试深入到每个底层CAKeyframeAnimation并将其速度设置为零。我的代码目前看起来像这样:
- (void)mouseDown:(NSEvent *)event {
SCNNode *cubeNode = [self.scene.rootNode childNodeWithName:@"C4D_Cube" recursively:YES];
CAAnimation *cubeAnimation = [cubeNode animationForKey:@"Cube_Anim_01-02-1"];
CAAnimationGroup *cubeAnimationGroup = (CAAnimationGroup *)cubeAnimation;
// cubeAnimationGroup contains 3 CAAnimationGroups, each of which contains a CAKeyframeAnimation.
// So I directly access each CAKeyframeAnimation and set its speed to zero.
for (CAAnimationGroup *subGroup in [cubeAnimationGroup animations]) {
CFTimeInterval pausedTime = CACurrentMediaTime();
[[subGroup animations] setValue:@0.0 forKey:@"speed"];
[[subGroup animations] setValue:[NSNumber numberWithFloat:pausedTime] forKey:@"timeOffset"];
}
}
当我设置断点时,我可以看到关键帧动画的速度确实从1变为0,但动画在场景视图中继续以正常速度播放。我最初尝试将顶级CAAnimationGroup的速度设置为零,但这也没有效果。暂停正在进行的动画的正确方法是什么?
答案 0 :(得分:6)
“animationForKey:”返回的动画是正在运行的动画的副本。 文档说“尝试修改返回对象的任何属性将导致未定义的行为。” 所以你可以这样做:
for(NSString *key in [myNode animationKeys]){
CAAnimation *animation = [myNode animationForKey:key];
[animation setSpeed:0]; //freeze
[animation setTimeOffset:CACurrentMediaTime() - [animation beginTime]]; //move back in time
[cube addAnimation:animation forKey:key]; //re-add the animation with the same key to replace
}
请注意,如果您只想暂停来自.DAE的所有动画,则可能需要这样做:
[mySCNView setPlaying:NO]; //暂停基于场景时间的动画
答案 1 :(得分:3)
或者您可以将paused
设置为true
。
在斯威夫特:
mySCNView.scene?.paused = true