• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • ThreeJS 粒子系統實現雪花飄落動畫

    在這里插入圖片描述
    ThreeJS 粒子系統中,THREE.Points是用來創建點的類,也用來批量管理粒子,基于幾何體的頂點來渲染每個粒子。這個類的構造函數有兩個參數,geometry(幾何體)和material(材質),幾何體參數用來設置粒子的位置坐標,而材質參數用來設置粒子的外觀。下面利用ThreeJS的粒子系統來實現雪花飄落動畫。

    1. 尋找素材

    1) 背景圖片

    選擇一張雪景圖片作為背景圖
    snow_bg.jpg

    snow_bg.jpg

    2) 雪花圖片

    為了讓動畫效果更好,使用兩種不同形狀的雪花實現雪花飄落效果。

    在這里插入圖片描述

    snowflake.png

    2. HTML部分

    網頁中添加canvas畫布所在的元素

    <div id="snowBackground"></div>
    

    3. JS部分

    1) 初始化渲染器、場景、攝像機
    var width = 550; // 畫布的寬度
    var height = 366; // 畫布的高度
    
    // 渲染器
    var renderer = new THREE.WebGLRenderer({antialias:true});
    renderer.setSize(width, height);
    // 將canvas添加到指定元素
    var element = document.getElementById('snowBackground');
    element.appendChild(renderer.domElement);
    
    // 場景
    var scene = new THREE.Scene();
    // 正交投影攝像機
    var camera = new THREE.PerspectiveCamera(45, width/height, 2, 500);
    camera.position.set(0, 0, 40); // 攝像機位置
    // 照相機默認沿z軸負方向觀察,通過設置lookAt的位置可以改變觀察的方向
    camera.lookAt(new THREE.Vector3(0, 0, 0));
    scene.add(camera);
    
    2) 利用平面幾何體添加背景
    // 平面幾何體
    var planeGeometry = new THREE.PlaneBufferGeometry( width, height);
    planeGeometry.translate(0, 0, -400); // 平面幾何體位置
    // 背景紋理
    var planeTexture = new THREE.TextureLoader().load('./snow_bg.jpg');
    // 背景材料
    var planeMaterial = new THREE.MeshBasicMaterial({
    	map: planeTexture
    });
    // 背景網格
    var plane = new THREE.Mesh(planeGeometry, planeMaterial);
    // 將背景添加到場景
    scene.add(plane);
    
    3) 利用THREE.Points增加雪花粒子

    由于使用了兩種雪花形狀,每一個形狀需要創建一個THREE.Points對象

    var typeNum = 2; // 雪花種類
    var range = 50; // 雪花出現范圍
    
    // 雪花紋理
    var texture = new THREE.TextureLoader().load('./snowflake.png');
    
    // 使用圖片紋理材質
    var materials = [];
    for (var i = 0; i < typeNum; i++) {
    	var material = new THREE.PointsMaterial({
    		size: 2,
    		map: texture, // 紋理
    		transparent: true, // 透明
    		opacity: 1, // 透明度
    		depthTest: false, // 可以去掉texture的黑色背景
    		blending: THREE.AdditiveBlending // 融合模式
    	});
    	material.map.offset = new THREE.Vector2(1/typeNum * i, 0);
    	material.map.repeat = new THREE.Vector2(1/typeNum, 1);
    	materials.push(material);
    }
    
    // 通過自定義幾何體設置粒子位置
    var geoms = [];
    for (var k = 0; k < typeNum; k++) {
    	var geom = new THREE.Geometry();
    	for (var i = 0; i < 100; i++) {
    		// 隨機生成雪花的位置
    		var v = new THREE.Vector3(
    			Math.random() * range - range/2, 
    			Math.random() * range - range/2,
    			Math.random() * range - range/2
    		);
    		// 隨機生成雪花分別沿x、y、z軸方向移動速度
    		v.velocityY = 0.1 + Math.random() / 5;
            v.velocityX = (Math.random() - 0.5) / 3;
            v.velocityZ = (Math.random() - 0.5) / 3;
            // 添加頂點
    		geom.vertices.push(v);
    	}
    	geoms.push(geom);
    }
    
    // 點云
    var clouds = [];
    for (var i = 0; i < typeNum; i++) {
    	var points = new THREE.Points(geoms[i], materials[i]);
    	clouds.push(points)
    	scene.add(points);
    }
    
    4) 利用requestAnimationFrame實現動畫
    (function animate () {
    	clouds.forEach(function (points, i) {
    		var vertices = points.geometry.vertices;
    	
            vertices.forEach(function (v, idx) {
            	// 計算位置
            	v.y = v.y - (v.velocityY);
                v.x = v.x - (v.velocityX);
                v.z = v.z - (v.velocityZ);
                
                // 邊界檢查
                if (v.y <= -range/2) v.y = range / 2;
                if (v.x <= -range/2 || v.x >= range/2) v.x = v.x * -1;  
                if (v.z <= -range/2 || v.z >= range/2) v.velocityZ = v.velocityZ * -1;
            });
    
            //重要:渲染時需要更新位置(如果沒有設為true,則無法顯示動畫)
            points.geometry.verticesNeedUpdate = true;
    	});
    	renderer.render(scene, camera);
    	requestAnimationFrame(animate);
    })();
    

    4. 示例

    飄雪動效示例

    版權聲明:本文為liu_lin_sp原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/liu_lin_sp/article/details/87008714

    智能推薦

    LintCode 1835. 停在原地的方案數1 JavaScript算法

    描述 有一個長度為 arrLenarrLen 的數組,開始有一個指針在索引 00 處。 每一步操作中,你可以將指針向左或向右移動 11 步,或者停在原地(指針不能被移動到數組范圍外)。 給你兩個整數 stepssteps 和 arrLenarrLen ,請你計算并返回:在恰好執行 stepssteps 次操作以后,指針仍然指向索引 00 處的方案數。 由于答案可能會很大,請返回方案數 模 10^9...

    Android中Paint、Canvas的基礎方法用法

    首先paint是畫筆,可以根據paint中的方法設置畫筆的顏色、大小等等屬性,canvas是畫布,用paint畫筆可以在畫布上畫東西 代碼準備: canvas中的方法:(將下面講解的代碼分別放入注釋位置即可使用) 1、繪制單點: 方法:canvas.drawPoint(float x, float y, Paint mPaint); 參數:x:點的x軸位置;y:點的y軸位置;Paint:自定義畫筆...

    十,Future設計模式

    場景介紹 Future模式是多線程開發中非常常見的一種設計模式,它的核心思想是異步調用。這類似我們日常生活中的在線購物流程,帶在購物網看著一件商品時可以提交表單,當訂單完成后就可以在家里等待商品送貨上門。或者說更形象的是我們發送Ajax請求的時候,頁面是異步的進行后臺處理,用戶無需等待請求的結果,可以繼續瀏覽或操作其他內容。 參與角色 Future模式的主要角色有: Main:系統啟動,調用Fut...

    小程序支付系列

      小程序支付,涉及一些知識。 在微信提供的接口文檔中提供了一個微信支付接口,應該是直接調用這個接口就可以發起微信支付 文檔路徑:https://developers.weixin.qq.com/miniprogram/dev/api/api-pay.html#wxrequestpaymentobject          但是,當開始信...

    兩個變量相乘_無廢話學編程基礎(C++篇)3: 變量,賦值語句

    【現實需求】 今天我們要做一個小的應用程序,先說一說需求: 我們日常會去水果店買水果 例如, 蘋果5元/斤 香蕉12元/斤 橘子6元/斤 買完了水果要去結賬了,現在很少看著人手敲計算器了吧。 如果有一個小的應用程序可以解決這個問題不是更好嗎? 要完成這樣一個小的應用程序,需要知道以下幾個基本概念: 順序結構 變量 語句,賦值語句 輸入和輸出 順序結構 首先我們來看一下什么是程序的順序結構。 寫程序...

    猜你喜歡

    wifi放大器速度_放大器的速度有多快?

    wifi放大器速度 AMP has caused quite the stir from a philosophical perspective, but the technology hasn’t received as close of a look. A few weeks ago, Ferdy Christant wrote about the unfair advantage...

    Java IO講解(一)

    Java IO講解 一、簡介 二、Java IO類庫基本架構 三、Java IO類型劃分 四、既然有了字節流,為什么還要有字符流? 五、字節字符相互轉換 一、簡介 IO(輸入輸出)問題是Web應用所面臨的的主要問題這一,因為在當前這個海量數據時代,數據在網絡中隨處流動。在這個數據流動的過程當中都涉及IO問題,大部分應用系統的瓶頸都是IO瓶頸。 二、Java IO類庫基本架構 ①基于字節操作的抽象類...

    部署HPC集群的實施方案

    部署HPC集群的實施方案 濟南友泉軟件有限公司 一、系統配置 1.1 網絡拓撲 1.2 操作系統 登錄節點:CentOS Linux release 7.3.1611 管理節點:CentOS Linux release 7.3.1611 計算節點:CentOS Linux release 7.9.2009, 二、計算節點、登錄節點配置 2.1 域名設置 在登錄節點、所有計算節點上執行以下命令,完成...

    docker基本介紹&docker鏡像&docker常用命令

    1.docker介紹 2.docker鏡像 3.docker常用管命令 4.dockerfile編寫和應用(真實企業應用) 5.docker中網絡部分講解 1.docker介紹 1.什么是docker Docker 是應用最廣泛的開源容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中 docker實質就像虛擬機一樣,就好像是一個具有獨立操作系統的真實機器 虛擬機是有真正的linux...

    oracle ORA-01033

    描述: 操作系統window10 ,Oracle 11g ,電腦異常斷電,再次打開電腦,連接oracle數據庫實例,報錯 Ora-01033 重啟Oracle各項服務,還是無法連接到數據庫 在查找了相關資料后,使用sqlplus命令,用system 登錄 輸入命令 SQL> shutdown normal SQL> startup mount SQL> alter databas...

    精品国产乱码久久久久久蜜桃不卡