精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Three.js 的 3D 粒子動畫:群星送福

開發 前端
粒子動畫不是指物體本身的動畫,而是指這些基本單位的動畫。因為是組成物體的單位的動畫,所以會有打碎重組的效果。

”粒子動畫“ 這個詞大家可能經常聽到,那什么是粒子動畫呢?

粒子是指原子、分子等組成物體的最小單位。在 2D 中,這種最小單位是像素,在 3D 中,最小單位是頂點。

粒子動畫不是指物體本身的動畫,而是指這些基本單位的動畫。因為是組成物體的單位的動畫,所以會有打碎重組的效果。

本文我們就來學習下 3D 的粒子動畫,做一個群星送福的效果:

圖片

思路分析

3D 世界中,物體是由頂點構成,3 個頂點構成一個三角形,然后給三角形貼上不同的紋理,這樣就是一個三維模型。

也就是說,3D 模型是由頂點確定的幾何體(Geometry),貼上不同的紋理(Material)所構成的物體(Mesh 等)。

之后,把 3D 物體添加到場景(Scene)中,設置一個相機(Camera)角度去觀察,然后用渲染器(Renderer)一幀幀渲染出來,這就是 3D 渲染流程。

3D 物體是由頂點構成,那讓這些頂點動起來就是粒子動畫了,因為基本粒子動了,自然就會有打碎重組的效果。

在“群星送福”效果中,我們由群星打碎重組成了福字,實際上就是群星的頂點運動到了福字的頂點,由一個 3D 物體變成了另一個 3D 物體。

那么群星的頂點從哪里來的?福字的頂點又怎么來呢?

群星的頂點其實是隨機生成的不同位置的點,在這些點上貼上星星的貼圖,就是群星效果。

福字的頂點是加載的一個 3D 模型,解析出它的頂點數據拿到的。

有了兩個 3D 物體的頂點數據,也就是有了動畫的開始結束坐標,那么不斷的修改每個頂點的 x、y、z 屬性就可以實現粒子動畫。

這里的 x、y、z 屬性值的變化不要自己算,用一些動畫庫來算,它們支持加速、減速等時間函數。Three.js 的動畫庫是 Tween.js。

總之,3D 粒子動畫就是頂點的 x、y、z 屬性的變化,會用動畫庫來計算中間的屬性值。由一個物體的頂點位置、運動到另一個物體的頂點位置,會有種打碎重組的效果,這也是粒子動畫的魅力。

思路理清了,那我們來具體寫下代碼吧。

代碼實現

如前面所說,3D 的渲染需要一個場景(Scene)來管理所有的 3D 物體,需要一個相機(Camera)在不同角度觀察,還需要渲染器(Renderer)一幀幀渲染出來。

這部分是基礎代碼,先把這部分寫好:

創建場景:

  1. const scene = new THREE.Scene(); 

創建相機:

  1. const width = window.innerWidth; 
  2. const height = window.innerHeight; 
  3. const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 1000); 

相機分為透視相機和平行相機,我們這里用的透視相機,也就是近大遠小的透視效果。要指定可以看到的視野角度(45)、寬高比(width/height)、遠近范圍(0.1 到 1000)這 3 種參數。

調整下相機的位置和觀察方向:

  1. camera.position.set(100, 0, 400); 
  2. camera.lookAt(scene.position); 

然后是渲染器:

  1. const renderer = new THREE.WebGLRenderer(); 
  2. renderer.setSize(width, height); 
  3. document.body.appendChild(renderer.domElement); 

渲染器要通過 requestAnimationFrame 來一幀幀的渲染:

  1. function render() { 
  2.     renderer.render(scene, camera); 
  3.     requestAnimationFrame(render); 
  4. render(); 

準備工作完成,接下來就是繪制星空、福字這兩種 3D 物體,還有實現粒子動畫了。

繪制星空

星空不是正方體、圓柱體這種規則的幾何體,而是由一些隨機的頂點構成的,這種任意的幾何體使用緩沖幾何體 BufferGeometry 創建。

為啥這種由任意頂點構成的幾何體叫緩沖幾何體呢?

因為頂點在被 GPU 渲染之前是放在緩沖區 buffer 中的,所以這種指定一堆頂點的幾何體就被叫做 BufferGeometry。

我們創建 30000 個隨機頂點:

  1. const vertices = []; 
  2. for ( let i = 0; i < 30000; i ++ ) { 
  3.     const x = THREE.MathUtils.randFloatSpread( 2000 ); 
  4.     const y = THREE.MathUtils.randFloatSpread( 2000 ); 
  5.     const z = THREE.MathUtils.randFloatSpread( 2000 ); 
  6.     vertices.push( x, y, z ); 

這里用了 Three.js 提供的工具 MathUtils 來生成 0 到 2000 的隨機值。

然后用這些頂點創建 BufferGeometry:

  1. const geometry = new THREE.BufferGeometry(); 
  2. geometry.setAttribute( 'position', new THREE.Float32BufferAttribute(vertices, 3)); 

給 BufferGeometry 對象設置頂點位置,指定 3 個數值(x、y、z)為一個坐標。

然后創建這些頂點上的材質(Material),也就是星星的貼圖:

  1. const star = new THREE.TextureLoader().load('img/star.png'); 
  2. const material = new THREE.PointsMaterial( { size: 10, map: star }); 

頂點有了,材質有了,就可以創建 3D 物體了(這里的 3D 物體是 Points)。

  1. const points = new THREE.Points( geometry, material ); 
  2. scene.add(points); 

看下渲染的效果:

靜態的沒 3D 的感覺,我們讓每一幀轉一下,改下 render 邏輯:

  1. function render() { 
  2.     renderer.render(scene, camera); 
  3.     scene.rotation.y += 0.001; 
  4.  
  5.     requestAnimationFrame(render); 

再來看一下:

圖片

3D 星空的感覺有了!

接下來我們來做粒子動畫:

3D 粒子動畫

3D 粒子動畫就是頂點的動畫,也就是 x、y、z 的變化。

我們先來實現個最簡單的效果,讓群星都運動到 0,0,0 的位置:

起始點坐標就是群星的的本來的位置,通過 getAttribute('position') 來取。動畫過程使用 tween.js 來計算:

  1. const startPositions = geometry.getAttribute('position'); 
  2.  
  3. for(let i = 0; i< startPositions.count; i++) { 
  4.     const tween = new TWEEN.Tween(positions); 
  5.  
  6.     tween.to({ 
  7.         [i * 3]: 0, 
  8.         [i * 3 + 1]: 0, 
  9.         [i * 3 + 2]: 0 
  10.     }, 3000 * Math.random()); 
  11.  
  12.     tween.easing(TWEEN.Easing.Exponential.In); 
  13.     tween.delay(3000); 
  14.     tween.onUpdate(() => { 
  15.         startPositions.needsUpdate = true
  16.     }); 
  17.      
  18.     tween.start(); 

每個點都有 x、y、z 坐標,也就是下標為 i3、i3+1、i*3+2 的值,我們指定從群星的起始位置運動到 0,0,0 的位置。

然后指定了時間函數為加速(Easing.Exponential.In),3000 ms 后開始執行動畫。

每一幀渲染的時候要調用下 Tween.update 來計算最新的值:

  1. function render() { 
  2.     TWEEN.update(); 
  3.     renderer.render(scene, camera); 
  4.     scene.rotation.y += 0.001; 
  5.  
  6.     requestAnimationFrame(render); 

每一幀在繪制的時候都會調用 onUpdate 的回調函數,我們在回調函數里把 positions 的 needsUpdate 設置為 true,就是告訴 tween.js 在這一幀要更新為新的數值再渲染了。

第一個粒子動畫完成!

來看下效果(我把這個效果叫做萬象天引):

所有的星星粒子都集中到了一個點,這就是粒子動畫典型的打碎重組感。

接下來,只要把粒子運動到福字的頂點就是我們要做的“群星送福”效果了。

福字模型的頂點肯定不能隨機,自己畫也不現實,這種一般都是在建模軟件里畫好,然后導入到 Three.js 來渲染,

我找了這樣一個福字的 3D 模型:

模型是 fbx 格式的,使用 FBXLoader 加載:

  1. const loader = new THREE.FBXLoader(); 
  2. loader.load('./obj/fu.fbx'function (object) { 
  3.     const destPosition = object.children[0].geometry.getAttribute('position'); 
  4.  
  5. }); 

回調參數就是從 fbx 模型加載的 3D 物體,它是一個 Group(多個 3D 物體的集合),取出第 0 個元素的 geometry 屬性,就是對應的幾何體。

這樣,我們就拿到了目標的頂點位置。

把粒子動畫的結束位置改為福字的頂點就可以了:

  1. const cur = i % destPosition.count
  2. tween.to({ 
  3.     [i * 3]: destPosition.array[cur * 3], 
  4.     [i * 3 + 1]: destPosition.array[(cur * 3 + 1)], 
  5.     [i * 3 + 2]: destPosition.array[(cur * 3 + 2)] 
  6. }, 3000 * Math.random()); 

如果開始頂點位置比較多,超過的部分從 0 的位置再來,所以要取余。

大功告成!

這就是我們想要的粒子效果:

圖片

完整代碼上傳到了 github:https://github.com/QuarkGluonPlasma/threejs-exercize

總結

粒子動畫是組成物體的基本單位的運動,對 3D 來說就是頂點的運動。

我們要實現“群星送福”的粒子動畫,也就是從群星的頂點運動到福字的頂點。

群星的頂點可以隨機生成,使用 BufferGeometry 創建對應的幾何體。福字則是加載創建好的 3D 模型,拿到其中的頂點位置。

有了開始、結束位置,就可以實現粒子動畫了,過程中的 x、y、z 值使用動畫庫 Tween.js 來計算,可以指定加速、減速等時間函數。

粒子動畫有種打碎重組的感覺,可以用來做一些很炫的效果。理解了什么是粒子動畫、粒子動畫中動的是什么,就算是初步掌握了。

我摘下漫天繁星,給大家送一份福氣,新的一年一起加油!

 

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2019-11-29 09:30:37

Three.js3D前端

2024-07-18 06:58:36

2025-05-13 02:01:00

Three.jsSprite粒子

2021-11-27 10:42:01

Three.js3D可視化AudioContex

2021-11-23 22:50:14

.js 3D幾何體

2023-07-13 10:48:22

web 3DThree.jsBlender

2025-06-30 09:15:47

2021-04-21 09:20:15

three.js3d前端

2021-04-23 16:40:49

Three.js前端代碼

2025-09-19 09:29:53

Web 3D引擎Three.jsGalacean

2016-06-01 09:19:08

開發3D游戲

2023-08-04 09:56:15

2023-05-03 09:01:41

CanvasWebGL

2024-02-26 00:00:00

前端工具Space.js

2022-07-15 13:09:33

Three.js前端

2023-09-01 09:30:22

Three.js3D 圖形庫

2017-05-08 11:41:37

WebGLThree.js

2021-11-22 06:14:45

Three.js3D 渲染花瓣雨

2013-01-30 16:15:40

adobeHTML5css3

2025-05-15 08:45:00

開源前端手勢
點贊
收藏

51CTO技術棧公眾號

欧亚乱熟女一区二区在线 | 日韩欧美激情电影| 中文字幕一区免费在线观看| 91日韩久久| 日韩黄色a级片| 欧美综合一区| 亚洲丁香婷深爱综合| 午夜激情福利在线| 亚洲第一图区| 久久久久99精品一区| 91美女片黄在线观看游戏| 日韩久久久久久久久| 欧美成免费一区二区视频| 亚洲精品在线免费播放| 一区二区三区免费播放| av手机免费在线观看| 国产精品久久久久四虎| 久久国产一区| 国产后入清纯学生妹| 国产精品扒开腿做爽爽爽软件| 亚洲精品视频二区| 国产在线视频三区| 日韩欧美精品电影| 五月婷婷激情综合| 在线观看18视频网站| 日韩精品123| 国产成人在线电影| 国产精品揄拍500视频| 欧美不卡视频在线观看| 午夜精品影院| 久久精品电影网站| 无码 人妻 在线 视频| 91蝌蚪精品视频| 欧美一区欧美二区| 日本中文字幕精品—区二区| 欧美xx视频| 精品日韩美女的视频高清| 成人小视频在线观看免费| 免费在线观看av片| 国产欧美1区2区3区| 欧美高清视频一区| 少妇荡乳情欲办公室456视频| 国产美女在线观看一区| 国产精品丝袜一区二区三区| 激情网站在线观看| 久久在线精品| 日本亚洲欧洲色| 久久精品视频1| 国产精品社区| 欧洲美女免费图片一区| 日本少妇久久久| 黄色在线成人| 久久免费视频这里只有精品| 国产精品19乱码一区二区三区| 亚洲在线久久| 欧美成人免费全部| 久久久久久久久艹| 亚洲国产午夜| 欧美孕妇与黑人孕交| 亚洲另类欧美日韩| 亚洲在线日韩| 国产精品电影一区| 伊人精品一区二区三区| 麻豆国产欧美日韩综合精品二区| 国产精品视频一区国模私拍| 一卡二卡在线观看| 国内外成人在线| 91久久精品www人人做人人爽 | 日韩三级视频在线播放| 亚洲香蕉网站| 欧美一级淫片丝袜脚交| 国产成人一级片| 日韩av一区二区三区四区| 国产精品男人的天堂| 在线播放成人av| 国产一区二区精品久久99| 91一区二区三区| 香蕉视频成人在线| 日本一区二区三区在线不卡| 亚洲韩国在线| 调教一区二区| 日韩欧美国产成人| 最新天堂在线视频| 亚洲高清在线一区| 亚洲精品国精品久久99热| 国产jjizz一区二区三区视频| 久久一区二区三区电影| 欧美激情综合亚洲一二区| 九九热在线免费观看| 久久国产人妖系列| 国产伦精品一区二区三| 国产在线高清| 亚洲一区在线观看免费观看电影高清| a在线视频观看| 日韩电影免费观看高清完整版在线观看| 日韩写真欧美这视频| 免费无码一区二区三区| 色一区二区三区四区| 久久久久国色av免费观看性色| 亚洲自拍一区在线观看| 国产精品一二三| 欧洲精品在线一区| 欧美6一10sex性hd| 欧美日韩亚洲综合一区| 亚洲av成人片无码| 婷婷综合激情| 日本最新高清不卡中文字幕| 精品久久久无码中文字幕| 久久久精品日韩欧美| 成人免费看片视频在线观看| 日韩av首页| 亚洲激情视频在线| 亚洲天堂黄色片| 日本亚洲天堂网| 精品国产aⅴ麻豆| 黄a在线观看| 欧美怡红院视频| 日批在线观看视频| 欧美不卡视频| 成人性生交大片免费观看嘿嘿视频| 日本在线丨区| 亚洲国产婷婷综合在线精品| 日韩精品视频一二三| 女优一区二区三区| 97视频com| 亚洲在线精品视频| 国产日韩在线不卡| 成人一对一视频| 成人av资源网址| 久久精品一偷一偷国产| 最近中文字幕免费观看| 久久婷婷国产综合精品青草| 乱熟女高潮一区二区在线| 在线高清欧美| 久久精品视频在线| 国产精品视频一二区| 国产精品三级电影| 亚洲一区在线不卡| 成人av资源电影网站| 日韩免费中文字幕| 九色蝌蚪在线| 日本道色综合久久| 国产三级av在线播放| 手机精品视频在线观看| 欧美亚洲丝袜| 精品3atv在线视频| 亚洲无限av看| 久久久蜜桃一区二区| 国产香蕉久久精品综合网| 韩国一区二区av| 精品日韩免费| 国产日韩欧美综合| 黄网站app在线观看| 91精品国产91综合久久蜜臀| 99自拍视频在线| 国产一区二区电影| 中文字幕人妻熟女人妻洋洋| 超碰精品在线| 欧洲美女免费图片一区| 国产三级视频在线看| 欧美日韩一区久久| 三级黄色免费观看| 国产精品18久久久久久vr| 久久亚洲a v| 欧美一区 二区| 国产精品av免费在线观看| 成人精品一区| 欧美精品在线观看一区二区| 欧美日韩在线观看成人| 成人午夜激情在线| 毛片一区二区三区四区| 欧美中文字幕一区二区| 91精品视频在线| av3级在线| 亚洲美女喷白浆| 91麻豆国产在线| 亚洲高清不卡在线观看| av网站免费在线播放| 美女任你摸久久| 久久精品在线免费视频| 日韩伦理一区二区三区| 国产精品色悠悠| 欧美韩日亚洲| 亚洲桃花岛网站| 国产白浆在线观看| 狠狠躁夜夜躁人人躁婷婷91| 成人黄色短视频| 成人黄色a**站在线观看| 亚洲精品一二三四五区| 综合久久一区| 欧日韩一区二区三区| 日韩一二三区在线观看| 热99精品里视频精品| 欧美边添边摸边做边爱免费| 亚洲精品一区二区三区精华液 | 在线播放蜜桃麻豆| 亚洲精品自在久久| 国产伦理吴梦梦伦理| 狠狠躁18三区二区一区| 好吊日在线视频| 久久久综合精品| 亚洲成人激情小说| 日韩av电影一区| 3d动漫一区二区三区| 久久免费av| 欧美精品一区二区三区在线四季| 免费看日产一区二区三区 | 精品国产一区三区| 999久久久国产精品| 久久综合给合久久狠狠色| 欧美第一在线视频| 国产精品一区二区三区久久| 欧美日韩国产观看视频| 久久亚洲精品网站| caoporn国产精品免费视频| 亚洲黄色在线观看| 高清一区二区三区四区| 7777精品伊人久久久大香线蕉的| 成人在线免费看视频| 一级特黄大欧美久久久| 三级黄色在线观看| 国产欧美一区二区精品性色超碰| 久久人妻少妇嫩草av无码专区| 国内成+人亚洲+欧美+综合在线| 久久九九国产视频| 在线高清一区| 日本一本中文字幕| 久久久久蜜桃| 永久久久久久| 日韩精品网站| 亚洲 国产 日韩 综合一区| 亚洲伊人春色| 免费看成人片| 要久久爱电视剧全集完整观看 | 永久免费黄色片| 久久精品国产色蜜蜜麻豆| 国产一级不卡毛片| 久久精品日韩欧美| 国产又黄又猛视频| 久久精品亚洲| 妞干网在线免费视频| 男人的天堂亚洲| 99色精品视频| 玖玖精品视频| 冲田杏梨av在线| 六月丁香综合在线视频| 深夜黄色小视频| 久久99精品久久只有精品| 老司机久久精品| 激情五月激情综合网| 亚洲一区二区中文字幕在线观看| 韩国一区二区三区| 在线成人精品视频| 成年人网站91| 国精产品一区一区三区免费视频| 久久亚洲一级片| 1024在线看片| 亚洲少妇最新在线视频| 强行糟蹋人妻hd中文| 亚洲国产日韩综合久久精品| 色播视频在线播放| 色综合久久综合| 在线观看免费视频一区| 3751色影院一区二区三区| 午夜老司机福利| 日韩电影网在线| 电影av一区| 久久成人精品电影| 2018av在线| 国产成人在线亚洲欧美| 人人精品久久| 国产精成人品localhost| 最新精品国偷自产在线| 亚洲一一在线| 欧美日一区二区在线观看 | 麻豆成人av在线| 欧美一区二区三区影院| 91丨porny丨最新| 后入内射无码人妻一区| 亚洲一卡二卡三卡四卡五卡| 亚洲天堂视频网站| 日韩一区二区三区免费观看| 欧美视频xxx| 中文字幕av一区二区三区谷原希美 | 69堂免费精品视频在线播放| 91久久精品美女高潮| 人人香蕉久久| 自拍偷拍一区二区三区| 99视频精品免费观看| 亚洲天堂国产视频| 99久久精品免费| 三级黄色在线观看| 色综合久久久久综合体| aaa一区二区三区| 亚洲天堂色网站| 黄页网站在线| 国产精品美女www爽爽爽视频| 亚洲综合色婷婷在线观看| 欧美不卡在线一区二区三区| 一区二区中文字| 日本999视频| 99久久婷婷国产精品综合| 亚洲熟女毛茸茸| 一本久久a久久精品亚洲| 国产a级免费视频| 最近2019中文免费高清视频观看www99 | 亚洲第一页视频| 日韩在线免费高清视频| 在线观看网站免费入口在线观看国内| 91视频国产高清| 成人av资源电影网站| 欧美在线观看成人| 国产成人免费在线观看| 日本激情视频一区二区三区| 狠狠色香婷婷久久亚洲精品| 风流少妇一区二区三区91| 久久亚洲精品毛片| 亚洲一区二区av| 婷婷五月色综合| 久久久蜜桃一区二区人| 偷偷色噜狠狠狠狠的777米奇| 亚洲欧美一区二区三区久本道91| 亚洲无码精品一区二区三区| 国产偷国产偷亚洲清高网站| 99在线视频影院| 成人三级在线| 欧美成人一品| 亚洲制服在线观看| 中文字幕一区二区5566日韩| jizz国产在线| 亚洲免费av网址| 韩国美女久久| 免费影院在线观看一区| 亚洲综合欧美| 亚洲av无码国产精品久久| 精品久久中文字幕| 污视频软件在线观看| 午夜精品在线视频| 欧美成人一区在线观看| 日本网站免费在线观看| kk眼镜猥琐国模调教系列一区二区| 久久久久亚洲AV成人| 欧美一级久久久久久久大片| 成人免费看片| www 成人av com| 亚洲电影成人| 91av在线免费| 色综合久久久久综合99| freemovies性欧美| 成人免费在线视频网站| 在线观看国产精品入口| 亚洲成人av免费观看| 洋洋成人永久网站入口| 亚洲欧美另类综合| 91精品国产高清久久久久久| 亚洲盗摄视频| 国产 porn| 亚洲图片你懂的| 亚洲精品国产av| 69av在线播放| 大色综合视频网站在线播放| 日韩av.com| 一区二区国产盗摄色噜噜| 天天干天天插天天操| 日本中文字幕久久看| 国产精品久久久久久| 亚洲AV成人精品| 日韩欧美国产黄色| 麻豆传媒在线免费看| 国产精品区一区二区三在线播放 | 欧美日韩亚洲激情| 99re热久久这里只有精品34| 亚洲qvod图片区电影| 亚洲美女黄色| 中文字幕第24页| 日韩欧美在线影院| 欧美成人h版| 国产精品视频一二三四区| 久久午夜色播影院免费高清 | 成人开心激情| 超碰97在线看| 久久夜色精品国产噜噜av| 国产一区二区在线播放视频| 国内偷自视频区视频综合| 国产伦精品一区二区三区千人斩 | 久久中文娱乐网| 国产精品视频在线观看免费| 91精品国产高清久久久久久久久 | av无码精品一区二区三区宅噜噜| 久久久久久国产精品美女| 精品国产乱码久久久久久蜜坠欲下 | 久久久999精品视频| 日韩一级电影| 1314成人网| 日本精品免费观看高清观看| 性直播体位视频在线观看| 日本电影一区二区三区| 高清不卡一区二区| 一级久久久久久久| 情事1991在线|