之前寫了談談文字圖片像素化,主要是為了將文字和圖片像素化后的坐標提取出來,而本篇所講即為像素化后的粒子化過程。
先上一個簡單的demo -> 粒子化demo,本篇的目的就是為了講解怎樣做這樣的簡單demo(大牛請無視);同時會介紹一些優秀的demo供大家參考。
主要思路
首先我們談談粒子化的主要思路。
像素化后(不知道怎樣像素化,參考談談文字圖片像素化),我們得到了所需圖像或者文字的具體坐標,我們將它們形象地用一個個的粒子表示(這里用了圓形),得到的坐標即是粒子的最終位置。粒子的初始位置在哪里?粒子從初始位置到最終位置的運動又是如何?這些是我們可以自由發揮的。所以粒子化過程究其根本,就是怎樣表示粒子的運動過程。
基本准備
- canvas自適應電腦屏幕(不出現滾條):
css部分:
body {margin:0; padding:0; wdith:100%; height: 100%} canvas {display:block; background-color:#000}
js部分:
window.canvas = document.createElement('canvas'); document.body.appendChild(window.canvas); canvas.height = window.height = window.innerHeight; canvas.width = window.width = window.innerWidth;
- 關於像素化再補充幾句:
像素化過程簡單描述就是將所需的文字fillText到畫布上或者將圖片drawImage到畫布上(設置一個離屏的canvas),然后利用getImagedata這個api將像素點提取出來。值得注意的是getImagedata並不會獲取背景點的像素,所以canvas的背景使用怎樣的顏色並不會影響像素點的提取。
一般像素點的提取是根據某個像素點rgba的a值進行判斷,a值的取值是0~255(rgba當做顏色屬性賦值時a的取值是0~1),通常做法是判斷a值非0或者半透(>125)。這里我也做了個簡單的測試,當color值取black或者#000時,a值如下:
- 關於陰影
粒子化效果一般在黑夜最漂亮,所以背景我一般設置成黑色。如果要更帶感,需要一點陰影效果。
其實很簡單,調整一下透明度即可。比如這樣:
- 粒子具有的屬性:
粒子運動
之前我說過,以上皆是鋪墊,運動才是粒子化的關鍵。因為粒子最終要匯聚成一定的形狀,所以運動的某一段的終點已知,那么粒子怎樣能運動到對應的位置?
我們從最簡單的直線運動說起。
- 直線運動:
如何用js描述一個直線運動?首先我們要明白在怎樣的情況下物體會做直線運動?學過物理我們知道速度和加速度在一條直線時,物體做直線運動。
- 曲線運動:
update: function() { var v = this.pos2.minusNew(this.now); var angle = v.getAngle(); this.v.x = (this.v.x + this.a * Math.cos(angle) / 1000 * 60) * 0.96; this.v.y = (this.v.y + this.a * Math.sin(angle) / 1000 * 60) * 0.96; this.now.x += this.v.x; this.now.y += this.v.y; }
a表示粒子的加速度值,/1000*60表示每幀的速度增加,*0.96模擬能量損失。這樣的運動的話粒子通過曲線運動就能到達指定位置。
模擬屏幕左上角到屏幕中心的曲線運動:
- 關於緩動:
update: function() { var v = this.pos2.minusNew(this.now); v.scale(0.05); this.now.add(v); }
- 二維三維:
關於創意
其實粒子化本身並不難,難的是創意。這里稍微介紹幾個有創意的demo。
codepen上的一個demo,代碼很長,其實實現思路也大同小異,就是變着花樣的粒子的運動。
同樣只是粒子的運動,只是多了點創意,構造了動態文字效果。
總結
文字圖片粒子化其實就是粒子系統的一部分,不妨可以從最簡單的一個粒子系統開始,一步步實現一個簡單的粒子化demo。
覺得不盡興,可以參考下面更多文章:
- 令人震撼的表白,你hold住嗎?
- 用JavaScript玩轉游戲物理(一)運動學模擬與粒子系統
- 事情沒有想象中那么難--JX官網首頁3D粒子效果
- 隨便談談用canvas來實現文字圖片粒子化
- canvas學習筆記:小小滴公式,大大滴樂趣
- html5 canvas 粒子特效