我想創建一個具有相同動畫曲線的自定義動畫,如果我使用的是CAMediaTimingFunction
(我在OpenGL中做動畫,所以我無法使用它)。我還想遠離UIKit
,因爲我希望它儘可能多平臺。使用立方貝塞爾函數的自定義動畫
CAMediaTimingFunction
使用三次Bezier函數從已經過去的時間計算動畫進度。我不知道它是如何做到的。
據我瞭解,三次貝塞爾函數參數化定義,當您試圖從他們那裏獲得笛卡爾式它變成凌亂。
要清楚:我想要一個方法,它接受一個x值輸入並返回一個沿三次貝塞爾曲線的y值輸出。控制點將從(0,0)到(1,1)被限制。
我打算做下面的函數使用參數方程兩次每個點(一次x
,一旦y
)的產生點(如100)的貝塞爾曲線的軌跡,使用到1
static inline CGFloat bezierFunc1D(CGFloat t, CGFloat p0, CGFloat p1, CGFloat p2, CGFloat p3) {
return
(1-t)*(1-t)*(1-t) * p0
+ 3 * (1-t)*(1-t) * t * p1
+ 3 * (1-t) * t*t * p2
+ t*t*t * p3;
}
100個值的t
從0
這是p0
通過到p3
是控制點和t
是參量的標量從0
到1
。我可以通過預先計算t
的平方和立方值來相當容易地對此進行優化。
然後,我要使用線性插值來生成一個點陣列,其中x
的值是線性分離的(例如x = 0.01, 0.02... 0.99
),然後使用此數組來定義我的動畫進度。
這是要去了解這個問題的最好方法是什麼?對於一個非常簡單的任務來說,這似乎是一個相當密集的過程,儘管它可能都是在啓動時預先計算好的。
我上this question看到回答者建議簡單地刪除x
和定義功能y
對t
。 但是,這會給出非常不準確的結果,因爲從0.0
到1.0
的線性貝塞爾曲線不會線性生成動畫。
有沒有更有效的方法呢?
有誰知道蘋果在CAMediaTimingFunction
如何實現這個還是有一個圖書館,在那裏,獲得相同的結果呢?
還是有使用三次貝塞爾函數,這將使在兩個進出動畫的階段的平滑動畫曲線簡單的替代方案?
這聽起來像你的問題基本上是,退房http://stackoverflow.com/a/26131682/ 77567和http://stackoverflow.com/a/17227585/77567和http://stackoverflow.com/a/13667092/77567 –
那麼這些問題集中在使用'CGPath'繪製貝塞爾曲線。我很抱歉,如果我沒有在問題中明確表達出來,但是我想盡可能遠離UIKit,因爲我在OpenGL中這樣做,並希望它像多平臺一樣可能。也沒有一個實際上幫助獲得Bezier曲線的一組線性值(你不能從CGPath中讀取一組點,你只能沿着它進行渲染)。 – Hamish
如果您需要多平臺答案,您應該從標籤中取出'ios'。順便說一句,那些答案** do **使用'CGPathCreateCopyByDashingPath'複製函數沿'CGPath'讀取一組線性值。 –