如何为离线渲染创建贝塞尔/立方体简化动画?

时间:2016-11-29 21:21:07

标签: ios animation bezier cifilter

我必须为离线计算的元素的alpha设置动画。让我们谈谈简单的alpha动画。 Alpha为零,alpha增长为1,保持一段时间并返回零。

如下图所示:

enter image description here

动画会有不同的时间。我需要能给出时间(t)并获得价值(v)的东西。

此动画将放在基于CIFilter的类中并用于为该过滤器设置动画,因为此过滤器的结果将在离线状态下计算,因此没有CALayer来添加它,因此使用CAKeyframeAnimationCABasicAnimation是不可能的。

如果我可以使用CALayer,我会这样做:

CABasicAnimation* fadeInOut = [CABasicAnimation animation];
fadeInOut.keyPath = @"filters.myFilter.inputRadius";
fadeInOut.fromValue = @(0);
fadeInOut.toValue = @(10);
fadeInOut.duration = 0.2f;
fadeInOut.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
fadeInOut.autoreverses = YES;

但问题是这一行...没有添加动画的图层。就像我说我在CIFilter班级里面一样!

[self.layer addAnimation:fadeInOut forKey:nil]; // NO WAY!

所以,我的问题是:在为动画定义的时间间隔内,是否有某些东西可以为我提供这种曲线的时间价值?

1 个答案:

答案 0 :(得分:1)

你是CIFilter的子类并动画...我认为这意味着你的过滤器类需要一个时间参数,并根据它改变它的结果?

如果是这样,您可以查看两个选项。两者都依赖于这样一个事实,即你想要的时间曲线看起来像是一个“易于缓解”的S曲线,然后曲线反过来。

  1. 如果您正在编写CI内核语言代码来实现过滤器的效果,则可以使用the smoothstep function基于时间参数进行插值(该函数由GLSL定义,CI内核语言是超集GLSL除了defined otherwise以外。由于你有一个双S曲线,你需要做两次:

    // pseudo CI Kernel source:
    effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time)
    
  2. 如果您没有编写内核,而是根据其他过滤器实现过滤器,则可以定义自己的smoothstep函数等效项 - 该定义为well known并且相当简单,因为它存在于许多图形库中。 (或者您可以了解Hermite interpolation一般情况,并使用自己的平滑函数进行操作。)然后使用您的函数根据时间参数更改内部过滤器的输入。