2016-11-29 17 views
0

オフラインで計算されている要素のアルファベットをアニメーション化する必要があります。シンプルなアルファアニメーションについて語りましょう。アルファはゼロ、アルファは1になり、しばらくしてゼロに戻ります。下のグラフのようなオフラインレンダリングのベジェ/キュービック簡易アニメーションの作成方法は?

何か:

enter image description here

アニメーションが異なる時間を持つことになります。私は時間(t)を与えて価値(v)を得ることができるものが必要です。

このアニメーションはCIFilterベースクラス内に置くと、そのフィルタをアニメーション化するために使用されるべきであり、このフィルタの結果はそれを追加するCALayerがないオフライン計算されますので、そのCAKeyframeAnimationまたはCABasicAnimationを使用すると、問題外であります。

私は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

表示するカーブを単一の3次曲線で描画することはできません。 2つ以上のカーブが必要な場合、またはこれが通常の関数カーブであり、カーブではなく元の 'y =(fx)'関数でモデル化する必要があります。ベジェ曲線はこのタイプの関数には不必要で逆効果です。 –

+0

@ Mike'Pomax'Kamermans - そのおかげで、私はスムーズなアイデアを使用しました。そして今はシルクのように機能します。ありがとう、メリークリスマス! – SpaceDog

答えて

1

CIFilterをサブクラス化してアニメーション化しています...私は、あなたのフィルタクラスが時間パラメータをとり、それに基づいて結果が変わることを意味すると思いますか?

もしそうなら、2つのオプションがあります。両方とも、あなたの希望するタイミングカーブが「イージーインイージーアウト」のS字カーブとそのカーブの逆のように見えるという事実に頼っています。

  1. あなたは、フィルタの効果を実装するためにCIカーネル言語のコードを書いている場合は、the smoothstep functionを使用して、あなたの時間パラメータに基づいて補間することができます(その関数は、GLSLによって定義され、CIカーネル言語は除くGLSLのスーパーセットですdefined otherwiseあなたは二重のS字カーブを持っているので、あなたはそれを2回行う必要がありますがここで。あなたは、あなたがカーネルを

    // pseudo CI Kernel source: 
    effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time) 
    
  2. を書いていない場合は、代わりに他のフィルタの条件でフィルタを実装しますsmoothstep関数の独自の定義を定義することができます。その定義はです多くのグラフィックスライブラリに含まれているため、かなり簡単です。 (またはHermite interpolationについて学び、独自のスムージング関数を使ってナットを実行することもできます)。次に、関数を使用して、時間パラメーターに基づいて内部フィルターへの入力を変更します。

+0

答えに感謝します。あなたが提供したリンクは、このクランプ関数について語っています: 'x = clamp((x - edge0)/(edge1 - edge0)、0.0、1.0);'それを作るために必要なコードの? – SpaceDog

+0

私もリンクしているGLSL参照を確認してください。そこにクランプがあるはずです。要点:0 rickster

+0

賢明な、問題解決済み!!! – SpaceDog