15

Cocoa/Touch では、CAMediaTimingFunction は、タイミング関数の 3 次ベジェ曲線を指定する 4 つの制御点を表します。私が書いているアプリケーションでは、任意の時間 t (0 -> 1) でベジエ曲線の結果を抽出できるようにしたいと考えています。私を混乱させているのは、これを行う方法を調べると、結果もスカラーではなくポイントになるはずだということです:

B(t) = (1 - t) ^ 3 * P0 + 3 * (1 - t) ^ 2 * t * P1 + 3 * (1 - t) * t ^ 2 * P2 + t ^ 2 * P3

ただし、Apple の実装ではスカラー値が得られます (このグラフでは、x(t) と t をプロットしています: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Animation_Types_Timing/Articles/ Timing.html#//apple_ref/doc/uid/TP40006670-SW1 )

Apple は単に結果の y 座標を無視し、x のみを処理するのでしょうか? y が結果にまったく影響を与えないため、制御点を渡す必要はなく、スカラーを制御する必要があるため、これは奇妙に思えます。

4

4 に答える 4

13

CoreAnimationCAMediaTimingFunctionはあなたが望むことを行いますが、特定の 'x' に対して 'y' を取得して多目的 (アニメーション) に使用することは公開しませんが、解決された値をフードの下のアニメーション システムに不透明に供給するだけです。

私はそれを自分で必要としていたので、インターフェイスと機能がまったく同じCAMediaTimingFunctionであるが必要な-valueForX:メソッドを備えたクラスを構築しました。使用例:

RSTimingFunction *heavyEaseInTimingFunction = [RSTimingFunction timingFunctionWithControlPoint1:CGPointMake(0.8, 0.0) controlPoint2:CGPointMake(1.0, 1.0)];
CGFloat visualProgress = [heavyEaseInTimingFunction valueForX:progress];

イーズイン、イーズアウト、イーズイン、イーズアウトなど、3 次ベジエ曲線で記述できる任意の曲線を作成できます。実装の計算は WebCore (WebKit) に基づいており、これはおそらく CoreAnimation が内部で使用しているものでもあります。

楽しんで、ラファエル

于 2013-09-29T22:23:48.527 に答える
4

: 私は CoreAnimation の専門家ではありません。これは、リンクしたドキュメントを読んだ私の理解です。

Apple はここで座標系を混在させているため、混乱が生じています。

x(t)例のプロットでは、物理座標ではなく、パスに沿ったスカラー進行を表します。

CAMediaTimingFunction で使用される制御点は、幾何学的な点ではなく、この進行を記述するために使用されます。混乱を助長するためxに、コントロール ポイントは実際tにはプロット上にマッピングされy、コントロール ポイントはプロット上にマッピングされx(t)ます。

のプロットをkCAMediaTimingFunctionEaseInEaseOut例にとると、このプロットは制御点 (0,0)、(0.5,0)、(0.5,1)、(1,1) によって大まかに記述されます。

于 2012-04-11T02:09:01.783 に答える
1

最良のヒントは、おそらくWebKit のソース コードのUnitBezier.hでしょう。実際、Apple は Core Animation 内で同じコードを使用していると思います。

もっと長く、彼らは実際に時間値を含む値を与えられた計算パラメータt(時間とは何の関係もありません)を使用します。x次に、ニュートン・ラフソン法を使用します(例による追加説明)。失敗する可能性があるため、二分法 (「分割統治」) を使用するためにもう少し反復します。solveCurveX()メソッドでこれを参照してください。

パラメーターを取得した後t(3 次ベジエがパラメーターで定義されていることを考えると、これは必要です)、単純にそれを使用して を計算しますysolve()メソッドでこれを参照してください。

ちなみに、カプチーノの大ファンで、今でもアトラスのリリースを望んでいます :-)


2020 年 1 月の更新: 2012 年にコア アニメーション API の実装でこれを行いました。ぜひ参考にしてください。

于 2012-07-15T21:36:59.590 に答える