【问题标题】:Pausing a SceneKit animation暂停 SceneKit 动画
【发布时间】:2012-08-21 18:21:17
【问题描述】:

我正在尝试创建一个测试应用程序,用户可以在其中通过单击 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 的速度设置为零,但这也没有效果。暂停正在进行的动画的正确方法是什么?

【问题讨论】:

标签: macos core-animation scenekit


【解决方案1】:

“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]; //暂停基于场景时间的动画

【讨论】:

  • 谢谢!这很有帮助。我忽略了 SCNView 上的 setPlaying 方法。当我尝试上面的代码示例时,我能够暂停动画,但只有在动画跳转到其时间轴中的不同点之后。我想知道时间偏移是否计算不正确?理想情况下,我希望能够控制这种方法提供的特定动画参数。
【解决方案2】:

或者您可以将paused 设置为true

在斯威夫特中:

mySCNView.scene?.paused = true

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 2016-03-28
    • 2013-11-25
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多