完璧なクロスフェード


25

この問題を言葉で説明するのは難しいと思うので、それを説明するためにビデオ(45秒)を作成しました。ここに質問のプレビューがあります、Vimeoでそれを見てください:http : //vimeo.com/epologee/perfect-crossfade

線形クロスフェードを使用すると、結果の画像の透明度が「低下」します。 どうすればこれを防ぐことができますか?

過去10年間、多くの分野で2つの画像または形状の完璧なクロスフェードまたはディゾルブを作成する問題が繰り返し発生しました。最初はビデオ編集で、次にFlashアニメーションで、そして今はiOSプログラミングで。Googleでグーグル検索を開始すると、多くの回避策が見つかりますが、今回はハックせずにこれを解決したいです。

要約:
結果の透明度をどちらか一方のオリジナルと一致させる場合、2つの半透明の同色のビットマップをクロスフェードする際に適用する手法または曲線の名前は何ですか?

フェード中に必要な部分的な透明度/アルファ値を計算する(数学的な)関数はありますか?

これらの関数をに似たプリセットとして持っているプログラミング言語ease inease outまたはease in outActionScriptやCocoaにある関数はありますか?

更新:ビデオに加えて、サンプルプロジェクト(XcodeとiOS SDKが必要)を作成し、githubに投稿しました。ビデオと同じアニメーションを示していますが、今回は正方形を使用しています:https : //github.com/epologee/StackOverflow-Example-Code


7
それについては何も知らないが、ビデオについては+1。
セバスチャンガイガー

over演算子の実装方法に依存します。en.wikipedia.org/wiki/Alpha_channel
artistoex

私は同意します、@ artistoex、そのオーバーオペレーターには何かがあります、リンクをありがとう!ただし、答えがどこかに埋まっている場合、私はそれを見ていません:(
epologee

over演算子の数学的表現は方程式につながります。演算子の例:C = alpha * c1 +(alpha-1)* c2は、alpha =(C + c2)/(c1 + c2)を生成します(Cは2つの色c1、c2を混合した結果です)。つまり、このover演算子には、条件を満たす関数はありません。
artistoex

C = alpha1 * c1 + alpha2 * c2(0 <= alpha1、alpha2 <= 1)の場合、そのような関数があります:alpha1 =(C-alpha2 * c2)/ c1。
artistoex

回答:


3

それは不可能だと思います。これは、2つのオブジェクトがオーバーレイするときの透明度の計算方法です:http : //en.wikipedia.org/wiki/Alpha_compositing

アルファ合成

オーバーレイ領域が透けて見えないようにするには、オブジェクトの1つの不透明度を1にする必要があります。


3

ビデオ編集の分野で名前が何であるかはわかりませんが、カーブをSカーブまたはS字カーブと呼びます。Core AnimationのkCAMediaTimingFunctionEaseInEaseOutタイミング機能を使用して、iOSで探しているクロスフェードを作成するのは非常に簡単です。alphaそのタイミング関数を使用して、2つのビューのプロパティを反対方向(1つは0-> 1、もう1つは1-> 0)にアニメーション化します。

[UIView beginAnimations:@"crossfade" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
view1.alpha = 0.0;
view2.alpha = 1.0;
[UIView commitAnimations];

注:UIViewの便利なメソッドではなく、ブロックベースのアニメーションメソッドを実際に使用する必要があります。上記のUIViewのメソッドを使用したのは、非常に理解しやすく、メモリから簡単に入力できるためです。ただし、ブロックの使用はそれほど難しくありません。

補遺: UIViewAnimationEaseInOutが気に入らない場合は、タイミング、タイムスペース、CAAnimationで説明されているように、独自のタイミング関数を作成できます。これは、上記の単純なアニメーションよりも少し高度ですが、必要なすべての制御を提供します。


シグモイド!すでに一歩近づいています、ありがとう!setAnimationCurveは以外のパラメーターを受け取るため、指定したコードはすぐには機能しませんkCAMediaTimingFunctionEaseInEaseOut。もしかしてUIViewAnimationCurveEaseInOut?その曲線との問題は、単純な加算で2つのα値が等しくなる任意の時点で、同じかかわらず(中央にディップ)である1.0私の手動で微調整曲線のように、それが超える必要がある場合、1.0所望の結果を得るために。
謝罪者

なるほど...あなたは定数について正しいです-答えのコードを更新しました。また、独自のタイミング関数を作成する方法を説明するドキュメントへのリンクを追加しました。
カレブ

アニメーションはブロックで行いますが、要点は同じです。組み込みの曲線は、対称性のためにまだ適用されませんが、補遺は、After Effectsビデオで使用したものと一致するカスタムCAMediaTimingFunctionへの道を開きました。問題は、すべてのシナリオ適合するシグモイド曲線ないことであり、不透明度の開始レベルが異なると、「ディップ」を取り除くために異なるベジェ位置が必要になります。私が欠けている何かがあるに違いありません。
謝罪者

こんにちは、@ Caleb、サンプルプロジェクトをGitHubに投稿しました(投稿を参照)。カスタムタイミングは役立ちますが、initialTransparency値を変更しても意味がありません。あなたは次に何をしようとするのか分からないでしょうか?
謝罪者

2
Googleの検索を支援するためのもう少しのビット; グラフィックプログラマーは、あなたが話しているグラフを「スムーズステップ」と呼びます。高度に洗練されたプログラマーは、しばしば「エルミート補間器」と呼びます。そして、三角法なしで計算する簡単な方程式は、「3t ^ 2-2t ^ 3」です。
トレバーパウエル

1

コンピューターグラフィックスでは、この種の関数はsmoothstepと呼ばれます。クロスフェードに使用する場合、コンポジションのグローバルアルファ値を決定します。

入力画像にアルファチャンネルがある場合は、まずアルファがあらかじめ乗算されていることを確認する必要があります。次に、alpha各チャネル[ X = A*alpha + B*(1-alpha)]でsmoothstep を使用して、クロスフェード合成を簡単に実行し、妥当な結果を期待できます。


0

指数減衰関数を使用できます。

Alpha1(time) = 1 - exp(-time / (0.2 * transitionTime)); // fade in
Alpha2(time) = 1 - Alpha1(time); // fade out

グラフは次のようになります。

Alpha1(time) = sin(time * 0.5 * pi / transitionTime); // fade in
Alpha2(time) = cos(time * 0.5 * pi / transitionTime); // fade out

@Dannyに感謝します。実際、1 - Alpha1(time)2つのブレンドされた0.5アルファ画像は1.0アルファの合成画像にはならないため、方程式を実行してもディップは処理されません。私が描いたカスタムカーブは、垂直にミラーリングされていません。
謝罪者

1
1アルファは指数関数的減衰用であり、より適切だと思います。罪のために/コース罪(T)= SQRT(1-SQR(COS(t))との機能COS、しかし、それぞれを個別に計算するより高速であるべきである。
ダニーVarod

問題が同様の曲線の関数がどのように見えるかである場合、数学は正しいです。ただし、問題は2色の混合の処理方法です。たとえば、40%青+ 40%青を取得して80%青にする方法です。
謝罪者

これは簡単ですが、色の合計が100%を超えると、彩度が悪くなります。
ダニーヴァロード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.