摘要:用做了個字體的粒子系統動畫,可設置的參數改變動畫效果,截圖如下預覽地址此文重講思路,為方便解釋,部分代碼有做修改,此外因為部分代碼太長,所以做的是截取,完整代碼請看地址有興趣的同學可以自己試試調參數嘗試出不同的動畫,滑稽臉的三大基本組件相機
用Three.js做了個字體的粒子系統動畫,可設置speedX=speedY=speedZ=1000的參數改變動畫效果,截圖如下:
預覽地址:https://joeoeoe.github.io/Jon...
此文重講思路,為方便解釋,部分代碼有做修改,此外因為部分代碼太長,所以做的是截取,完整代碼請看github
gitHub地址:https://github.com/Joeoeoe/Jo...
(有興趣的同學可以自己試試調參數嘗試出不同的動畫,滑稽臉.jpg)
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函數中)
fontLoader.load("../../../package/font/optimer_bold.typeface.json", 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 = getGeoVer(geometry); .....
注意在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這樣子就獲得原點粒子系統了
五.如何完成粒子動畫先看看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; }先搞清楚給部分變量:
1.獲取起始點與目標點的大致距離
pointsNum:粒子數,
originVer:起始點集合,
destiVer:目標位置點集合(就是來自于TextGeometry),
speedX,speedY,speedZ分別表示點在各軸上每次移動的速度
originParticlae:起始點粒子系統
接下來講過程: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.最后設置更新粒子系統點為trueoriginParticlae.geometry.verticesNeedUpdate=true;六.結束最后進行代碼的整合
以上便是所有的重點思路,根據這個思路,寫好代碼,就可以做出粒子動畫了!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96537.html
摘要:對于自身不能發光的物體,需要給場景添加光源從而達到可視的效果。中渲染陰影的開銷比較大,所以默認物體是沒有陰影的,需要單獨開啟。主要用于檢測動畫運行時的幀數,可以顯示表示每秒多少幀和每幀多少毫秒,越大越好,但太大會影響性能,一般為左右。 一、WebGL 與 three.js WebGL(Web Graphics Library)是一種3D繪圖協議,它允許把JavaScript和OpenG...
摘要:模擬飛機航班線路動畫一款基于的飛機航班線路模擬動畫,它模擬了許多航班在不同目的地的起飛降落數量。跳動加載動畫可調節參數這是一款基于的跳動加載動畫,它的另一個特點是可以動態調節動畫參數。 showImg(https://segmentfault.com/img/bVblze6?w=900&h=383); HTML5 動畫在Canvas 上得到了充分的發揮,我們 VIP 視頻也分享過很多相...
摘要:學習筆記使用粒子系統模擬時空隧道本例的運行結果如圖時空隧道演示地址的粒子系統的粒子系統主要是依靠精靈體來創建的,要實現中的粒子系統創建,一般有兩種方式。 WebGL three.js學習筆記 使用粒子系統模擬時空隧道 本例的運行結果如圖:showImg(https://img-blog.csdnimg.cn/20190426222855492.png?x-oss-process=ima...
閱讀 3049·2021-09-22 15:52
閱讀 2914·2019-08-30 15:55
閱讀 2708·2019-08-30 15:53
閱讀 2461·2019-08-30 13:21
閱讀 1630·2019-08-30 13:10
閱讀 2488·2019-08-26 12:09
閱讀 2575·2019-08-26 10:33
閱讀 1810·2019-08-23 18:06