2016-11-29 1 views
0

Je dois animer l'alpha d'un élément qui est calculé hors ligne. Parlons de l'animation alpha simple. Alpha est nul, alpha passe à 1, reste un certain temps et remonte à zéro.Comment créer une animation simplifiée bezier/cubique pour le rendu hors ligne?

Quelque chose comme le graphique ci-dessous:

enter image description here

Les animations auront des moments différents. J'ai besoin de quelque chose que je peux donner le temps (t) et obtenir la valeur (v).

Cette animation doit être mis dans une classe à base CIFilter et utilisé pour animer ce filtre et parce que le résultat de ce filtre sera calculé hors ligne il n'y a pas CALayer pour l'ajouter, donc en utilisant CAKeyframeAnimation ou CABasicAnimation est hors de question .

Si je pouvais utiliser un CALayer, je ferais ceci:

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; 

Mais le problème serait cette ligne ... il n'y a pas de couche d'ajouter l'animation. Comme je l'ai dit je suis dans une classe CIFilter!

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

Alors, ma question est: est-il quelque chose qui peut me donner la valeur du temps pour ce genre de courbe pour l'intervalle de temps je définis pour l'animation?

+0

Veuillez arrêter de balises inutiles toutes vos questions avec l'iPhone. S'il vous plaît lire la description des étiquettes pour quand il devrait être utilisé. Merci. – rmaddy

+0

Notez que la courbe que vous affichez ne peut pas être rendue avec une seule courbe cubique. Vous avez besoin de plus d'une courbe, ou - parce que c'est une courbe de fonction normale, pas une courbe qui se répète sur elle-même - vous devriez juste modéliser cela avec une vieille fonction 'y = (fx)'. Les courbes de Bézier sont inutiles et contre-productives pour ce type de fonction. –

+0

@ Mike'Pomax'Kamermans - merci pour cela, j'ai utilisé l'idée lisse et il fonctionne maintenant comme de la soie. Merci et joyeux Noël! – SpaceDog

Répondre

1

Vous sous-classe CIFilter et en animant ... Je suppose que cela signifie que votre classe de filtre prend un paramètre de temps, et varie son résultat en fonction de cela?

Si oui, il y a deux options possibles. Les deux s'appuient sur le fait que votre courbe de synchronisation souhaitée ressemble à une courbe en S «facile d'accès», suivie de l'inverse de cette courbe.

  1. Si vous écrivez CI noyau Code Langue pour mettre en œuvre l'effet de votre filtre, vous pouvez interpoler en fonction de votre paramètre de temps à l'aide the smoothstep function (cette fonction est définie par GLSL et CI Langue du noyau est une surcouche de GLSL, sauf où defined otherwise Puisque vous avez une double courbe en S, vous aurez besoin de le faire deux fois.

    // pseudo CI Kernel source: 
    effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time) 
    
  2. Si vous n'êtes pas d'écrire un noyau, mais la mise en œuvre à la place un filtre en termes d'autres filtres, vous peut définir votre propre équivalent de la fonction smoothstep - cette définition est well known et assez simple, car il est dans de nombreuses bibliothèques graphiques. (Ou vous pouvez en apprendre davantage sur Hermite interpolation en général et devenir fou avec vos propres fonctions de lissage.) Ensuite, utilisez votre fonction pour changer l'entrée de votre filtre interne en fonction de votre paramètre de temps.

+0

merci pour la réponse.Le lien que vous avez fourni parle de cette fonction 'clamp':' x = clamp ((x - edge0)/(edge1 - edge0), 0.0, 1.0) 'Est-ce que vous savez par hasard ce que cette pince fait ou avez un algorithme du code nécessaire pour le faire? – SpaceDog

+0

Vérifiez les références GLSL que j'ai également liées; vous devriez trouver une pince là. L'essentiel: il "clamps" une variable d'entrée à une plage définie, comme 0 rickster

+0

Brillant, problème résolu !!! – SpaceDog