【问题标题】:How to create a bezier/cubic simplified animation for offline render?如何为离线渲染创建贝塞尔/立方简化动画?
【发布时间】:2016-11-29 21:21:06
【问题描述】:

我必须为离线计算的元素的 alpha 设置动画。让我们谈谈简单的 alpha 动画。 alpha 为零,alpha 增长到 1,停留一段时间又回到零。

如下图所示:

动画会有不同的时间。我需要一些可以给出时间(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!

所以,我的问题是:在我为动画定义的时间间隔内,有什么东西可以给我这种曲线的时间值吗?

【问题讨论】:

  • 请停止使用 iPhone 不必要地标记您的所有问题。请阅读标签说明以了解何时应使用它。谢谢。
  • 请注意,您显示的曲线不能用单个三次曲线渲染。您要么需要多条曲线,要么——因为这是一条正常的函数曲线,而不是一条自循环的曲线——你应该用一个普通的旧 y=(fx) 函数对其进行建模。对于这种类型的函数,贝塞尔曲线是不必要的,而且会适得其反。
  • @Mike'Pomax'Kamermans - 谢谢你,我使用了smoothstep的想法,现在它就像丝绸一样工作。谢谢,圣诞快乐!

标签: ios animation bezier cifilter


【解决方案1】:

您正在继承 CIFilter 并制作动画...我想这意味着您的过滤器类需要一个时间参数,并根据该参数改变其结果?

如果是这样,您可以考虑两个选项。两者都依赖于这样一个事实,即您所需的时序曲线看起来像一条“缓入缓出”的 S 曲线,然后是该曲线的反向曲线。

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

    // pseudo CI Kernel source:
    effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time)
    
  2. 1234563许多图形库。 (或者您可以大致了解Hermite interpolation 并使用您自己的平滑函数疯狂。)然后使用您的函数根据您的时间参数更改内部过滤器的输入。

【讨论】:

  • 感谢您的回答。您提供的链接讨论了这个clamp 函数:x = clamp((x - edge0)/(edge1 - edge0), 0.0, 1.0); 你是否知道这个钳位是做什么的或者有一些代码算法来制作它?
  • 检查我也链接的 GLSL 参考;你应该在那里找到夹子。要点:它将输入变量“钳制”到定义的范围,例如 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多