最近想寫小冊的心思越來越重,直到有人告訴了我....我的等級不夠,掘力值不夠,閱讀量不夠,好吧,我承認我哭了
我問了一下,好像學生證不給打折,真殘暴.
基本緩動
基本的緩動常見的有勻速運動,也可以"緩入""緩出",當然也包含了正弦,躍動等效果。
緩動的作用可以將一個物體移動到另外的地方,放置到空間中,可以對比出X1(x,y)
與x2(x,y)
,在緩動中,包含了幾個比較重要的要素
起點與目標點
比例係數
整體來說,可以總結為這兩個,因為整個計算的過程都是在維護這兩個要素資料,看一段程式碼
var easing = 0.5 //比例係數
var ori = new Vector(0,0), //起始位置
target = new Vector(20,20), //目標點
ball.pos = new Vector(0,0)
var to = ori.subtrac(target).dot(easing) //遞增量(20 - 0,20 - 0)*0.5 = (10,10)
ball.pos.add(to) 複製程式碼
也就是意味著每次更新都會增加5個增量,兩次到達,這也就是勻速緩動的原理,稍微加工一下
var easing = 0.5 //比例係數
var ball.pos = new Vector(0,0), //起始位置
target = new Vector(20,20), //目標點
var to = ball.pos.subtrac(target).dot(easing) //遞增量(20 - x,20 - y)*0.5 = (x1,y1)
ball.pos.add(to) 複製程式碼
我們會發現每次更新的時候,ball的pos都會更新,這導致在計算增量的時候,每次都會有不一樣的值,這也使得ball的移動每次都不一樣,而且是越來越慢,是不是感覺有點像緩出了,可是還是感覺不太一樣。看一下別人的程式碼。
緩動
緩動這裡需要維護的要素就多了不少,也是目前大多數的緩動演算法通用的幾個引數,至於少數的那幾個我不知道,我也沒敢問
t:time:緩動經歷過的時間
b:beforeMove:起始位置
c:changeDistance:起始位置與目標位置的距離,也就是距離上的一個變化量
d:duration:我們要求物件從起始位置移動到目標位置所需的時間,也就是緩動的總時長
function easeIn (t,b,c,d){
return c*t/d + b;
}複製程式碼
分析一下這個程式碼,用c乘以這個時間t佔緩動總時長d的比例,可以得到移動的距離,再加上初始位置就是下一次緩動的值,是不是清晰了很多
由於y越來越大,這也導致下一次的值越來越大,實現了位移越來越大的效果,也就是緩入,緩出的效果只需要返回值越來越小就好
function easeOut (t, b, c, d){
return -c*t/d + b;
}複製程式碼
緩動的效果是作用於速度的,所以在處理緩動的效果的時候,可以利用很多的數學模型
Linear:無緩動效果,f(t) = t;
Quadratic:二次方的緩動,f(t) = t^2;
Cubic:三次方的緩動,f(t) = t^3;
Quartic:四次方的緩動,f(t) = t^4;
Quintic:五次方的緩動,f(t) = t^5;
Sinusoidal:正弦曲線的緩動,f(t) = sin(t);
Exponential:指數曲線的緩動,f(t) = 2^t;
Circular:圓形曲線的緩動,f(t) = sqrt(1 – t^2);
也許你會發現這些公式都是操控t(時間)的,你當我是奇異博士嗎?
有了時間跟位移,難道不是速度嗎....
好了,下一個知識點,我趕時間去掙掘力
這裡歡迎大家提出在開發中遇到的動畫與互動問題,我會即時回答的,包括實現與演算法方面,我會第一時間來回復~
也歡迎大家投幣餵養與介紹富婆