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