SCNTransaction动画选项

3

我在我的SceneKit项目中有一个动画。它会为被按下的节点提供动画效果。现在,这个代码可以使动画正常工作:

SCNTransaction.begin()
SCNTransaction.setAnimationDuration(0.5)
    SCNTransaction.setCompletionBlock {
        SCNTransaction.begin()
        SCNTransaction.setAnimationDuration(0.5)
        result.node!.position.y -= 1
        SCNTransaction.commit()
    }
    result.node!.position.y += 1
    SCNTransaction.commit()
}

我希望让节点看起来像是跳动的,因此我想使用一些动画选项,例如可以在UIView中使用的CurveEaseIn等选项。(我希望它开始时慢慢地,结束时突然。第二个应该是突然的,然后慢慢地。)
有没有办法在SCNTransaction中使用这些选项?或者也许有更好的方法来实现“弹跳”效果?
先行致谢 :)
2个回答

6

更改时间函数

是的,您可以使用SCNTransaction更改时间函数。

您可以通过创建一个CAMediaTimingFunction对象并使用setAnimationTimingFunction()进行分配来实现这一点。有几个命名的时间函数(例如“ease in”),或者您可以使用两组控制点创建一个时间函数。

let easeIn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
SCNTransaction.setAnimationTimingFunction(easeIn)

使用关键帧动画

另一个选择是为节点的y位置创建更自定义的关键帧动画。我在第5章示例代码中创建了一个弹跳式的关键帧动画,这是我的Scene Kit书籍中的示例:

var jump = CAKeyframeAnimation(keyPath: "position.y")

let easeIn  = CAMediaTimingFunction(controlPoints: 0.35, 0.0, 1.0,  1.0)
let easeOut = CAMediaTimingFunction(controlPoints: 0.0,  1.0, 0.65, 1.0)

jump.values   = [0.000000, 0.433333, 0.000000, 0.124444, 0.000000, 0.035111, 0.000000];
jump.keyTimes = [0.000000, 0.255319, 0.531915, 0.680851, 0.829788, 0.914894, 1.000000];
jump.timingFunctions = [easeOut,  easeIn,  easeOut,  easeIn,   easeOut,   easeIn  ];
jump.duration = 0.783333;

yourNodeThatWasClicked.addAnimation(jump, forKey: "jump and bounce")

如果你选择这条路,我建议你找一个地方进行实验、调整和玩弄关键帧动画的关键时间和值。也许是一个游乐场或一个带有滑块的小型自定义应用程序,可以快速迭代。


我想分享一个改进的想法:不要将值设置为0.0001等,而是可以使用result.node.position.y+0.0001,因为这样会使其从节点当前所在位置反弹,而不是从y=0开始。 :) - LinusGeffarth
@LinusG. 你也可以将动画配置为“additive”。 - David Rönnqvist
嘿,还有一个问题。我在节点上方显示了一个视图。我能否以某种方式使用相同的动画移动视图,使其看起来像粘在一起?我尝试简单地执行view.addAnimation(jump, forKey: "jump and bounce"),但这当然不起作用... - LinusGeffarth
你可以将它添加到视图的层中。 - David Rönnqvist
把什么加到哪个层? :D - LinusGeffarth
1
如果您想使用相同的动画来使视图动起来,请将动画对象添加到视图的图层中。 - David Rönnqvist

1
你可以使用一个 CABasicAnimation,并将 byValue 设置为 1,将 autoreverses 设置为 YES。最后将其 timingFunction 设置为 kCAMediaTimingFunctionEaseIn(或更具体地说,是使用此曲线名称初始化的时间函数)。

在SpriteKit中是否有类似于SCNTransaction的东西? - Confused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接