Mükemmel crossfade


25

Bu sorunu kelimelerle tarif etmekte zorlanıyorum, bu yüzden onu açıklamak için bir video (45 saniye) yaptım. İşte soruların bir ön izlemesi: Lütfen Vimeo'ya bir göz atın: http://vimeo.com/epologee/perfect-crossfade

Doğrusal bir çapraz geçiş kullanarak, elde edilen görüntünün saydamlıkta bir 'dip' olacak.  Bunu nasıl önleyebilirim?

Kusursuz bir çarpışma oluşturma veya iki görüntü veya şeklin çözülmesi sorunu, son on yılda birkaç alanda bana tekrar edildi. Önce video düzenlemede, sonra Flash animasyonda ve şimdi iOS programda. Google'a göz atmaya başladığınızda, bulunacak birçok geçici çözüm var, ancak bu sefer hack olmadan bunu gerçekten çözmek istiyorum.

Özet:
Elde edilen saydamlığın ikisinin de orijinaliyle eşleşmesini istiyorsanız, yarı saydam, aynı renkli bitmaplerin çapraz geçişinde uygulanacak teknik veya eğrinin adı nedir?

Solmaya sırasında gerekli kısmi şeffaflık / alfa değerlerini hesaplamak için (matematiksel) bir fonksiyon var mı?

Benzer bir ön ayar olarak bu işlevlere sahiptir dilleri, orada programlama ease in, ease outya ease in outActionScript veya kakao içinde bulunan işlevleri?

Güncelleme: Videoya ek olarak, örnek bir proje (Xcode ve iOS SDK gerektirir) yaptım ve github'a gönderdim. Video ile aynı animasyonu gösterir, ancak bu sefer kareler: https://github.com/epologee/StackOverflow-Example-Code


7
Bu konuda hiçbir şey bilmiyorum ama video için +1
sebastiangeiger

Aşırı operatörün nasıl uygulandığına bağlıdır. Bkz en.wikipedia.org/wiki/Alpha_channel
artistoex

Kabul ediyorum, @ artistoex, operatöre göre bir şey var, bağlantı için teşekkürler! Ancak, cevap orada bir yerde gömülü ise, göremiyorum :(
epologee 13:11

Aşırı operatörün matematiksel gösterimi bir denkleme yol açar. Operatöre örnek: C = alfa * c1 + (alfa-1) * c2, alfa = (C + c2) / (c1 + c2) (C, iki renk c1, c2'nin karıştırılmasının sonucudur) verir. Bunun anlamı, operatör üzerinden, durumunuzu karşılayan bir fonksiyon yoktur.
artistoex

C = alpha1 * c1 + alpha2 * c2 (0 <= alpha1, alpha2 <= 1) için şu işlev vardır: alpha1 = (C-alpha2 * c2) / c1.
artistoex

Yanıtlar:



3

Video düzenleme alanında adın ne olabileceğini bilmiyorum, ama eğriye S eğrisi veya sigmoid eğrisi derdim . Core Animation'ın kCAMediaTimingFunctionEaseInEaseOut zamanlama işlevini kullanarak iOS'ta aradığınız çapraz görüntüyü üretmek çok basit olmalı . alphaBu zamanlama işlevini kullanarak iki görünümün özelliğini zıt yönlerde (bir 0-> 1, bir 1-> 0) canlandırın :

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

Not: UIView'un uygunluk yöntemleri yerine gerçekten blok tabanlı animasyon yöntemlerini kullanmalısınız. UIView'un yukarıdaki yöntemlerini kullandım çünkü anlaşılması çok kolay ve bellekten yazması kolay. Yine de blok kullanmak çok daha zor değil.

Ek: UIViewAnimationEaseInOut'tan hoşlanmıyorsanız, Zamanlama, Zaman Alanları ve CAAnimation'da açıklandığı gibi kendi zamanlama işlevinizi oluşturabilirsiniz . Bu, yukarıda gösterilen basit animasyondan biraz daha gelişmiş, ancak istediğiniz tüm kontrolü size veriyor.


Sigmoid! Bu zaten bir adım daha yakın, teşekkürler! Sağladığınız kod parçası hemen çalışmaz, çünkü setAnimationCurve, dizinden farklı bir parametre alır kCAMediaTimingFunctionEaseInEaseOut. Bunu yapabilir miydin UIViewAnimationCurveEaseInOut? Bu eğri ile ilgili sorun aynıdır (ortadaki eğim), çünkü herhangi bir noktada, basit bir eklemedeki iki alfa değeri eşit olacaktır 1.0, burada manuel olarak bükülmüş eğrimdeki gibi 1.0istenen sonuçları elde etmek için aşılması gereken .
epologee

Şimdi anlıyorum ... sürekli olarak haklısın - Cevaptaki kodu güncelledim. Ayrıca, kendi zamanlama işlevlerinizi nasıl oluşturacağınızı açıklayan dokümanlara bir bağlantı da ekledim.
Caleb

Animasyonlarımı bloklarla yapıyorum, ama esas aynı. Yerleşik eğriler simetrileri nedeniyle hala geçerli değildir, ancak ek, After Effects videosunda kullandığımla eşleşen özel bir CAMediaTimingFunction işlevini açmıştır. Sorun, her senaryoya uyan tek bir sigmoid eğrisi olmaması , farklı başlangıç ​​opaklık seviyelerinin 'daldırmadan' kurtulmak için farklı çerçeve pozisyonları gerektirmesidir. Kaçırdığım bir şey olmalı.
epologee

Merhaba @Caleb, GitHub'a örnek bir proje gönderdim (yazıya bakınız). Özel zamanlama faydalıdır, ancak initialTransparencydeğeri değiştirirseniz, faydası olmaz. Bundan sonra ne deneyeceğine dair hiçbir fikrin yok mu?
epologee

2
Google aramalarına yardımcı olmak için birkaç küçük parça; grafik programcıları, bahsettiğiniz grafiği "sorunsuz adım" olarak adlandırır. Çok yüksek matematik programcıları genellikle "hermite enterpolatör" olarak adlandırır. Ve trigonometri olmadan bir hesaplamak için basit bir denklem: "3t ^ 2 - 2t ^ 3".
Trevor Powell

1

Bilgisayar grafiğinde, bu tür işlevlere yumuşak adım denir . Çapraz geçiş için kullanıldığında, kompozisyon için global alfa değerini belirler.

Giriş görüntülerinde bir alfa kanalı varsa, önce alfaın önceden beslendiğinden emin olmalısınız . Ardından, çapraz geçiş kompozisyonunu alphaher kanaldaki [ X = A*alpha + B*(1-alpha)] yumuşak adımını kullanarak basit bir şekilde yapabilir ve makul sonuçlar bekleyebilirsiniz.


0

Üstel çürüme fonksiyonunu kullanabilirsiniz:

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

Grafiğiniz daha çok benziyor:

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

@ Danny teşekkürler. Aslında, 1 - Alpha1(time)denklemin gerçekleştirilmesi eğimle ilgilenmez, çünkü iki harmanlanmış 0,5 alfa görüntü 1.0 alfa ile birleştirilmiş bir görüntüye neden olmaz. Çizdiğim özel eğriler dikey olarak yansıtılmıyor.
epologee

1
1-alfa, üstel çürüme içindi, ki bence daha uygun. Sin için / ders sin (t) = sqrt (1-sqr (cos (t)) fonksiyonları, çünkü, ancak, ayrı ayrı her bir hesaplama hızlı olması gerekir.
Danny Varod

Sorun, benzer bir eğrinin fonksiyonunun nasıl göründüğü idi ise, matematiğiniz doğru. Bununla birlikte sorun, iki rengin harmanlanması ile nasıl başa çıkılacağı, örneğin% 80 mavi +% 40 mavi elde edilmesidir.
epologee

Bunu yapmak kolaydır, ancak renklerin toplamı%> 100 olduğunda kötü görünümlü doygunluğa neden olur.
Danny Varod,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.