gpt4 book ai didi

macos - 暂停 SceneKit 动画

转载 作者:行者123 更新时间:2023-12-01 05:45:32 24 4
gpt4 key购买 nike

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

最佳答案

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

关于macos - 暂停 SceneKit 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com