Particle animation can be implemented in ThreeJs in several ways
This example uses the Sprite class to build particles
官方对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.
About the meaning: the object created by this class It is a plane that always faces the camera, and textures can be applied to it. Sprite objects cannot add shadows, so the castShadow attribute is invalid
First we create the scene and camera
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();
Then use Sprite to create particles
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 } ) );
Generate random numbers, randomly obtain texture resources, and use the Sprite class to create particles
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 ;
Use random numbers to set the position and size of the particles
Because the Sprite class creates a surface that always faces the camera, that is It says that it cannot use flipping to make the petals have a flipping effect.
But I need to add a flipping effect to the petals
My implementation idea is that when the 2d element is reversed, it is actually equivalent to compressing the size of its x-axis
So I set a The size of the current x-axis
and the initial deformation speed
particle.sizeX = particle.scale.x; particle.xScaleSpeed = -0.08;
The following is the code for initialization of all particles
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 ); }
After creating the particles
Create canvasRender
renderer = new THREE.CanvasRenderer({alpha:true}); renderer.setClearColor("#ffffff",0); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, winHeight ); container.appendChild( renderer.domElement );
because Prepare to let the petals fall from the upper left to the lower right, so every time you render the picture, you need to offset the petals to the lower right
particles[i].position.x+=particles[i].speed;
This speed is randomly generated when I create the particles, in order to let the petals The speed of each piece is different
particles[i].position.y-=particles[i].speed+0.1;
Add an offset to the y-axis every time it is rendered,
Because this effect needs to be displayed on a vertical screen,
so the y-axis speed ratio The effect will be better if the x-axis is faster
particles[i].scale.x += particles[i].xScaleSpeed;
Then add a deformation amount to the particle shape each time it is rendered
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 }
It is necessary to simulate the effect of petals flipping. When the current deformation amount exceeds the original When changing the size, the deformation direction is changed to the opposite direction (from being larger to smaller)
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 }
At this point we have completed the dynamics of falling + flipping particles.
We also need to reassign the particles to an initial position when they exceed the effect display area
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; }
In this way, the effect of floating petals is
completed
The above is the detailed content of HTML5 development example-ThreeJs code sharing for particle animation floating flower effect. For more information, please follow other related articles on the PHP Chinese website!