摘要:我們還需要在粒子超出效果展示區(qū)域時(shí),把粒子重新賦予一個(gè)初始位置這樣,飄花瓣的效果,就完成了代碼下載鏈接密碼
粒子動(dòng)畫(huà)在ThreeJs可以用幾種方式實(shí)現(xiàn)
本次樣例使用Sprite類(lèi)來(lái)構(gòu)建粒子
官方對(duì)Sprite類(lèi)的解釋 Sprite A sprite is a plane that always faces towards the camera, generally with a partially transparent texture applied. Sprites do not cast shadows, setting castShadow = true will have no effect.
大概意思:這個(gè)類(lèi)創(chuàng)建的對(duì)象是一個(gè)始終面向相機(jī)的平面,可以把貼圖應(yīng)用在上面,Sprite對(duì)象無(wú)法添加陰影 ,所以castShadow屬性無(wú)效
首先我們創(chuàng)建場(chǎng)景和相機(jī)
container = document.createElement( "div" ); document.body.appendChild( container ); camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 10000 ); camera.position.set( 0, 0, 120 ); scene = new THREE.Scene();
然后用Sprite創(chuàng)建粒子
var textureList=[pic1,pic2,pic3,pic4,pic5,pic6,pic7,pic8,pic9,pic10]
var textureLoader = new THREE.TextureLoader(); var textureId = parseInt(Math.random()*100)%10 var texture = textureLoader.load(textureList[textureId]); var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) );
生成隨機(jī)數(shù),隨機(jī)獲取貼圖資源,使用Sprite類(lèi)創(chuàng)建粒子
particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120; particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60; particle.position.z = Math.random() * 3 - 30; particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ;
使用隨機(jī)數(shù)給粒子設(shè)置位置,大小
因?yàn)镾prite類(lèi)是創(chuàng)建一個(gè)始終面向相機(jī)的面,也就是說(shuō)它無(wú)法使用翻轉(zhuǎn)使得花瓣有個(gè)翻轉(zhuǎn)的效果。
但是我需要給花瓣添加一個(gè)翻轉(zhuǎn)的效果
我的實(shí)現(xiàn)思路是,2d元素在反轉(zhuǎn)時(shí)其實(shí)相當(dāng)于是將他的x軸的大小壓縮
所以我給設(shè)置一個(gè)當(dāng)前x軸的大小
和初始變形速度
particle.sizeX = particle.scale.x; particle.xScaleSpeed = -0.08;
以下是所有粒子初始化的代碼
for ( var i = 0; i < 30; i ++ ) { var textureLoader = new THREE.TextureLoader(); var textureId = parseInt(Math.random()*10); var texture = textureLoader.load(textureList[textureId]); var particle = new THREE.Sprite( new THREE.SpriteMaterial( { map: texture } ) ); particle.position.x = Math.round(Math.random() *winHeight* 1000)%200 +120; particle.position.y =Math.round(Math.random() *winHeight* 10000)%100 +60; particle.position.z = Math.random() * 3 - 30; particle.scale.x = particle.scale.y = Math.round(Math.random() * 50)%5+10 ; particle.sizeX = particle.scale.x; particle.xScaleSpeed = -0.08; particle.speed = Math.round(Math.random()*10)/50; particles.push(particle); scene.add( particle ); }
創(chuàng)建完粒子后
創(chuàng)建canvasRender
renderer = new THREE.CanvasRenderer({alpha:true}); renderer.setClearColor("#ffffff",0); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, winHeight ); container.appendChild( renderer.domElement );
因?yàn)闇?zhǔn)備讓花瓣從左上方往右下飄落,所以每次渲染畫(huà)面的時(shí)候需要將花瓣往右下偏移
particles[i].position.x+=particles[i].speed;
這個(gè)速度是我在創(chuàng)建粒子時(shí)隨機(jī)生成的,為的是讓花瓣每一片的速度不同
particles[i].position.y-=particles[i].speed+0.1;
給y軸上也在每次渲染的時(shí)候增加一個(gè)偏移量,
因?yàn)檫@個(gè)效果需要在豎屏上展示,
所以y軸速度比x軸快一些效果會(huì)更好
particles[i].scale.x += particles[i].xScaleSpeed;
然后對(duì)粒子的形狀在每次渲染的時(shí)候增加一個(gè)變形量
if(particles[i].scale.x <-particles[i].sizeX){ particles[i].xScaleSpeed = 0.08 } if(particles[i].scale.x >=particles[i].sizeX){ particles[i].xScaleSpeed = -0.08 }
需要模擬花瓣翻轉(zhuǎn)的效果,當(dāng)當(dāng)前變形量超過(guò)原先尺寸時(shí),變形方向改為相反方向(本來(lái)變大改為變小)
if(particles[i].scale.x <0.3&&particles[i].scale.x >0){ particles[i].scale.x=-0.3 } if(particles[i].scale.x >-0.3&&particles[i].scale.x <0){ particles[i].scale.x=0.3 }
到這里我們就完成了粒子的飄落+翻轉(zhuǎn)的動(dòng)態(tài)。
我們還需要在粒子超出效果展示區(qū)域時(shí),把粒子重新賦予一個(gè)初始位置
if(particles[i].position.y<-100||particles[i].position.x>50|particles[i].position.z>150){ particles[i].position.x = -Math.round(Math.random() *winWidth* 1000)%(winWidth); particles[i].position.y = Math.round(Math.random() *winHeight* 1000)%200 +120 particles[i].position.z = Math.random() * 5 - 30; particles[i].speed=Math.round(Math.random()*10)/30; }
這樣,飄花瓣的效果,
就完成了
代碼下載
鏈接: https://pan.baidu.com/s/1pKKkqrL 密碼: ww7j
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86929.html
摘要:我們還需要在粒子超出效果展示區(qū)域時(shí),把粒子重新賦予一個(gè)初始位置這樣,飄花瓣的效果,就完成了代碼下載鏈接密碼 showImg(https://segmentfault.com/img/bVKwfR?w=329&h=565); 粒子動(dòng)畫(huà)在ThreeJs可以用幾種方式實(shí)現(xiàn)本次樣例使用Sprite類(lèi)來(lái)構(gòu)建粒子 官方對(duì)Sprite類(lèi)的解釋 Sprite A sprite is a plane t...
摘要:那我這邊呢,根據(jù)技術(shù)的分類(lèi),找出其中十個(gè)有代表性的案例,給大家解析一下他們技術(shù)的實(shí)現(xiàn)方案。經(jīng)過(guò)我對(duì)線(xiàn)上的代碼進(jìn)行修改,使這個(gè)頁(yè)面在安卓端強(qiáng)制使用來(lái)進(jìn)行展示后發(fā)現(xiàn),在播放了一會(huì)后微信瀏覽器直接崩潰。那么這十個(gè)案例的淺析就完了,謝謝。 最近我們前端這邊搜集了50個(gè)比較優(yōu)秀的H5。 那我這邊呢,根據(jù)技術(shù)的分類(lèi),找出其中十個(gè)有代表性的案例,給大家解析一下他們技術(shù)的實(shí)現(xiàn)方案。 設(shè)計(jì)師也可以根據(jù)技...
摘要:那我這邊呢,根據(jù)技術(shù)的分類(lèi),找出其中十個(gè)有代表性的案例,給大家解析一下他們技術(shù)的實(shí)現(xiàn)方案。經(jīng)過(guò)我對(duì)線(xiàn)上的代碼進(jìn)行修改,使這個(gè)頁(yè)面在安卓端強(qiáng)制使用來(lái)進(jìn)行展示后發(fā)現(xiàn),在播放了一會(huì)后微信瀏覽器直接崩潰。那么這十個(gè)案例的淺析就完了,謝謝。 最近我們前端這邊搜集了50個(gè)比較優(yōu)秀的H5。 那我這邊呢,根據(jù)技術(shù)的分類(lèi),找出其中十個(gè)有代表性的案例,給大家解析一下他們技術(shù)的實(shí)現(xiàn)方案。 設(shè)計(jì)師也可以根據(jù)技...
閱讀 2529·2023-04-26 02:57
閱讀 1410·2023-04-25 21:40
閱讀 2173·2021-11-24 09:39
閱讀 3564·2021-08-30 09:49
閱讀 764·2019-08-30 15:54
閱讀 1172·2019-08-30 15:52
閱讀 2080·2019-08-30 15:44
閱讀 1278·2019-08-28 18:27