【问题标题】:SCNTransaction AnimationOptionsSCNTransaction 动画选项
【发布时间】:2015-06-22 02:09:46
【问题描述】:

我的 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?或者有没有更好的方法让它“反弹”?

提前致谢:)

【问题讨论】:

    标签: ios swift animation scenekit


    【解决方案1】:

    改变计时功能

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

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

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

    使用关键帧动画

    另一种选择是为节点的 y 位置创建更自定义的关键帧动画。我在my book about Scene Kitthe sample code for Chapter 5 中做了一个弹跳的关键帧动画:

    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 开始。 :)
    • @LinusG。您还可以将动画配置为additive
    • 嘿,还有一个问题。我在节点顶部显示一个视图。我可以以某种方式移动具有相同动画的视图,使其看起来像粘在一起吗?我试图简单地做view.addAnimation(jump, forKey: "jump and bounce"),但这(当然)不起作用......
    • 您可以将其添加到视图的图层中。
    • 如果您想使用相同的动画为视图设置动画,请将动画对象添加到视图层。
    【解决方案2】:

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

    【讨论】:

    • SpriteKit中有没有类似SCNTransaction的东西?
    猜你喜欢
    • 2016-08-01
    • 2011-07-24
    • 2020-07-12
    • 1970-01-01
    • 2023-02-14
    • 2021-05-12
    • 1970-01-01
    • 2014-11-09
    • 2014-07-27
    相关资源
    最近更新 更多