SCNTransaction 动画选项
SCNTransaction AnimationOptions
我的 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
?或者有没有更好的方法 'bounce'?
提前致谢:)
更改计时功能
是的,您可以使用 SCNTransaction
更改计时功能。
您可以通过创建 CAMediaTimingFunction
对象并使用 setAnimationTimingFunction()
对其进行分配来实现。有几个命名的计时函数(例如 "ease in"),或者您可以使用两组控制点创建一个。
let easeIn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
SCNTransaction.setAnimationTimingFunction(easeIn)
使用关键帧动画
另一种选择是为节点的 y 位置创建更加自定义的关键帧动画。我在 the sample code for Chapter 5 of my book about 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")
如果您沿着这条路走下去,我建议您找一个可以试验、调整和播放关键帧动画的关键时间和值的地方。也许是游乐场或带有滑块的小型自定义应用程序,您可以在其中获得快速迭代。
您可以使用 CABasicAnimation
和 byValue
的 1
,并将 autoreverses
设置为 YES
。最后将其 timingFunction
设置为 kCAMediaTimingFunctionEaseIn
(或者,更具体地说,使用此曲线名称初始化的计时函数)。
我的 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
?或者有没有更好的方法 'bounce'?
提前致谢:)
更改计时功能
是的,您可以使用 SCNTransaction
更改计时功能。
您可以通过创建 CAMediaTimingFunction
对象并使用 setAnimationTimingFunction()
对其进行分配来实现。有几个命名的计时函数(例如 "ease in"),或者您可以使用两组控制点创建一个。
let easeIn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
SCNTransaction.setAnimationTimingFunction(easeIn)
使用关键帧动画
另一种选择是为节点的 y 位置创建更加自定义的关键帧动画。我在 the sample code for Chapter 5 of my book about 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")
如果您沿着这条路走下去,我建议您找一个可以试验、调整和播放关键帧动画的关键时间和值的地方。也许是游乐场或带有滑块的小型自定义应用程序,您可以在其中获得快速迭代。
您可以使用 CABasicAnimation
和 byValue
的 1
,并将 autoreverses
设置为 YES
。最后将其 timingFunction
设置为 kCAMediaTimingFunctionEaseIn
(或者,更具体地说,使用此曲线名称初始化的计时函数)。