canvas動畫包教不包會:速度與加速度

2018-06-19 15:22 更新
      在上兩章中,我們介紹了數(shù)學(xué)中三角函數(shù)的概念和使用,在這一章中,我們將介紹物理知識:速度向量與加速度。

真是坑爹!學(xué)完數(shù)學(xué)又要學(xué)習物理,真的是回到了初中......,不過你放心,這里介紹的都不是深奧的物理知識。

這一章的內(nèi)容包括:
  1. 速度向量
  2. 加速度
  3. 附錄:重要公式

1、速度向量
速度向量和速度并不等同,后者僅僅是前者的一部分,前者還包括了一個重要因素:方向,因此,速度向量也可以說是某個方向上的速度。

方向在動畫中是極其重要的,就比如說,你做一個賽車游戲,要是連方向都搞不清楚,那豈不是常常發(fā)生連環(huán)車禍。

我們可以將速度向量分為兩種:單軸上的速度向量和雙軸上的速度向量

1.1 單軸上的速度向量
單軸上的速度向量也就是把速度向量只放到X軸(水平運動)或Y軸(垂直運動)上。

如上圖所示,單軸上的速度向量可以有四個方向:

var vx = 1;  //定義x軸速度

var vy = 1;  //定義y軸速度

沿x軸正方向:ball.x += vx;

沿x軸反方向:ball.x -= vx;

沿y軸正方向:ball.y += vy;

沿y軸反方向:ball.y -= vy;

接下來我們模擬四個方向的運動(點擊增加球按鈕,隨機生成四個方向運動圓球,在碰到邊界時,會將速度 v 變?yōu)樗俣鹊呢撝?-v ,讓其反方向運動):

關(guān)鍵代碼:

ball.x += ball.speed.x;

// 或   

ball.y += ball.speed.y;

這段代碼就是讓圓球沿著x軸或y軸運動。
邊界檢測(下一章會講到)和反方向運動:

if(ball.x >= (canvas.width-ball.radius*2) || ball.x <= 0){   

  ball.speed.x = -ball.speed.x;   

};


注意:canvas上的Y坐標軸的方向是和普通坐標軸的方向相反,如不清楚,可到三角函數(shù)那一章看坐標圖,這里就不貼出了。

1.2 雙軸上的速度向量
我們也可以將雙軸上的速度向量看做是任意方向上運動。

下面做一個實例,就好像發(fā)射炮彈一樣:

重要代碼:

ball.x += 5;   

ball.y += 4;

x軸的速度定為5,y軸的速度定為4。

當然,像上面這樣直接在x方向和y方向上增加速度的情況比較少見,更多時候,我們都是知道物體在某個方向上以一定速度運動,這時,我們就需要求x方向和y方向上的速度了,怎么求呢?

接下來就要用到之前介紹的三角函數(shù)了。

舉個例子:一個物體以每幀1像素的速度向45°(θ = 45°,v = 1)的方向移動

就像上圖一樣,我們可以將速度v分解成vx和vy,這恰好就是x方向和y方向。我們已經(jīng)知道一個角θ=45°,還有一條斜邊v = 1,那利用Math.cos與Math.sin函數(shù)就可以很簡單的求到vx和vy了。

vx = Math.cos(45 * Math.PI / 180) *1;

vy = Math.sin(45 * Math.PI / 180)*1;

獲得了vx和vy,我們就可以像單軸上的速度一樣分別給x方向和y方向添加速度了。

注意:一個物體隱含了許多可供調(diào)整的屬性,并不僅僅局限于速度,還有旋轉(zhuǎn)速度、顏色深淺等等,要想讓物體做更多的動畫效果,就必須學(xué)會將速度變化的原理應(yīng)用到其他屬性上,俗稱舉一反三。

2、加速度
加速度也是向量,包括了方向,一般用a來表示加速度。

講到加速度,在生活中最明顯的就是汽車啟動了,當你啟動汽車,踩下油門,汽車的速度就會增加,從0開始,過一兩秒后,速度將提升到每小時5~6公里,隨后又變成10公里每小時等。

從計算的角度來看,加速度就是增加到速度向量上的數(shù)值。

加速度也可分為:單軸加速度和雙軸加速度

2.1 單軸加速度
單軸加速度和單軸上的速度向量類似,也是只沿著x軸或y軸運動,同樣有四個方向。

看例子(你可以按鍵盤左鍵和右鍵看看):

當你按左鍵時,你會發(fā)現(xiàn)速度越來越慢,多度減速時甚至反方向運動了,當你按右鍵時,速度回越來越快,最后飛出了canvas。

ball.speed.x += ax;   

ball.x += ball.speed.x;


function keyLeft(){   

  ax += (-0.01);   

};   

function keyRight(){   

  ax += 0.02;   

};

window.tool.captureKeyDown({"37":keyLeft,"39":keyRight});  // 這事件在用戶交互一章中已封裝的


2.2 雙軸加速度
雙軸加速度和雙軸上的速度是同一個道理,通過加速度分解,你可以得到x軸上的加速度和y軸上的加速度,這里就不出例子了,你可以試著改變上面的例子,給物體加入一個任何角度的加速度。


2.3 重力加速度(g)

我想大家對重力加速度并不陌生,這是我們在生活中感覺最明顯,比如你往上跳一跳,隨后便會自然落下,這就是給你添加了一個重力加速度。


重力加速度簡單來說就是y軸上的一個加速度,在計算加速度時,我們只需將重力加速度g添加到每一幀的vy(y軸上的加速度和)屬性上就可以了。


我們來模擬一下重力加速度(點擊按鈕):

原理:小球從空中自由降落至地面,然后彈起,循環(huán)往復(fù),直到它最終速度為零停留在地面。



代碼解析:

var g = 0.3;   //重力加速度

var bounce = -0.7;  //反彈系數(shù)

//邊界檢測

if(ball.y >= (canvas.height - ball.radius * 2)) {   

  ball.y = canvas.height - ball.radius * 2;   

  ball.speed.y *= bounce;  //反復(fù)相乘,最后趨近于0   

};   

ball.speed.y += g;   

ball.y += ball.speed.y;


總結(jié)

  • 速度和加速度是動畫的基礎(chǔ)元素,其中兩者都是向量,包括了一個重要因素:方向。
  • 要學(xué)會應(yīng)用 分解 和 合成 ,將速度或加速度分解到x、y軸上,然后將每條軸上的加速度或速度相加,然后再分別與物體的位置坐標相加。 


附錄:

總要公式:

(1)將角速度分解為x、y軸上的速度向量

vx = speed * Math.cos(angle)

vy = spedd * Math.sin(angle)


(2)將角加速度分解為x、y軸上的加速度

ax = force * Math.cos(angle)

ay = force * Math.sin(angle)


(3)將加速度加入速度向量

vx += ax;

vy += ay;


(4)將速度向量加入位置坐標

object.x += vx;

object.y += vy;


下一章:邊界與摩擦力



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號