SCNTransaction AnimationOptions

时间:2015-04-15 22:00:02

标签: ios swift animation scenekit

我的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 个答案:

答案 0 :(得分:5)

更改计时功能

是的,您可以使用SCNTransaction更改计时功能。

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

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

使用关键帧动画

另一种方法是为节点的y位置创建更自定义的关键帧动画。我在the sample code for Chapter 5 my book about Scene Kit的{{3}}中进行了一次反弹动画关键帧动画:

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")

如果沿着这条路走下去,我建议找一个可以试验,调整和玩关键帧动画的关键时间和值的地方。也许是一个游乐场或带滑块的小型自定义应用程序,您可以在其中获得快速迭代。

答案 1 :(得分:1)

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