如何作一個逼真的雪花活動頁

前言

最近,公司UI小姐姐告訴我能不能作一個關於雪花的效果圖,最好是能體現雪花的遠近感(遠的時候比較小 近的時候雪花比較大),我尋思良久,一開始用canvas作了一個雪花效果 感受不是很滿意,而後就該用了three.js作了一個關於雪花的效果。效果還行 給你們先看一下效果。前端

雪花總體效果

1:準備工做

爲了可以顯示任何帶有three.js的東西,咱們須要三件事:場景,相機和渲染器,這樣咱們就能夠用相機渲染場景 代碼:canvas

function init() {
  container = document.createElement('div');
  container.className = 'snow';
	document.body.appendChild(container);
	camera = new THREE.PerspectiveCamera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 10000 ); //透視投影相機
	camera.position.z = 1000;
	scene = new THREE.Scene();
	scene.add(camera);
	renderer = new THREE.CanvasRenderer();
	renderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
	// console.log(SCREEN_WIDTH, SCREEN_HEIGHT);
	var material = new THREE.ParticleBasicMaterial( { map: new THREE.Texture(particleImage) } );
複製代碼

2:隨機生成不一樣位置必定數量的雪花

for (var i = 0; i < 200; i++) {
		particle = new Particle3D( material);
		particle.position.x = Math.random() * 2000 - 1000;
		particle.position.y = Math.random() * 2000 - 1000;
		particle.position.z = Math.random() * 2000 - 1000;
		particle.scale.x = particle.scale.y =  1;
		scene.add( particle );
		particles.push(particle); 
	}
複製代碼

進行雪花位置優化bash

for(var i = 0; i < particles.length; i++)
	{
		var particle = particles[i]; 
		particle.updatePhysics(); 
		with(particle.position)
		{
			if(y < -1000) y += 2000; 
			if(x > 1000) x -= 2000; 
			else if(x <- 1000) x += 2000; 
			if(z > 1000) z -= 2000; 
			else if(z <- 1000) z += 2000; 
		}
	}
複製代碼

3:雪花遠小近大的效果

雪花的遠小近大的效果是經過改變相機的位置來的app

camera.position.x += (mouseX - camera.position.x ) * 0.05;
	camera.position.y += (- mouseY - camera.position.y ) * 0.05;
	camera.lookAt(scene.position); 
	renderer.render( scene, camera );
複製代碼

4:雪花的自由下落

這裏是利用了gravity重力,讓他下落的,咱們也能夠經過改變它的大小來改變速度。dom

Particle3D = function(material){
	THREE.Particle.call(this,material);
	this.velocity = new THREE.Vector3(0,-8,0);
	this.velocity.rotateX(randomRange(-45,45));
	this.velocity.rotateY(randomRange(0,360));
	this.gravity = new THREE.Vector3(0,0,0);
	this.drag=1;
};
Particle3D.prototype = new THREE.Particle();
Particle3D.prototype.constructor = Particle3D;
Particle3D.prototype.updatePhysics = function(){
	this.velocity.multiplyScalar(this.drag);
	this.velocity.addSelf(this.gravity);
	this.position.addSelf(this.velocity);
}
複製代碼

5:雪花旋轉效果

至於雪花的旋轉我也作了必定的優化學習

THREE.Vector3.prototype.rotateY=function(angle){
	cosRY = Math.cos(angle * Math.PI/180);
	sinRY = Math.sin(angle * Math.PI/180);
	var tempz = this.z;;
	var tempx = this.x;
	this.x = (tempx * cosRY) + (tempz * sinRY);
	this.z = (tempx * -sinRY) + (tempz * cosRY);
}
複製代碼

活動頁

活動頁效果就不細細說了,我就把雪花效果添加進去活動頁。使用pointer-events:none,表示它將捕獲不到任何點擊,而只是讓事件穿透到它的下面。優化

.snow {
        position: fixed;
        top: 0;
        left: 0;
        z-index: 10000;
        transform: translate3d(0, 0, 0);
        width: 100%;
        height: 100%;
        pointer-events: none;
      }
複製代碼

其餘

這個活動頁還有一個問題,就是按住屏幕(往下輕滑),雪就卡住了一小會但願有大佬來幫我解決這個問題。鄙人不勝感激。this

總結

做爲一個即將畢業的大四學生,這是我來公司實習作的第一個活動頁,但願能夠幫助你們,互相學習,一塊兒進步。固然也有一些不足之處,請你們多多指教。若是你們有什麼好的想法的話能夠聯繫個人qq:137032979.碼字不容易,但願你們點個贊。前端路漫漫,與君共勉之。spa

相關文章
相關標籤/搜索