2016-11-29 62 views
0

我必須爲正在離線計算的元素的alpha生成動畫。讓我們談談簡單的alpha動畫。阿爾法是零,阿爾法增長到1,停留一段時間,並回到零。如何爲離線渲染創建貝塞爾/立方體簡化動畫?

類似下面的圖形:

enter image description here

的動畫會有不同的時間。我需要一些我可以給予時間(t)並獲得價值(v)的東西。

這部動畫是放在一個CIFilter基於類內,用於動態顯示過濾器,因爲這種過濾器的結果將被計算離線沒有CALayer添加它,所以使用CAKeyframeAnimationCABasicAnimation是毫無疑問的。

如果我可以用一個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

請注意,您顯示的曲線不能用單個三次曲線進行渲染。您可能需要多條曲線,或者 - 因爲這是一條正常的函數曲線,而不是一條可以回溯自身的曲線 - 您應該用一個普通的舊式'y =(fx)'函數對其進行建模。貝塞爾曲線對於這種類型的函數是不必要的並且適得其反。 –

+0

@ Mike'Pomax'Kamermans - 謝謝你,我已經使用了平滑的想法,它現在像絲綢一樣工作。謝謝你,聖誕快樂! – SpaceDog

回答

1

你正在繼承CIFilter和動畫...我認爲這意味着你的過濾器類需要一個時間參數,並根據它改變其結果?

如果是這樣,有兩種選擇,你可以看看。兩者都依賴於這樣一個事實,即您所需的時間曲線看起來像是一條「易於出入」的S曲線,然後是該曲線的反向曲線。

  1. 如果你正在寫CI核心語言的代碼來實現你的過濾器的效果,可以插值基於使用the smoothstep function您的時間參數(即功能由GLSL定義,CI內核語言GLSL的超集,除了其中defined otherwise既然你有一個雙S曲線,你需要做兩次。

    // pseudo CI Kernel source: 
    effect = smoothstep(0, 0.5, time) - smoothstep(0.5, 1, time) 
    
  2. 如果你不寫一個內核,但在其他過濾器方面,而不是實現一個過濾器,你可以定義您自己的smoothstep功能的等價物 - 該定義是well known並且相當簡單,因爲它在很多圖形庫中。 (或者您可以瞭解一般情況下的Hermite interpolation,並使用您自己的平滑功能進行調整。)然後根據您的時間參數使用您的功能將輸入更改爲內部過濾器。

+0

感謝您的回答。你提供的鏈接提供了關於這個'clamp'函數的討論:'x = clamp((x-edge0)/(edge1 - edge0),0.0,1.0);'你有沒有機會知道這個鉗子做了什麼或者有一些算法的代碼需要做到這一點? – SpaceDog

+0

檢查我也鏈接的GLSL參考;你應該在那裏找到夾子。要點:它將輸入變量「夾」到一個定義的範圍內,如0 rickster

+0

輝煌,問題解決了! – SpaceDog