粒子動畫在ThreeJs可以用幾種方式實現
本次範例使用Sprite類別來建構粒子
官方对Sprite类的解释 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.
大概意思:這個類別創建的對象是一個總是面對相機的平面,可以把貼圖應用在上面,Sprite物件無法添加陰影,所以castShadow屬性無效
首先我們創建場景和相機
container = document.createElement( 'p' ); 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創建粒子
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 } ) );
產生隨機數,隨機取得貼圖資源,使用Sprite類別建立粒子
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 ;
使用隨機數給粒子設定位置,大小
因為Sprite類別是創造一個總是面向相機的面,也就是說它無法使用翻轉使得花瓣有個翻轉的效果。
但是我需要在花瓣上加上一個翻轉的效果
我的實現思路是,2d元素在反轉時其實相當於將他的x軸的大小壓縮
所以我給設定一個當前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 ); }
創建完粒子後
創建canvasRender
renderer = new THREE.CanvasRenderer({alpha:true}); renderer.setClearColor("#ffffff",0); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, winHeight ); container.appendChild( renderer.domElement );
因為準備讓花瓣從左上方往右下飄落,所以每次渲染畫面的時候需要將花瓣往右下偏移
particles[i].position.x+=particles[i].speed;
這個速度是我在創建粒子時隨機生成的,為的是讓花瓣每一片的速度不同
particles[i].position.y-=particles[i].speed+0.1;
給y軸上也在每次渲染的時候增加一個偏移量,
因為這個效果需要在垂直螢幕上展示,
所以y軸速度比x軸快一些效果會更好
particles[i].scale.x += particles[i].xScaleSpeed;
然後對粒子的形狀在每次渲染的時候增加一個變形量
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 }
需要模擬花瓣翻轉的效果,當當前變形量超過原先尺寸時,變形方向改為相反方向(本來變大改為變小)
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 }
到這裡我們就完成了粒子的飄落+翻轉的動態。
我們還需要在粒子超出效果展示區域時,把粒子重新賦予一個初始位置
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; }
這樣,飄花瓣的效果,
就完成了
以上是HTML5開發實例-ThreeJs實作粒子動畫飄花效果程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!