国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Three.js 粒子系統(tǒng)動畫與發(fā)光材質(zhì)——利用HTML5畫布繪制

Wuv1Up / 3611人閱讀

摘要:用做了個字體的粒子系統(tǒng)動畫,可設置的參數(shù)改變動畫效果,截圖如下預覽地址此文重講思路,為方便解釋,部分代碼有做修改,此外因為部分代碼太長,所以做的是截取,完整代碼請看地址有興趣的同學可以自己試試調(diào)參數(shù)嘗試出不同的動畫,滑稽臉的三大基本組件相機

用Three.js做了個字體的粒子系統(tǒng)動畫,可設置speedX=speedY=speedZ=1000的參數(shù)改變動畫效果,截圖如下:

預覽地址:https://joeoeoe.github.io/Jon...
此文重講思路,為方便解釋,部分代碼有做修改,此外因為部分代碼太長,所以做的是截取,完整代碼請看github
gitHub地址:https://github.com/Joeoeoe/Jo...
(有興趣的同學可以自己試試調(diào)參數(shù)嘗試出不同的動畫,滑稽臉.jpg)

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

目錄:

1.思路敘述
2.創(chuàng)建文字幾何體并獲取點集
3.用HTML5畫布編寫發(fā)光粒子貼圖
4.創(chuàng)建粒子系統(tǒng)
5.如何完成粒子動畫
6.結(jié)束

一.思路敘述

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

二.創(chuàng)建字體

先看函數(shù)架構(gòu)

let fontLoader = new THREE.FontLoader();
fontLoader.loag("字體包路徑",onLoad函數(shù),onProgress函數(shù),onError函數(shù))

這里注意字體包的選擇,不同字體包的幾何體Verctor的數(shù)量是不一樣的,這里我選擇optimer_bold.typeface.json的字體包,大家可以在three.js的集合包中找到各種各樣的字體包
待字體包加載完后,我們便調(diào)用onLoad函數(shù),創(chuàng)建字體
(先截取onLoad函數(shù)的一部分,余下的主要代碼均寫在onLoad函數(shù)中)

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函數(shù)中傳入?yún)?shù)font,然后配置字體樣式fontOptions,接著生成字體幾何體geometry,然后就獲取點集
這樣我們就獲得了終點位置

三.編寫發(fā)光粒子貼圖

首先創(chuàng)造canvas,并且調(diào)用createRadialGradient方法,用于繪制漸變色,繪制漸變色的原理是設定好一組同心圓,用addColorStop方法在不同位置設定顏色,如下代碼所示

function createLightMateria() {
let canvasDom = document.createElement("canvas");
canvasDom.width = 16;
canvasDom.height = 16;
let ctx = canvasDom.getContext("2d");
//根據(jù)參數(shù)確定兩個圓的坐標,繪制放射性漸變的方法,一個圓在里面,一個圓在外面
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作為貼圖

四.創(chuàng)建起始點粒子系統(tǒng)

接下來我們就可以創(chuàng)造粒子系統(tǒng)了,先說一下我們要用到的三個api
new Three.Geometry()
new Three.PointsMaterial()
new Three.Points()
思路:創(chuàng)建一個原點Geometry,遍歷向Geometry.vertices推入起始點,再調(diào)用new Three.Points()傳入Geometry和粒子配置生成粒子系統(tǒng)

首先做好粒子配置:

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

接著創(chuàng)建Geomotry和粒子系統(tǒng)

let[x,y,z] =[0,0,0];
let originGeo = new THREE.Geometry();
for (let i = 0; i 

這樣子就獲得原點粒子系統(tǒng)了

五.如何完成粒子動畫

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

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

即通過不停地調(diào)用animate函數(shù),進行渲染,這個animate函數(shù)中的particleAnimate()函數(shù)就是我們的粒子動畫,particleAnimate函數(shù)中就改變點的位置

接下來我們就來編寫particleAnimate函數(shù),先貼完整代碼再講過程

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:粒子數(shù),
originVer:起始點集合,
destiVer:目標位置點集合(就是來自于TextGeometry),
speedX,speedY,speedZ分別表示點在各軸上每次移動的速度
originParticlae:起始點粒子系統(tǒng)
接下來講過程:

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.最后設置更新粒子系統(tǒng)點為true
    originParticlae.geometry.verticesNeedUpdate=true;
六.結(jié)束

最后進行代碼的整合
以上便是所有的重點思路,根據(jù)這個思路,寫好代碼,就可以做出粒子動畫了!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96537.html

相關(guān)文章

  • three.js 簡介

    摘要:對于自身不能發(fā)光的物體,需要給場景添加光源從而達到可視的效果。中渲染陰影的開銷比較大,所以默認物體是沒有陰影的,需要單獨開啟。主要用于檢測動畫運行時的幀數(shù),可以顯示表示每秒多少幀和每幀多少毫秒,越大越好,但太大會影響性能,一般為左右。 一、WebGL 與 three.js WebGL(Web Graphics Library)是一種3D繪圖協(xié)議,它允許把JavaScript和OpenG...

    yankeys 評論0 收藏0
  • 前端特效demo | 值得收藏的6個 HTML5 Canvas 實用案例

    摘要:模擬飛機航班線路動畫一款基于的飛機航班線路模擬動畫,它模擬了許多航班在不同目的地的起飛降落數(shù)量。跳動加載動畫可調(diào)節(jié)參數(shù)這是一款基于的跳動加載動畫,它的另一個特點是可以動態(tài)調(diào)節(jié)動畫參數(shù)。 showImg(https://segmentfault.com/img/bVblze6?w=900&h=383); HTML5 動畫在Canvas 上得到了充分的發(fā)揮,我們 VIP 視頻也分享過很多相...

    Chao 評論0 收藏0
  • WebGL three.js學習筆記 使用粒子系統(tǒng)模擬時空隧道(蟲洞)

    摘要:學習筆記使用粒子系統(tǒng)模擬時空隧道本例的運行結(jié)果如圖時空隧道演示地址的粒子系統(tǒng)的粒子系統(tǒng)主要是依靠精靈體來創(chuàng)建的,要實現(xiàn)中的粒子系統(tǒng)創(chuàng)建,一般有兩種方式。 WebGL three.js學習筆記 使用粒子系統(tǒng)模擬時空隧道 本例的運行結(jié)果如圖:showImg(https://img-blog.csdnimg.cn/20190426222855492.png?x-oss-process=ima...

    Guakin_Huang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<