1. 程式人生 > >Three.js 粒子系統動畫與發光材質——利用HTML5畫布繪製

Three.js 粒子系統動畫與發光材質——利用HTML5畫布繪製

用Three.js做了個字型的粒子系統動畫,且`自定義性`極高,設定speedX=speedY=speedZ=1000的引數,截圖如下:

Three的三大基本元件:相機,渲染器,場景在這就沒必要說了吧,百度有很多資料
接下來我們分幾個步驟來講解如何做出這個粒子動畫


目錄:


1.思路敘述
2.建立文字幾何體並獲取點集
3.用HTML5畫布編寫發光粒子貼圖
4.建立粒子系統
5.如何完成粒子動畫
6.結束

一.思路敘述


1.建立文字幾何體,獲取點的集合,作為粒子動畫的終點(所以文字幾何體不用送入場景中!我們只是要個位置而已
2.選取一個起始點,建立粒子系統(粒子貼圖也包含在這部分)
3.編寫粒子動畫,使粒子系統動起來

二.建立字型


先看函式架構
 

let fontLoader = new THREE.FontLoader();
fontLoader.loag('字型包路徑',onLoad函式,onProgress函式,onError函式)


這裡注意字型包的選擇,不同字型包的幾何體Verctor的數量是不一樣的,這裡我選擇`optimer_bold.typeface.json`的字型包,大家可以在three.js的集合包中找到各種各樣的字型包
待字型包載入完後,我們便呼叫onLoad函式,建立字型
(先擷取onLoad函式的一部分,餘下的主要程式碼均寫在onLoad函式中)
 


function (font) {
    let fontOptions ={
        font:font,
        size:1000,
        height:20,
        fontWeight:'bold',
        curveSegments: 12,  //number of points on the curves
        bevelEnabled:true,
        bevelThickness:2,
        bevelSize:8,
        bevelSegments:5
    };
    geometry = new THREE.TextGeometry("Jonithan" ,fontOptions);
    geo_ver = geometry.vertices


注意在onLoad函式中傳入引數font,然後配置字型樣式fontOptions,接著生成字型幾何體geometry,然後就獲取點集
這樣我們就獲得了終點位置

三.編寫發光粒子貼圖


首先創造canvas,並且呼叫createRadialGradient方法,用於繪製漸變色,繪製漸變色的原理是設定好一組同心圓,用addColorStop方法在不同位置設定顏色,如下程式碼所示


function createLightMateria() {
let canvasDom = document.createElement('canvas');
canvasDom.width = 16;
canvasDom.height = 16;
let ctx = canvasDom.getContext('2d');
//根據引數確定兩個圓的座標,繪製放射性漸變的方法,一個圓在裡面,一個圓在外面
let gradient = ctx.createRadialGradient(
    canvasDom.width/2,
    canvasDom.height/2,
    0,
    canvasDom.width/2,
    canvasDom.height/2,
    canvasDom.width/2);
gradient.addColorStop(0,'rgba(255,255,255,1)');
gradient.addColorStop(0.005,'rgba(139,69,19,1)');
gradient.addColorStop(0.4,'rgba(139,69,19,1)');
gradient.addColorStop(1,'rgba(0,0,0,1)');


顏色繪製好後我們把顏色配置給ctx,並繪製貼圖,等會用於與粒子map
程式碼如下


//設定ctx為漸變色
ctx.fillStyle = gradient;
//繪圖
ctx.fillRect(0,0,canvasDom.width,canvasDom.height);

//貼圖使用
let texture = new THREE.Texture(canvasDom);
texture.needsUpdate = true;//使用貼圖時進行更新
return texture;
}


這樣,我們等會就直接拿return的texture作為貼圖

四.建立起始點粒子系統


接下來我們就可以創造粒子系統了,先說一下我們要用到的三個api 
new Three.Geometry()
new Three.PointsMaterial()
new Three.Points()

思路:建立一個原點Geometry,遍歷向Geometry.vertices推入起始點,再呼叫new Three.Points()傳入Geometry和粒子配置生成粒子系統

首先做好粒子配置:


pointsMaterial = new THREE.PointsMaterial({
    color:0xffffff,
    size:80,
    transparent:true,//使材質透明
    blending:THREE.AdditiveBlending,
    depthTest:false,//深度測試關閉,不消去場景的不可見面
    map:createLightMateria()//剛剛建立的粒子貼圖就在這裡用上
})


接著建立Geomotry和粒子系統


let[x,y,z] =[0,0,0];
let originGeo = new THREE.Geometry();
for (let i = 0; i <originParticleNum; i++){//迴圈建立Geo
    originGeo.vertices.push(new THREE.Vector3(x,y,z));
}
let originParticleField = new THREE.Points(originGeo,pointsMaterial);
return originParticleField;


這樣子就獲得原點粒子系統了

五.如何完成粒子動畫


先看看Three.js中的動畫是如何完成的


function animate() {
    threeConf.stats.begin();
    threeConf.renderer.clear();
    threeConf.renderer.render(threeConf.scene,threeConf.camera);
    threeConf.control.update();
    particleAnimate();//粒子動畫函式
    threeConf.stats.end();
    requestAnimationFrame(animate);
  }


即通過不停地呼叫animate函式,進行渲染,這個animate函式中的particleAnimate()函式就是我們的粒子動畫,particleAnimate函式中就改變點的位置

接下來我們就來編寫particleAnimate函式,先貼完整程式碼再講過程


function particleAnimate () {
    for(let i = 0; i < pointsNum; i++){
        let originP = originVer[i],
            destiP =  destiVer[i];
        let distance = Math.abs(originP.x - destiP.x) + Math.abs(originP.y - destiP.y) + Math.abs(originP.z - destiP.z);
        if (distance > 1){
            //利用距離與座標差的餘弦值
            originP.x += ((destiP.x - originP.x)/distance) * speedX * (1 - Math.random());
            originP.y += ((destiP.y - originP.y)/distance) * speedY * (1 - Math.random());
            originP.z += ((destiP.z - originP.z)/distance) * speedZ * (1 - Math.random());
        }
    }
    originParticlae.geometry.verticesNeedUpdate=true;
}
```


先搞清楚給部分變數:
pointsNum:粒子數,
originVer:起始點集合,
destiVer:目標位置點集合(就是來自於TextGeometry),
speedX,speedY,speedZ分別表示點在各軸上每次移動的速度
originParticlae:起始點粒子系統
接下來講過程:


1.獲取起始點與目標點的大致距離


let distance = Math.abs(originP.x - destiP.x) + Math.abs(originP.y - destiP.y) + Math.abs(originP.z - destiP.z);

2.距離大於1時進行移動,這裡利用餘弦值進行距離的自增運算


if (distance > 1){
            //利用距離與座標差的餘弦值
    originP.x += ((destiP.x - originP.x)/distance) * speedX * (1 - Math.random());
    originP.y += ((destiP.y - originP.y)/distance) * speedY * (1 - Math.random());
    originP.z += ((destiP.z - originP.z)/distance) * speedZ * (1 - Math.random());
        }

3.最後設定更新粒子系統點為true


    originParticlae.geometry.verticesNeedUpdate=true;

六.結束


最後進行程式碼的整合
以上便是所有的重點思路,根據這個思路,寫好程式碼,就可以做出粒子動畫了。
嗯。

相關推薦

Three.js 粒子系統動畫發光材質——利用HTML5畫布繪製

用Three.js做了個字型的粒子系統動畫,且`自定義性`極高,設定speedX=speedY=speedZ=1000的引數,截圖如下: Three的三大基本元件:相機,渲染器,場景在這就沒必要說了吧,百度有很多資料 接下來我們分幾個步驟來講解如何做出這個粒子動畫

THREE.js 粒子系統

經常看到這樣一些場景:漫天飛舞的雪花、夜晚草叢中點點螢光、小河上下起的綿綿細雨… 這些浪漫??的效果都可以用粒子系統來實現,粒子系統用THREE.js實現就是通過Points或者Sprite類來實現的啦。 一、Points A class for d

使用WebGL + Three.js制作動畫場景

http hang log orm monitor 放置 tor mes quest 使用WebGL + Three.js制作動畫場景 3D圖像,技術,打造產品,還有互聯網:這些只是我愛好的一小部分。 現在,感謝WebGL的出現-一個新的JavaScriptAPI,它可以

[微信小遊戲+Three.JS]給場景添加反射材質,實現3D水珠移動效果

rac webgl round 圖片 nmap 微信小遊戲 ops In 繪制 前幾篇博客,我分別加好了3D移動盒子,也給場景加好了天空盒 這篇博客,就給場景再加一些效果 繪制的水珠的源代碼來自Three.JS在GitHub上的demo 小遊戲所用到的,修改過的JS庫

three.js粒子過度效果製作(二)

three.js粒子過度效果製作(二) 從圖片獲取粒子 下面演示的是粒子是從圖片中獲取的。採用的cpu的方式,普通geometry,單一顏色。 你也可以使用彩色圖片,並使用彩色粒子,效果會更好一些。 步驟 建立meshGeo,這個是粒子系統的載體,,它的頂點數量決定

three.js粒子過度效果製作(一)

three.js粒子過度效果製作(一) 粒子過度效果在很多網頁中經常簡單,可以實現從物體A過度到物體B。其原理是改變頂點的位置,按照預先設計好的路徑移動。 一種簡單的實現方式是,給出在A位置的所有頂點座標,給出B位置的所有頂點座標,然後通過過度的方式實現。下面演示一下從一個平面過度到

原生js製作勻速動畫輪播圖注意事項

筆者最近在創作輪播圖,碰到了不少坑,特此分享 1.輪播圖需要製作多一張圖片作為緩衝,使用cloneNode來實現: //1.1必須克隆li標籤,用來過渡動畫 $('ul').appendChild(lis[0].cloneNode(true)); 2.在製作勻速動畫

學習Three.js——粒子、點雲(Sprite,PointCloud)

粒子 使用THREE.SpriteMaterial()和THREE.Sprite()即可建立單個粒子 建立過程 function createSprites() { var material = new THREE.SpriteMaterial();

three.js:使用createMultiMaterialObject建立的多材質物件無法使用光線跟蹤Raycaster選中

建立多材質物件: var loader = new THREE.DDSLoader(); var map = loader.load('../assets/textures/Mountains_argb_nomip.dds', function ( texture ) { texture.

three.js 自制骨骼動畫(二)

上一篇說了一下自制骨骼動畫,這一篇郭先生使用幀動畫讓骨骼動畫動起來。幀動畫是一套比較完善的動畫剪輯方法,詳細我的api我們就不多說了,網上有很多例子,自行查詢學習。線上案例請點選部落格原文。話不多說先上圖。 1. 初始化一些四元數 首先我們需要一些四元數,因為我們的動畫裡有很多旋轉並且幀動畫的旋轉要求是四元

three.js基礎幾何體:立方體,球,圓柱的繪製

        作為three.js的學習入門,一直在思考要怎樣寫才可以更符合初學者,對於我自己來說,本身也不是資深的玩家,也是入門不久的菜鳥,但我願意與大家分享我的經驗。我覺得three.js不應對一些基礎性的東西介紹太多,因為其是基於WenGL開發的第三方庫,如果延伸下

arcgis api for js入門開發系列二十一 用HTML5 canvas繪製地圖 瓦片載入平移縮放

  終於開始可以寫程式碼了,手都開始癢了。這裡的程式碼僅僅是在chrome檢測過,我可以肯定的是IE10以下瀏覽器是行不通,我一直在考慮,是不是使用IE禁止看我的篇部落格,就是這群使用IE的人,給我加了很多工作量。     一個地圖的基本動作,無非就是載入資料,

three.js入門系列之粒子系統

其實程式碼很簡單,也很容易懂(我用的是r99版本的three.js,目前網上大多數demo是60或者80的版本,其中的一些api已經廢棄,如下是r99版本支援的寫法): 注:渲染器是WebGl渲染器 如上的程式碼,你將看到如下畫面: 但是這麼多“粒子”都是正方形的啊,哪來的雪花呢,不急

three.js 07-04 之 Points 粒子系統

    前面都是在介紹 如何通過 THREE.Sprite 來構建粒子系統。本篇我們來介紹一下如何通過 THREE.Points 及 THREE.PointsMaterial 來構建粒子系統。我們先來看一個完整的示例,程式碼如下所示: <!DOCTYPE html&g

利用Three.js構建粒子系統

var scene, camera, renderer, spot1, stats; var clock = new THREE.Clock();//時鐘 var cameraControls; var cloud, controls;

Three.js開發指南(7):粒子粒子系統

使用粒子(particle)可以很容易地創建出很多細小的物體,可以用來模擬雨滴和雪花。7.1 理解粒子    建立粒子7.2 粒子、粒子系統和BasicParticleMaterial    除非使用CanvasRenderer類,否則你就需要用ParticleSystem類

WebGL three.js學習筆記 使用粒子系統模擬時空隧道(蟲洞)

藍色 raw mat charset rgb out title ble 以及 WebGL three.js學習筆記 使用粒子系統模擬時空隧道 本例的運行結果如圖: 時空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/36

Three.js基礎:建立Cube並實現鼠標交互,動畫旋轉

src style icm document charset char itl () wid index.html文件: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <

Three.js導入gltf模型和動畫

var ble 播放 mode req begin stat mod animate 核心代碼 復雜的3D模型一般都是用第三方建模工具生成,然後加載到three中 three官方推薦使用gltf格式的文件,代表編輯器是blender 本文生成了自定義生成了一個blend

17-THREE.JS 基本材質

global info ren exc oob against vision hang pen <!DOCTYPE html> <html> <head> <title></title> &l