2016-11-29 63 views
0

我必须为正在离线计算的元素的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! 

所以,我的问题是:有没有东西可以给我的时间的价值对于这种曲线的区间我定义动画的时间?

+0

请停止不必要地用iPhone标记所有问题。请阅读标签说明以了解它的使用时间。谢谢。 – rmaddy

+0

请注意,您显示的曲线不能用单个三次曲线进行渲染。您可能需要多条曲线,或者 - 因为这是一条正常的函数曲线,而不是一条可以回溯自身的曲线 - 您应该用一个普通的旧式'y =(fx)'函数对其进行建模。贝塞尔曲线对于这种类型的函数是不必要的并且适得其反。 –

+0

@ Mike'Pomax'Kamermans - 谢谢你,我已经使用了平滑的想法,它现在像丝绸一样工作。谢谢你,圣诞快乐! – SpaceDog

回答

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,并使用您自己的平滑功能进行调整。)然后根据您的时间参数使用您的功能将输入更改为内部过滤器。

+0

感谢您的回答。你提供的链接提供了关于这个'clamp'函数的讨论:'x = clamp((x-edge0)/(edge1 - edge0),0.0,1.0);'你有没有机会知道这个钳子做了什么或者有一些算法的代码需要做到这一点? – SpaceDog

+0

检查我也链接的GLSL参考;你应该在那里找到夹子。要点:它将输入变量“夹”到一个定义的范围内,如0 rickster

+0

辉煌,问题解决了! – SpaceDog