亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

基于three.js實現的3D粒子動效實例代碼

2024-05-06 16:49:41
字體:
來源:轉載
供稿:網友

一、背景

粒子特效是為模擬現實中的水、火、霧、氣等效果由各種三維軟件開發的制作模塊,原理是將無數的單個粒子組合使其呈現出固定形態,借由控制器、腳本來控制其整體或單個的運動,模擬出現真實的效果。three.js是用JavaScript編寫的WebGL的第三方庫,three.js提供了豐富的API幫助我們去實現3D動效,本文主要介紹如何使用three.js實現粒子過渡效果,以及基本的鼠標交互操作。

(注:本文使用的關于three.js的API都是基于版本r98的。)

three.js,代碼,3D粒子動效

二、實現步驟

1. 創建渲染場景scene

scene實際上相當于一個三維空間,用于承載和顯示我們所定義的一切,包括相機、物體、燈光等。在實際開發時為了方便觀察可添加一些輔助工具,比如網格、坐標軸等。

scene = new THREE.Scene(); scene.fog = new THREE.Fog(0x05050c, 10, 60); scene.add( new THREE.GridHelper( 2000, 1 ) ); // 添加網格

2. 添加照相機camera

THREE里面實現了幾種相機:PerspectiveCamera(透視相機)、 OrthographicCamera(正交投影相機)、CubeCamera(立方體相機或全景相機)和 StereoCamera(3D相機)。本文介紹我們主要用到的 PerspectiveCamera(透視相機):

視覺效果是近大遠小。

配置參數 PerspectiveCamera(fov, aspect, near, far)。

fov:相機的可視角度。

aspect:相機可視范圍的長寬比。

near:相對于深度剪切面的遠的距離。

far:相對于深度剪切面的遠的距離。

camera = new THREE.PerspectiveCamera(45, window.innerWidth /window.innerHeight, 5, 100); camera.position.set(10, -10, -40); scene.add(camera);

3. 添加場景渲染需要的燈光

three.js里面實現的光源:AmbientLight(環境光)、DirectionalLight(平行光)、HemisphereLight(半球光)、PointLight(點光源)、RectAreaLight(平面光源)、SpotLight(聚光燈)等。配置光源參數時需要注意顏色的疊加效果,如環境光的顏色會直接作用于物體的當前顏色。各種光源的配置參數有些區別,下面是本文案例中會用到的二種光源。

let ambientLight = new THREE.AmbientLight(0x000000, 0.4); scene.add(ambientLight); let pointLight = new THREE.PointLight(0xe42107); pointLight.castShadow = true; pointLight.position.set(-10, -5, -10); pointLight.distance = 20; scene.add(pointLight);

4. 創建、導出并加載模型文件loader

創建模型,可以使用three.js editor進行創建或者用three.js的基礎模型生成類進行生成,相對復雜的或者比較特殊的模型需要使用建模工具進行創建(c4d、3dmax等)。

使用three.js editor進行創建,可添加基本幾何體,調整幾何體的各種參數(位置、顏色、材質等)。

three.js,代碼,3D粒子動效

使用模型類生成。

let geometryCube = new THREE.BoxBufferGeometry( 1, 1, 1 ); let materialCube = new THREE.MeshBasicMaterial( {color: 0x00ff00} ); let cubeMesh = new THREE.Mesh( geometryCube, materialCube ); scene.add( cubeMesh );

導出需要的模型文件(此處使用的是 obj格式的模型文件)。

加載并解析模型文件數據。

let onProgress = function (xhr) { if (xhr.lengthComputable) {  // 可進行計算得知模型加載進度 } }; let onError = function () {}; particleSystem = new THREE.Group(); var texture = new THREE.TextureLoader().load('./point.png'); new THREE.OBJLoader().load('./model.obj', function (object) { // object 模型文件數據 }, onProgress, onError);

5. 將導入到模型文件轉換成粒子系統Points

獲取模型的坐標值。

拷貝粒子坐標值到新建屬性position1上 ,這個作為粒子過渡效果的最終坐標位置。

給粒子系統添加隨機三維坐標值position,目的是把每個粒子位置打亂,設定起始位置。

let color = new THREE.Color('#ffffff'); let material = new THREE.PointsMaterial({ size: 0.2, map: texture, depthTest: false, transparent: true }); particleSystem= new THREE.Group(); let allCount = 0 for (let i = 0; i < object.children.length; i++) { let name = object.children[i].name let _attributes = object.children[i].geometry.attributes  let count = _attributes.position.count  _attributes.positionEnd = _attributes.position.clone()  _attributes.position1 = _attributes.position.clone()  for (let i = 0; i < count * 3; i++) {  _attributes.position1.array[i]= Math.random() * 100 - 50  }  let particles = new THREE.Points(object.children[i].geometry, material)  particleSystem.add(particles)  allCount += count } particleSystem.applyMatrix(new THREE.Matrix4().makeTranslation(-5, -5,-10));

6. 通過tween動畫庫實現粒子坐標從position到position1點轉換

利用 TWEEN 的緩動算法計算出各個粒子每一次變化的坐標位置,從初始位置到結束位置時間設置為2s(可自定義),每次執行計算之后都需要將attributes的position屬性設置為true,用來提醒場景需要更新,在下次渲染時,render會使用最新計算的值進行渲染。

let pos = { val: 1 }; tween = new TWEEN.Tween(pos).to({ val: 0 }, 2500).easing(TWEEN.Easing.Quadratic.InOut).onUpdate(callback); tween.onComplete(function () { console.log('過渡完成complete') }) tween.start(); function callback() { let val = this.val; let particles = particleSystem.children; for (let i = 0; i < particles.length; i++) {  let _attributes = particles[i].geometry.attributes  let name = particles[i].name  if (name.indexOf('_') === -1) {  let positionEnd =_attributes.positionEnd.array  let position1 =_attributes.position1.array  let count =_attributes.position.count  for (let j = 0; j < count *3; j++) {   _attributes.position.array[j] = position1[j] *val + positionEnd[j] * (1 - val)  }  }  _attributes.position.needsUpdate = true // 設置更新 } }

7. 添加渲染場景render

創建容器。

定義render渲染器,設置各個參數。

將渲染器添加到容器里。

自定義的渲染函數 render,在渲染函數里面我們利用 TWEEN.update 去更新模型的狀態。

調用自定義的循環動畫執行函數 animate,利用requestAnimationFrame方法進行逐幀渲染。

let container = document.createElement('div'); document.body.appendChild(container); renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); renderer.setPixelRatio(window.devicePixelRatio); renderer.setClearColor(scene.fog.color); renderer.setClearAlpha(0.8); renderer.setSize(window.innerWidth, window.innerHeight); container.appendChild(renderer.domElement); // 添加webgl渲染器  function render() { particleSystem.rotation.y += 0.0001; TWEEN.update(); particleSystem.rotation.y += (mouseX + camera.rotation.x) * .00001; camera.lookAt(new THREE.Vector3(-10, -5, -10)) controls.update(); renderer.render(scene, camera); } function animate() { // 開始循環執行渲染動畫 requestAnimationFrame(animate); render(); }

8. 添加鼠標操作事件實現角度控制

我們還可以添加鼠標操作事件實現角度控制,其中winX、winY分別為window的寬高的一半,當然具體的坐標位置可以根據自己的需求進行計算,具體的效果如下圖所示。

document.addEventListener('mousemove', onDocumentMouseMove, false); function onDocumentMouseMove(event) { mouseX = (event.clientX - winX) / 2; mouseY = (event.clientY - winY) / 2; }

three.js,代碼,3D粒子動效

三、優化方案

1. 減少粒子數量

隨著粒子數量的增加,需要的計算每個粒子的位置和大小將會非常耗時,可能會造成動畫卡頓或出現頁面假死的情況,所以我們在建立模型時可盡量減少粒子的數量,能夠有效提升性能。

在以上示例中,我們改變導出模型的精細程度,可以得到不同數量的粒子系統,當粒子數量達到幾十萬甚至幾百萬的時候,在動畫加載時可以感受到明顯的卡頓現象,這主要是由于fps比較低,具體的對比效果如下圖所示,左邊粒子數量為30萬,右邊粒子數量為6萬,可以明顯看出左邊跳幀明顯,右邊基本保持比較流暢的狀態。

three.js,代碼,3D粒子動效

2. 采用GPU渲染方式

編寫片元著色器代碼,利用webgl可以為canvas提供硬件3D加速,瀏覽器可以更流暢地渲染頁面。目前大多數設備都已經支持該方式,需要注意的是在低端的設備上由于硬件設備原因,渲染的速度可能不及基于cpu計算的方式渲染。

四、總結

綜上所述,實現粒子動效的關鍵在于計算、維護每個粒子的位置狀態,而three.js提供了較為便利的方法,可以用于渲染整個粒子場景。當粒子數量極為龐大時,想要實現較為流暢的動畫效果需要注意優化代碼、減少計算等,也可以通過提升硬件配置來達到效果。本文中的案例為大家展示了3D粒子動效如何實現,大家可以根據自己的實際需求去制作更炫酷的動態效果。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久精品| 亚洲一区二区三区sesese| 国产噜噜噜噜噜久久久久久久久| 成人在线视频福利| 国产成人综合精品| 成人黄色中文字幕| 久久久精品2019中文字幕神马| 国产999精品视频| 久久精品小视频| 欧美精品18videos性欧| 成人精品视频久久久久| 日本aⅴ大伊香蕉精品视频| 国产精品视频永久免费播放| 国产精品无码专区在线观看| 亚洲激情视频在线| 欧美精品在线免费播放| 亚洲第一国产精品| 成人福利网站在线观看11| 欧美激情欧美狂野欧美精品| 久久艳片www.17c.com| 96pao国产成视频永久免费| 国产精品久久久久久网站| 国产午夜精品美女视频明星a级| 亚洲午夜国产成人av电影男同| 成人福利网站在线观看11| 国产精品久久久久久中文字| 日韩动漫免费观看电视剧高清| 精品久久久久久久久久ntr影视| 91视频九色网站| 成人乱人伦精品视频在线观看| 日韩经典中文字幕在线观看| 欧美日韩中文字幕日韩欧美| 国产一区二区av| 中文字幕国产精品久久| 国产人妖伪娘一区91| 国产精品久久久久福利| 久久久成人精品视频| 国产日韩欧美在线看| 亚洲成人av中文字幕| 5278欧美一区二区三区| 在线免费看av不卡| 国产999精品久久久| 国产成人av在线| 亚洲男人天堂手机在线| 国产香蕉精品视频一区二区三区| 色婷婷**av毛片一区| 欧美日韩裸体免费视频| 亚洲第一区在线| 日本成人黄色片| 久久精品视频在线播放| 欧美性xxxxxx| 国产成人91久久精品| 日韩一级黄色av| 亚洲缚视频在线观看| 成人久久久久久久| 国产性猛交xxxx免费看久久| 国产欧美韩国高清| 国产精品福利在线| 2019国产精品自在线拍国产不卡| 中文字幕v亚洲ⅴv天堂| 欧美日韩成人在线观看| 国产精品一区二区三区成人| 国产精品6699| 欧美精品www在线观看| 国产成人精品综合久久久| 久久中国妇女中文字幕| 亚洲色图偷窥自拍| 在线观看欧美日韩国产| 国产精品成人va在线观看| 日韩av网站大全| 亚洲欧美在线播放| 亚洲人午夜精品免费| 亚洲人成在线一二| 欧美福利视频在线观看| 最近2019年日本中文免费字幕| 57pao国产精品一区| 国产一区二区三区中文| 亚洲日本成人女熟在线观看| 国产一区二区日韩| 欧美特黄级在线| 色悠悠久久久久| 日韩成人在线电影网| www.亚洲男人天堂| 亚洲精选一区二区| 亚洲新中文字幕| 欧美成人精品激情在线观看| 精品综合久久久久久97| 亚洲欧美成人在线| 久久视频在线观看免费| 久久亚洲精品成人| 久久国产色av| 欧美激情日韩图片| 青青草原一区二区| 丁香五六月婷婷久久激情| 国产精品一区二区三区免费视频| 欧美xxxwww| 成人性教育视频在线观看| 上原亚衣av一区二区三区| 国产91色在线免费| 中文字幕一区二区精品| 91精品国产综合久久久久久蜜臀| 欧美日韩精品中文字幕| 日韩精品免费在线播放| 欧美二区乱c黑人| 97久久精品人人澡人人爽缅北| 亚洲精品永久免费精品| 一区二区三区无码高清视频| 成人做爽爽免费视频| 国产精品自产拍高潮在线观看| 亚洲免费人成在线视频观看| 中文字幕日韩av电影| 欧美激情视频一区二区| 日韩最新中文字幕电影免费看| 欧美日韩国产在线播放| 91av在线免费观看| 欧美性色视频在线| 欧美激情亚洲国产| 欧美性猛交xxxx免费看久久久| 亚洲国产一区二区三区在线观看| 亚洲视频999| 欧美一级淫片aaaaaaa视频| 亚洲第一福利网| 在线视频中文亚洲| 欧美激情亚洲另类| 91久久精品久久国产性色也91| 俺去了亚洲欧美日韩| www.亚洲天堂| 久久久久久97| 久久久成人精品| 亚洲a区在线视频| 国产91精品久久久久久| 国产精品三级久久久久久电影| 欧美日韩国产丝袜美女| 性欧美暴力猛交69hd| 日韩中文娱乐网| 国产精品午夜国产小视频| 91麻豆国产语对白在线观看| 国产成人免费91av在线| 激情久久av一区av二区av三区| 青青精品视频播放| 奇门遁甲1982国语版免费观看高清| 亚洲一区中文字幕在线观看| 中文字幕日韩欧美在线| 97视频在线观看免费| 国产主播精品在线| 日韩av网址在线| 韩国19禁主播vip福利视频| 亚洲综合av影视| 国产欧美精品久久久| 秋霞成人午夜鲁丝一区二区三区| 国产视频综合在线| 久久大大胆人体| 日韩大片在线观看视频| 在线观看国产精品淫| 亚洲国产精品va在看黑人| 国产精品欧美激情在线播放| 中文字幕日韩综合av| 亚洲一区二区在线| 热99精品只有里视频精品| 中文字幕亚洲欧美日韩高清| 91精品国产高清自在线看超| 亚洲精品美女久久久久| 亚洲视频在线观看视频| 欧美日韩亚洲成人|