javaScript之高級(jí)緩動(dòng)—彈動(dòng)

彈動(dòng)是動(dòng)畫(huà)編程中最重要和最強(qiáng)大的物理概念之一忌穿。你幾乎可以用彈動(dòng)來(lái)做任何事情连躏,這是一項(xiàng)強(qiáng)大的技術(shù)石景。接下來(lái)讓我們一起來(lái)看看如何實(shí)現(xiàn)彈動(dòng)更舞。

彈動(dòng)原理

在開(kāi)始寫(xiě)代碼之前畦幢,我們先弄明白彈動(dòng)的原理是什么。我們可以模擬一下整個(gè)過(guò)程缆蝉。
假設(shè)小球的起始點(diǎn)位置在x軸的0點(diǎn)宇葱,它的速度vx = 0,目標(biāo)點(diǎn)在x軸的100點(diǎn)上刊头;假設(shè)彈性系數(shù)為0.1黍瞧,用變量spring表示,摩擦系數(shù)為0.95原杂,用變量friction表示印颤。下面是過(guò)程:

  1. 用距離(target = 100)乘以彈性系數(shù)spring,得到加速度ax = 10穿肄,將它加在vx上年局,速度vx = 10。把vx加在小球的位置上被碗,小球的x = 10某宪。
  2. 下一輪,距離變成target = 90锐朴,ax = 90 * 0.1即ax = 9,加在vx上蔼囊,vx = 19焚志,小球的x = 29衣迷。
  3. 再下一輪,target = 71酱酬,ax = 7.1壶谒, vx = 26.1, 小球的x = 55.1膳沽。
  4. 再下一輪汗菜,target = 44.9,ax = 4.49挑社, vx = 30.59陨界, 小球的x = 85.69。

......

隨著小球一幀一幀的靠近目標(biāo)痛阻,加速度變得越來(lái)越小菌瘪,但速度一直在增加;幾輪過(guò)后阱当,小球越過(guò)了目標(biāo)點(diǎn)俏扩,到達(dá)了x軸上的117點(diǎn)。此時(shí)目標(biāo)點(diǎn)的距離現(xiàn)在是taget = 100 - 117即-17弊添,加速度就是ax = -1.7 录淡,小球開(kāi)始減速。如此往復(fù)油坝,最終到達(dá)目標(biāo)點(diǎn)嫉戚。

但這邊還有一個(gè)問(wèn)題,就是它永遠(yuǎn)不會(huì)停下來(lái)免钻,這是因?yàn)樾∏虻臄[動(dòng)幅度不變彼水,在某個(gè)點(diǎn)的速度不會(huì)減小,因此會(huì)一直彈下去极舔。需要摩擦力讓它停下來(lái)凤覆。我們創(chuàng)建一個(gè)friction變量來(lái)表示摩擦系數(shù),初始值為0.95拆魏。下面讓我們開(kāi)始實(shí)現(xiàn)代碼盯桦。

完整代碼
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Easing</title>
  </head>
  <body>
       <canvas id="canvas" width="400" height="400"></canvas>
       <script src="../js/ball.js"></script>
    <script>
      window.onload = function () {
        var canvas = document.getElementById('canvas'),
            context = canvas.getContext('2d'),
            ball = new Ball(),
            spring = 0.03, // 彈性系數(shù)
            friction = 0.95, // 摩擦系數(shù)
            targetX = canvas.width / 2,
            vx = 0;

        ball.y = canvas.height / 2;

        (function drawFrame () {
            window.requestAnimationFrame(drawFrame, canvas);
            context.clearRect(0, 0, canvas.width, canvas.height);

            var dx = targetX - ball.x,
                  ax = dx * spring;

            vx += ax;
            vx *= friction;
            ball.x += vx;
          
            ball.draw(context);

        } ())
      }
    </script>
  </body>
</html>

javascript部分:


// ball.js
function Ball (radius, color) {
    color = color || '#ff0000';
    this.radius = radius || 40;
    this.color = utils.parseColor(color);
    this.x = 0;
    this.y = 0;
    this.rotation = 0;
    this.vx = 0;
    this.vy = 0;
    this.scaleX = 1;
    this.scaleY = 1;
    this.lineWidth = 1;
}

Ball.prototype.draw = function (context) {
    context.save();
    context.translate(this.x, this.y);
    context.rotate(this.rotation);
    context.scale(this.scaleX, this.scaleY);
    context.lineWidth = this.lineWidth;
    context.fillStyle = this.color;
    context.beginPath();
    context.arc(0, 0, this.radius, 0, (Math.PI * 2), true);
    context.closePath();
    context.fill();
    if (this.lineWidth > 0) {
        context.stroke();
    }
    context.restore();
}

好了,我們已經(jīng)簡(jiǎn)單的實(shí)現(xiàn)了一個(gè)完整的彈動(dòng)渤刃,雖然只是在一維坐標(biāo)上拥峦。玩玩看,嘗試改變 spring 和 friction 的值卖子,觀察效果的變化略号。

這里還有個(gè)問(wèn)題,雖然小球看起來(lái)已經(jīng)停下了,但是代碼還在一直運(yùn)行玄柠,浪費(fèi)了系統(tǒng)資源突梦,因?yàn)樾枰覀兗右恍┐a來(lái)判斷是否停止計(jì)算:

if (Math.abs(vx) < 0.001) {
    ball.x = targetX;
    window.cancelRequestAnimationFrame(animRequest);
}
else{
ball.x += vx;
}

好了。感謝你的閱讀羽利,希望能幫到你宫患。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市这弧,隨后出現(xiàn)的幾起案子娃闲,更是在濱河造成了極大的恐慌,老刑警劉巖匾浪,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皇帮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡户矢,警方通過(guò)查閱死者的電腦和手機(jī)玲献,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梯浪,“玉大人捌年,你說(shuō)我怎么就攤上這事」衣澹” “怎么了礼预?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虏劲。 經(jīng)常有香客問(wèn)我托酸,道長(zhǎng),這世上最難降的妖魔是什么柒巫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任励堡,我火速辦了婚禮,結(jié)果婚禮上堡掏,老公的妹妹穿的比我還像新娘应结。我一直安慰自己,他們只是感情好泉唁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布鹅龄。 她就那樣靜靜地躺著,像睡著了一般亭畜。 火紅的嫁衣襯著肌膚如雪扮休。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天拴鸵,我揣著相機(jī)與錄音玷坠,去河邊找鬼蜗搔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侨糟,可吹牛的內(nèi)容都是我干的碍扔。 我是一名探鬼主播瘩燥,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秕重,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了厉膀?” 一聲冷哼從身側(cè)響起溶耘,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎服鹅,沒(méi)想到半個(gè)月后凳兵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡企软,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年庐扫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗哨。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡形庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厌漂,到底是詐尸還是另有隱情萨醒,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布苇倡,位于F島的核電站富纸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旨椒。R本人自食惡果不足惜晓褪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望综慎。 院中可真熱鬧涣仿,春花似錦、人聲如沸寥粹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涝涤。三九已至媚狰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阔拳,已是汗流浹背崭孤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工类嗤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辨宠。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓遗锣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嗤形。 傳聞我的和親對(duì)象是個(gè)殘疾皇子精偿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 看了很多視頻、文章赋兵,最后卻通通忘記了笔咽,別人的知識(shí)依舊是別人的,自己卻什么都沒(méi)獲得霹期。此系列文章旨在加深自己的印象叶组,因...
    DCbryant閱讀 727評(píng)論 0 2
  • 8086匯編 本筆記是筆者觀看小甲魚(yú)老師(魚(yú)C論壇)《零基礎(chǔ)入門(mén)學(xué)習(xí)匯編語(yǔ)言》系列視頻的筆記达吞,在此感謝他和像他一樣...
    Gibbs基閱讀 37,237評(píng)論 8 114
  • 對(duì)于一個(gè)長(zhǎng)得有點(diǎn)像學(xué)妹的小學(xué)姐來(lái)說(shuō),被邀約去以嘉賓的身份參加各種活動(dòng)荒典,每次著實(shí)會(huì)感到寵辱若驚酪劫。可是寺董,又有什么辦...
    不扎人的刺猬閱讀 561評(píng)論 1 1
  • 老公覆糟,出差
    飄搖的日子閱讀 280評(píng)論 0 0
  • Recitation 4 Use your own word to describe “end-to-end” a...
    dynamicheart閱讀 733評(píng)論 0 0