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

用Three.js寫一個(gè)下雨動(dòng)畫

開發(fā) 前端
最近看了《Three.js開發(fā)指南》,深刻地意識(shí)到光看不練跟沒看差不多,所以就練習(xí)寫了這個(gè)小動(dòng)畫。

 最近看了《Three.js開發(fā)指南》,深刻地意識(shí)到光看不練跟沒看差不多,所以就練習(xí)寫了這個(gè)小動(dòng)畫。

項(xiàng)目地址:

https://github.com/alasolala/threejs-tutorial.git

前置知識(shí)

WebGL讓我們能在瀏覽器開發(fā)3D應(yīng)用,然而直接使用WebGL編程還是挺復(fù)雜的,開發(fā)者需要知道WebGL的底層細(xì)節(jié),并且學(xué)習(xí)復(fù)雜的著色語言來獲得WebGL的大部分功能。Three.js提供了一系列很簡單的關(guān)于WebGL特性的JavaScript API,使開發(fā)者可以很方便地創(chuàng)作出好看的3D圖形。在Three.js官網(wǎng),就有很多酷炫3D效果[1]。

使用Three.js開發(fā)3D應(yīng)用,通常要包括渲染器(Renderer)、場景(Scene)、照相機(jī)(Camera),以及你在場景中創(chuàng)建的物體,光照。

設(shè)想一下照相的情況,我們需要一個(gè)場景(Scene),在這個(gè)場景中擺好要拍攝的物體,設(shè)置光照環(huán)境,擺放好照相機(jī)(Camera)的位置和朝向,然后就可以拍照了。渲染器(Renderer)可能和攝影師比較像吧,負(fù)責(zé)下命令拍攝,并且生成圖像(照片)。

將下面的代碼的復(fù)制并運(yùn)行,就可以得到一個(gè)很簡單的3D場景。

image.png 

  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.   <meta charset="UTF-8">  
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge">  
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0">  
  7.   <title>room</title>  
  8. </head>  
  9. <body> 
  10.   <div id="webgl-output"></div>  
  11.   <script src="https://unpkg.com/three@0.119.0/build/three.js"></script>  
  12.   <script>  
  13.     function init () {  
  14.       const scene = new THREE.Scene()  
  15.       const camera = new THREE.PerspectiveCamera(45,   
  16.         window.innerWidth / window.innerHeight,  
  17.         0.1,  
  18.         1000  
  19.       )  
  20.       camera.position.set(-30, 40, 30) 
  21.       camera.lookAt(0,0,0)  
  22.       scene.add(camera)   
  23.       const planeGeometry = new THREE.PlaneGeometry(60,20)  
  24.       const planeMaterial = new THREE.MeshLambertMaterial({  
  25.         color: 0xAAAAAA  
  26.       })    
  27.       const plane = new THREE.Mesh(planeGeometry, planeMaterial)  
  28.       plane.rotation.x = -Math.PI / 2  
  29.       plane.position.set(15, 0, 0)  
  30.       scene.add(plane)  
  31.       const sphereGeometry = new THREE.SphereGeometry(4, 20, 20)  
  32.       const sphereMaterial = new THREE.MeshLambertMaterial({  
  33.         color: 0xffff00  
  34.       })  
  35.       const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)  
  36.       sphere.position.set(20, 4, 2)  
  37.       scene.add(sphere)  
  38.       const spotLight = new THREE.SpotLight(0xffffff)  
  39.       spotLight.position.set(-20, 30, -15)  
  40.       scene.add(spotLight)  
  41.       const renderer = new THREE.WebGLRenderer()  
  42.       renderer.setClearColor(new THREE.Color(0x000000))  
  43.       renderer.setSize(window.innerWidth, window.innerHeight)  
  44.       document.getElementById('webgl-output').appendChild(renderer.domElement)  
  45.       renderer.render(scene, camera)  
  46.     } 
  47.     init()  
  48. </script>  
  49. </body>  
  50. </html> 

場景(Scene)

THREE.Scene對象是所有不同對象的容器,但這個(gè)對象本身沒有很復(fù)雜的操作,我們通常在程序最開始的時(shí)候?qū)嵗粋€(gè)場景,然后將照相機(jī)、物體、光源添加到場景中。 

  1. const scene = new THREE.Scene()  
  2. scene.add(camera)        //添加照相機(jī)  
  3. scene.add(plane)         //添加灰色平面  
  4. scene.add(sphere)        //添加黃色球體  
  5. scene.add(spotLight)     //添加光源 

照相機(jī)(Camera)

Three.js庫提供了兩種不同的照相機(jī):透視投影照相機(jī)和正交投影照相機(jī)。 

  1. 透視投影照相機(jī)的效果類似人眼在真實(shí)世界中看到的場景,有 "近大遠(yuǎn)小" 的效果,垂直視平面的平行線在遠(yuǎn)方會(huì)相交。  
  2. 正交投影照相機(jī)的效果類似我們在數(shù)學(xué)幾何學(xué)課上老師教我們畫的效果,在三維空間內(nèi)平行的線,在屏幕上永遠(yuǎn)不會(huì)相交。 

我們這里用的是透視投影照相機(jī),就主要討論它,正交投影照相機(jī)后面用到再說。 

  1. const camera = new THREE.PerspectiveCamera(  
  2.   45,   
  3.   window.innerWidth / window.innerHeight,  
  4.   0.1,  
  5.   1000  
  6.  
  7. camera.position.set(-30, 40, 30)  
  8. camera.lookAt(0,0,0)  
  9. scene.add(camera)  

設(shè)置一個(gè)照相機(jī)分三步:確定視野范圍, 確定照相機(jī)坐標(biāo), 確定照相機(jī)聚焦點(diǎn)。

我們在new THREE.PerspectiveCamera的時(shí)候確定照相機(jī)的視野范圍,對應(yīng)上圖,45是fov,就是視野上下邊緣之間的夾角。window.innerWidth / window.innerHeight是視野水平方向和豎直方向長度的比值,0.1(near)和1000(far)分別是照相機(jī)到視景體最近、最遠(yuǎn)的距離,這些參數(shù)決定了要顯示的三維空間的范圍,也就是上圖中的灰色區(qū)域。

camera.position.set(-30, 40, 30)確定了照相機(jī)在空間中的坐標(biāo)。

camera.lookAt(0,0,0)確定了照相機(jī)聚焦點(diǎn),該點(diǎn)和照相機(jī)坐標(biāo)的連線就是拍攝方向。

上圖中的灰色區(qū)域在屏幕上的顯示效果,也就是將三維空間的坐標(biāo)投影到屏幕二維坐標(biāo)是webgl完成的,我們只需要關(guān)心三維空間的坐標(biāo)。

坐標(biāo)系

與我們之前講到的CSS的3D坐標(biāo)系[2]不同,webgl坐標(biāo)系是右手坐標(biāo)系,X軸向右,Y軸向上,Z軸是指向“自己”的。

伸出右手,讓拇指和食指成"L"形,大拇指向右,食指向上。其余的手指指向自己,這樣就建立了一個(gè)右手坐標(biāo)系。

其中,拇指、食指和其余手指分別代表x,y,z軸的正方向

在空間中定位、平移都比較好理解,這里看一下旋轉(zhuǎn)。

有時(shí),我們會(huì)這樣設(shè)置物體的旋轉(zhuǎn):object.rotation.x = \-Math.PI / 2,表示的是繞X軸旋轉(zhuǎn)-90度。具體是怎么旋轉(zhuǎn),就要對照上面坐標(biāo)系,展開右手,拇指指向x軸正方向,其余手指的彎曲方向就是旋轉(zhuǎn)的正方向;拇指指向x軸負(fù)方向,其余手指的彎曲方向就是旋轉(zhuǎn)的負(fù)方向。y軸和z軸旋轉(zhuǎn)方向的判斷同理。

物體

在three.js中,創(chuàng)建一個(gè)物體需要兩個(gè)參數(shù):幾何形狀(Geometry)和 材質(zhì)(Material)。通俗的講,幾何形狀決定物體的形狀,材質(zhì)決定物體表面的顏色、紋理貼圖、對光照的反應(yīng)等等。 

  1. //創(chuàng)建一個(gè)平面幾何體,參數(shù)是沿X方向的Width和沿Y方向的height  
  2. const planeGeometry = new THREE.PlaneGeometry(60,20)    
  3. //創(chuàng)建一種材質(zhì),MeshLambertMaterial是一種考慮漫反射而不考慮鏡面反射的材質(zhì)  
  4. const planeMaterial = new THREE.MeshLambertMaterial({  
  5.   color: 0xAAAAAA  
  6. })    
  7. //根據(jù)幾何形狀和材質(zhì)創(chuàng)建物體  
  8. const plane = new THREE.Mesh(planeGeometry, planeMaterial)  
  9. //設(shè)置物體的位置和旋轉(zhuǎn),并將物體加到場景(scene)中 
  10. plane.rotation.x = -Math.PI / 2  
  11. plane.position.set(15, 0, 0)  
  12. scene.add(plane) 

一些常用的幾何形狀和材質(zhì)可以參考Three.js入門指南[3]

光照

沒有光源,渲染的場景將不可見(除非你使用基礎(chǔ)材質(zhì)或線框材質(zhì),當(dāng)然,在構(gòu)建3D應(yīng)用時(shí),幾乎不怎么用基礎(chǔ)材質(zhì)和線框材質(zhì))。

WebGL本身并不支持光源。如果不使用Three.js,則需要自己寫WebGL著色程序來模擬光源。Three.js讓光源的使用變得簡單。 

  1. const spotLight = new THREE.SpotLight(0xffffff)  
  2. spotLight.position.set(0, 0, 100)  
  3. scene.add(spotLight) 

如上所示,我們只需要?jiǎng)?chuàng)建一個(gè)光源,并將它加入到場景中就可以了。three.js會(huì)根據(jù)光源的類型、位置等信息計(jì)算出場景中各個(gè)物體的展示效果。

最常用的幾種光源是AmbientLight、PointLight、SpotLight、DirectionalLight。

渲染器(Renderer)

當(dāng)場景中的照相機(jī)、物體、光照等準(zhǔn)備就緒,就該渲染器上場了。

在上面那個(gè)小例子中,我們是這樣使用渲染器的: 

  1. //new 一個(gè)渲染器  
  2. const renderer = new THREE.WebGLRenderer()  
  3. //設(shè)置畫布背景色,也就是畫布中沒有物體的地方的顯示顏色  
  4. renderer.setClearColor(new THREE.Color(0x000000))  
  5. //設(shè)置畫布大小  
  6. renderer.setSize(window.innerWidth, window.innerHeight)  
  7. //將畫布元素(即renderer.domElement,它是一個(gè)canvas元素)掛載到一個(gè)dom節(jié)點(diǎn)  
  8. document.getElementById('webgl-output').appendChild(renderer.domElement)  
  9. //執(zhí)行渲染操作,參數(shù)是上面定義的場景(scene)和照相機(jī)(camera)  
  10. renderer.render(scene, camera) 

可以看出,使用Three.js開發(fā)3D應(yīng)用,我們只需要關(guān)心場景中物體、照相機(jī)、光照等在三維空間中的布局,以及運(yùn)動(dòng),具體怎么渲染都由Three.js去完成。當(dāng)然,懂一些webgl的基本原理會(huì)更好,畢竟有一些應(yīng)用會(huì)復(fù)雜到three.js的API滿足不了要求。

實(shí)現(xiàn)下雨動(dòng)畫

初始化場景

因?yàn)槊總€(gè)3D應(yīng)用的初始化都有scene、camera、render,所以我們把這三者的初始化封裝成一個(gè)類Template,后面的應(yīng)用初始化可以通過子類繼承這個(gè)類,以便快速搭建框架。 

  1. import {  
  2.   Scene,  
  3.   PerspectiveCamera,  
  4.   WebGLRenderer,  
  5.   Vector3,  
  6.   Color  
  7. } from 'three'  
  8. export default class Template { 
  9.   constructor () {               //各種默認(rèn)選項(xiàng)  
  10.     this.el = document.body  
  11.     this.PCamera = {  
  12.       fov: 45, 
  13.       aspect: window.innerWidth / window.innerHeight,  
  14.       near: 1,  
  15.       far: 1000  
  16.     }  
  17.     this.cameraPostion = new Vector3(0, 0, 1)  
  18.     this.cameraLookAt = new Vector3(0,0,0)  
  19.     this.rendererColor = new Color(0x000000)  
  20.     this.rendererWidth = window.innerWidth  
  21.     this.rendererHeight = window.innerHeight  
  22.   }  
  23.   initPerspectiveCamera () {     //初始化相機(jī),這里是透視相機(jī)  
  24.     const camera = new PerspectiveCamera(  
  25.       this.PCamera.fov,  
  26.       this.PCamera.aspect,  
  27.       this.PCamera.near,  
  28.       this.PCamera.far,  
  29.     ) 
  30.     camera.position.copy(this.cameraPostion)  
  31.     camera.lookAt(this.cameraLookAt)  
  32.     this.camera = camera  
  33.     this.scene.add(camera)  
  34.   }  
  35.   initScene () {                //初始化場景  
  36.     this.scene = new Scene()   
  37.   }  
  38.   initRenderer () {             //初始化渲染器  
  39.     const renderer = new WebGLRenderer()  
  40.     renderer.setClearColor(this.rendererColor)  
  41.     renderer.setSize(this.rendererWidth, this.rendererHeight) 
  42.     this.el.appendChild(renderer.domElement)  
  43.     this.renderer = renderer  
  44.   }  
  45.   init () {  
  46.     this.initScene()  
  47.     this.initPerspectiveCamera()  
  48.     this.initRenderer()  
  49.   }  

在我們的下雨動(dòng)畫中,創(chuàng)建一個(gè)Director類管理動(dòng)畫,它繼承自Template類。可以看出,它要做的事很清晰:初始化框架、修改父類的默認(rèn)配置、添加物體(云層和雨滴)、添加光照(閃電也是光照形成的)、添加霧化效果、循環(huán)渲染。 

  1. //director.js  
  2. export default class Director extends Template{  
  3.   constructor () {  
  4.     super()  
  5.     //set params  
  6.     //camera  
  7.     this.PCamera.fov = 60       //修改照相機(jī)的默認(rèn)視場fov  
  8.     //init camera/scene/render  
  9.     this.init()  
  10.     this.camera.rotation.x = 1.16   //設(shè)置照相機(jī)的旋轉(zhuǎn)角度(望向天空)  
  11.     this.camera.rotation.y = -0.12  
  12.     this.camera.rotation.z = 0.27  
  13.     //add object  
  14.     this.addCloud()                  //添加云層和雨滴  
  15.     this.addRainDrop()  
  16.     //add light  
  17.     this.initLight()                //添加光照,用PointLight模擬閃電  
  18.     this.addLightning() 
  19.      //add fog  
  20.     this.addFog()                   //添加霧,在相機(jī)附近視野清晰,距離相機(jī)越遠(yuǎn),霧的濃度越高  
  21.     //animate  
  22.     this.animate()                 //requestAnimationFrame實(shí)現(xiàn)動(dòng)畫  
  23.   } 

創(chuàng)建不斷變換的云層

我們首先創(chuàng)建一個(gè)平面,將一小朵云做為材質(zhì),得到一個(gè)云朵物體。然后將很多云朵物體進(jìn)行疊加,得到一團(tuán)云。

image.png 

  1. //Cloud.js  
  2. const texture = new TextureLoader().load('/images/smoke.png')  //加載云朵素材  
  3. const cloudGeo = new PlaneBufferGeometry(564, 300)   //創(chuàng)建平面幾何體  
  4. const cloudMaterial = new MeshLambertMaterial({   //圖像作為紋理貼圖,生成材質(zhì)  
  5.   map: texture,  
  6.   transparent: true  
  7. })  
  8. export default class Cloud {  
  9.   constructor () {        
  10.     const cloud = new Mesh(cloudGeo, cloudMaterial)   //生成云朵物體  
  11.     cloud.material.opacity = 0.6  
  12.     this.instance = cloud  
  13.   } 
  14.   setPosition (x,y,z) {  
  15.     this.instance.position.set(x,y,z) 
  16.   }  
  17.   setRotation (x,y,z) {  
  18.     this.instance.rotation.x = x  
  19.     this.instance.rotation.y = y  
  20.     this.instance.rotation.z = z  
  21.   }  
  22.   animate () {  
  23.     this.instance.rotation.z -0.003            //云朵的運(yùn)動(dòng)是不斷繞著z軸旋轉(zhuǎn)  
  24.   }  

在Director類中,生成30個(gè)云朵物體,隨機(jī)設(shè)置它們的位置和旋轉(zhuǎn),形成鋪開和層疊的效果。在循環(huán)渲染時(shí)調(diào)用云朵物體的animate方法。 

  1. //director.js  
  2. addCloud () {  
  3.   this.clouds = []  
  4.   for(let i = 0; i < 30; i++){  
  5.     const cloud = new Cloud()  
  6.     this.clouds.push(cloud)  
  7.     cloud.setPosition(Math.random() * 1000 - 460, 600, Math.random() * 500 - 400)  
  8.     cloud.setRotation(1.16, -0.12, Math.random() * 360)  
  9.     this.scene.add(cloud.instance)  
  10.   }  
  11.  
  12. animate () {  
  13.     //cloud move  
  14.     this.clouds.forEach((cloud) => {  //調(diào)用每個(gè)云朵物體的animate方法,形成整個(gè)云層的不斷變換效果  
  15.       cloud.animate()  
  16.     })  
  17.     ...  
  18.     this.renderer.render(this.scene, this.camera)  
  19.     requestAnimationFrame(this.animate.bind(this))  
  20.   } 

環(huán)境光和閃電

同時(shí)使用了AmbientLight和DirectionalLight作為整個(gè)場景的穩(wěn)定光源,增強(qiáng)對現(xiàn)實(shí)場景的模擬。 

  1. //director.js  
  2. initLight () {  
  3.   const ambientLight = new AmbientLight(0x555555)  
  4.   this.scene.add(ambientLight)  
  5.   const directionLight = new DirectionalLight(0xffeedd)  
  6.   directionLight.position.set(0,0,1)  
  7.   this.scene.add(directionLight)  

用PointLight模擬閃電,首先是初始一個(gè)PointLight。 

  1. //director.js  
  2. addLightning () {  
  3.   const lightning = new PointLight(0x062d89, 30, 500, 1.7)  
  4.   lightning.position.set(200, 300, 100)  
  5.   this.lightning = lightning  
  6.   this.scene.add(lightning)  

在循環(huán)渲染時(shí),不斷隨機(jī)改變點(diǎn)光源PointLight的強(qiáng)度(power),形成閃爍的效果,當(dāng)強(qiáng)度較小,即光線暗下來時(shí),"悄悄"改變點(diǎn)光源的位置,這樣就能不突兀使閃電隨機(jī)地出現(xiàn)在云層地各個(gè)位置。 

  1. //director.js  
  2. animate () {  
  3.   ...  
  4.   //lightning  
  5.   if(Math.random() > 0.93 || this.lightning.power > 100){  
  6.     if(this.lightning.power < 100){  
  7.       this.lightning.position.set(  
  8.         Math.random() * 400,  
  9.         300 + Math.random() * 200,  
  10.         100  
  11.       )  
  12.     }  
  13.     this.lightning.power = 50 + Math.random() * 500  
  14.   }  
  15.   this.renderer.render(this.scene, this.camera)  
  16.   requestAnimationFrame(this.animate.bind(this))  

創(chuàng)建雨滴

創(chuàng)建雨滴用到的粒子效果。創(chuàng)建一組粒子,直觀的方法是,創(chuàng)建一個(gè)粒子物體,然后復(fù)制N個(gè),分別定義它們的位置和旋轉(zhuǎn)。

當(dāng)你使用少量的對象時(shí),這很有效,但是當(dāng)你想使用大量的THREE.Sprite對象時(shí),你會(huì)很快遇到性能問題,因?yàn)槊總€(gè)對象需要分別由Three.js進(jìn)行管理。

Three.js提供了另一種方式來處理大量的粒子,這需要使用THREE.Points。通過THREE.Points,Three.js不再需要管理大量單個(gè)的THREE.Sprite對象,而只需管理THREE.Points實(shí)例。

使用THREE.Points,可以非常容易地創(chuàng)建很多細(xì)小的物體,用來模擬雨滴、雪花、煙和其他有趣的效果。

THREE.Points的核心思想,就是先聲明一個(gè)幾何體geom,然后確定幾何體各個(gè)頂點(diǎn)的位置,這些頂點(diǎn)的位置將會(huì)是各個(gè)粒子的位置。通過PointsMaterial確定頂點(diǎn)的材質(zhì)material,然后new Points(geom, material),根據(jù)傳入的幾何體和頂點(diǎn)材質(zhì)生成一個(gè)粒子系統(tǒng)。

粒子的移動(dòng):粒子的位置坐標(biāo)是由一組數(shù)字確定const positions = this.geom.attributes.position.array,這組數(shù)字,每三個(gè)數(shù)確定一個(gè)坐標(biāo)點(diǎn)(x\y\z),所以要改變粒子的X坐標(biāo),就改變positions[ 3n ] (n是粒子序數(shù));同理,Y坐標(biāo)對應(yīng)的是positions[ 3n+1 ],Z坐標(biāo)對應(yīng)的是positions[ 3n+2 ]。

  1. //RainDrop.js  
  2. export default class RainDrop {  
  3.   constructor () {  
  4.     const texture = new TextureLoader().load('/images/rain-drop.png') 
  5.     const material = new PointsMaterial({    //用圖片初始化頂點(diǎn)材質(zhì)  
  6.       size: 0.8,  
  7.       map: texture,  
  8.       transparent: true  
  9.     })   
  10.     const positions = []  
  11.     this.drops = 8000  
  12.     this.geom = new BufferGeometry()  
  13.     this.velocityY = []  
  14.     for(let i = 0; i < this.drops; i++){  
  15.       positions.push( Math.random() * 400 - 200 )  
  16.       positions.push( Math.random() * 500 - 250 )  
  17.       positions.push( Math.random() * 400 - 200 )  
  18.       this.velocityY.push(0.5 + Math.random() / 2)  //初始化每個(gè)粒子的坐標(biāo)和粒子在Y方向的速度 
  19.     }  
  20.      //確定各個(gè)頂點(diǎn)的位置坐標(biāo)  
  21.     this.geom.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) )    
  22.     this.instance = new Points(this.geom, material)  //初始化粒子系統(tǒng)  
  23.   }  
  24.   animate () {  
  25.     const positions = this.geom.attributes.position.array;  
  26.      for(let i=0; i<this.drops * 3; i+=3){    //改變Y坐標(biāo),加速運(yùn)動(dòng)  
  27.       this.velocityY[i/3] += Math.random() * 0.05  
  28.       positions[ i + 1 ] -=  this.velocityY[i/3]  
  29.       if(positions[ i + 1 ] < -200){  
  30.         positions[ i + 1 ] =  200  
  31.         this.velocityY[i/3] = 0.5 + Math.random() / 2  
  32.       }            
  33.     }  
  34.     this.instance.rotation.y += 0.002   
  35.      this.geom.attributes.position.needsUpdate = true  
  36.   }  

將雨滴粒子添加到場景中,并在循環(huán)渲染時(shí),調(diào)用RainDrop的animate方法: 

  1. //director.js  
  2. addRainDrop () {  
  3.   this.rainDrop = new RainDrop()  
  4.   this.scene.add(this.rainDrop.instance)  
  5.  
  6. animate () {  
  7.   //rain drop move  
  8.   this.rainDrop.animate()  
  9.   ...  
  10.   this.renderer.render(this.scene, this.camera)  
  11.   requestAnimationFrame(this.animate.bind(this))  
  12.  

 

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2022-03-07 09:20:00

JavaScripThree.jsNFT

2025-06-17 08:15:00

VTK.jsThree.js3D

2022-01-16 19:23:25

Three.js粒子動(dòng)畫群星送福

2022-07-15 13:09:33

Three.js前端

2023-07-13 10:48:22

web 3DThree.jsBlender

2021-11-23 22:50:14

.js 3D幾何體

2017-05-08 11:41:37

WebGLThree.js

2021-11-22 06:14:45

Three.js3D 渲染花瓣雨

2018-12-04 13:30:28

Javascript編譯原理前端

2025-05-15 08:45:00

開源前端手勢

2025-05-13 02:01:00

Three.jsSprite粒子

2019-11-29 09:30:37

Three.js3D前端

2022-10-20 11:49:49

JS動(dòng)畫幀,CSS

2024-07-18 06:58:36

2021-11-27 10:42:01

Three.js3D可視化AudioContex

2023-04-10 14:20:47

ChatGPTRESTAPI

2021-12-14 11:44:37

可視化Three.js 信息

2021-12-03 07:27:30

全景瀏覽Three.js

2022-07-08 10:39:09

Three.js元宇宙VR

2025-03-13 10:54:18

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

区一区二在线观看| 国产精品免费福利| 亚洲午夜在线| xxxx日本免费| xvideos亚洲人网站| 亚洲成人三区| 国产一级精品毛片| 亚洲一区二区久久久久久| 蜜臀av性久久久久蜜臀aⅴ| 在线中文字幕网站| 色哟哟国产精品| 亚洲人视频在线观看| 国产一区免费在线观看| 亚洲欧美另类在线| 国产原创在线观看| 国产原创popny丨九色| 亚洲综合色自拍一区| 色呦呦在线观看视频| 国产a视频免费观看| 欧美精品久久天天躁| 欧美久久一区二区三区| 成都免费高清电影| 国产精品日韩专区| 成人夜色视频网站在线观看| 欧美熟妇交换久久久久久分类| 先锋影音日韩| 欧美日韩裸体免费视频| 自拍偷拍亚洲视频| 国产无限制自拍| 亚洲妇熟xx妇色黄| 国产精欧美一区二区三区蓝颜男同| 国产又爽又黄ai换脸| 成人午夜私人影院| 成年人视频在线免费看| 成人精品一区二区三区电影免费| 成人午夜激情片| 欧美女v视频| 97超级在线观看免费高清完整版电视剧| 99精品国产99久久久久久白柏| 青青草在线播放| 91沈先生在线观看| 99re在线精品| 成人午夜免费在线观看| 国产精品亚洲一区二区三区| 国产一区导航| 黄色一级大片在线免费观看| 欧美在线日韩在线| 国产很黄免费观看久久| 自拍偷拍你懂的| 91精品国产91久久久久| 久久精品国产精品青草| 天堂av电影在线观看| 国产一区自拍视频| 精品日韩视频在线观看| 这里视频有精品| 亚洲天堂av中文字幕| 91视频免费网站| 国内外成人在线| 欧美三级网站| 精品一卡二卡三卡| 亚洲视频在线观看视频| 欧洲亚洲视频| 国产wwwwxxxx| 欧美一区二区三区精品电影| 成a人片亚洲日本久久| 日本三级视频在线观看| 亚洲美女在线播放| 欧美大胆在线视频| 电影一区二区三区久久免费观看| 少妇高潮在线观看| 国产精品偷伦视频免费观看国产| 国产成人无遮挡在线视频| 污网站在线免费看| 五月天婷婷丁香网| 3d动漫啪啪精品一区二区免费 | 天堂午夜影视日韩欧美一区二区| 亚洲av激情无码专区在线播放| 97干在线视频| 欧美性xxxxx极品少妇| 日韩精品一区二区三区免费观影| 国产日本精品视频| 男人操女人免费| 亚洲国产精彩中文乱码av| 国产精品性做久久久久久| 国产黄色在线网站| 老司机午夜av| 欧美乱妇高清无乱码| 久久99国产精品麻豆| 懂色av中文在线| 午夜免费一区二区| 国产精品88a∨| 国产欧美日韩视频一区二区| 日本一区二区在线看| 三级在线观看网站| 97超碰青青草| 久久午夜a级毛片| 欧美国产激情二区三区| 最新日韩精品| 最新日韩免费视频| 国产大片精品免费永久看nba| 26uuu另类欧美| 成人激情综合| 毛茸茸free性熟hd| 欧美一级淫片aaaaaaa视频| 亚洲男人都懂的| 亚洲成人资源| av网址在线免费观看| 日本精品在线观看视频| 日本一区免费看| 美日韩丰满少妇在线观看| 懂色av一区二区夜夜嗨| 大菠萝精品导航| 五月婷婷一区二区| 特级西西人体www高清大胆| 久久久久久久999| 一级日本不卡的影视| 大桥未久女教师av一区二区| 五月婷婷亚洲综合| 艳母动漫在线免费观看| 欧美精品久久一区二区| 亚洲午夜视频在线| 久久精品免费看| 亚洲男人在线| 大胆av不用播放器在线播放| 麻豆国产尤物av尤物在线观看 | 国产精品久久99| 你懂的网址国产 欧美| 欧美一区久久久| 少妇无码一区二区三区| 日本高清不卡免费| 国产一线二线三线在线观看| 成人国产精品久久久久久亚洲| 国产亚洲综合久久| 成人免费在线观看入口| 日韩综合小视频| 精品国产aⅴ| 国产精品专区免费| 精品视频一二区| 在线观看天堂av| 在线a免费观看| 日韩国产精品一区二区| 日韩av电影中文字幕| 亚洲精品综合精品自拍| 欧美色图一区二区三区| 欧美激情自拍偷拍| 免费在线亚洲| 日韩电影在线视频| 88久久精品| 国产福利电影在线播放| 毛片免费在线| 91在线视频国产| 免费视频网站www| 黄色国产在线观看| 国产一区二区网| 伊人精品久久久久7777| 风间由美一区二区三区| 欧美激情视频给我| 亚洲精品成人免费| 欧美综合天天夜夜久久| 一区在线观看免费| 亚洲国产精品成人综合色在线婷婷 | 日韩精品xxxx| 蜜桃导航-精品导航| 国产精品狼人色视频一区| 69av视频在线播放| 久久网福利资源网站| 欧美大片免费久久精品三p| 亚洲成人你懂的| 久久影院视频免费| 日韩精品dvd| 动漫一区二区| 久久国产香蕉视频| 国产三级aaa| 国产艳俗歌舞表演hd| 欧美成人精品欧美一级乱| 精品国产一区探花在线观看| 182在线视频| 在线观看一区二区三区视频| 制服国产精品| 美女黄毛**国产精品啪啪| 国产精品久久久久久亚洲调教| 精品无人区太爽高潮在线播放| 亚洲成a人v欧美综合天堂| 美腿丝袜亚洲一区| 麻豆精品视频在线观看| 精品亚洲自拍| 中文字幕21页在线看| 精品人妻一区二区三区麻豆91 | 日韩最新av| 成人免费高清观看| av在线导航| 在线观看国产黄| 国产a免费视频| 在线免费观看成年人视频| jizz18女人| 国产xxxx振车| 亚洲国产综合自拍| 韩国成人av| 国产精品免费一区二区三区观看| 91亚洲一区精品| 欧美第一页在线| 国产一区二区三区在线观看网站 | 妖精视频成人观看www| youjizz欧美| 日韩成人18| 亚洲肉体裸体xxxx137| 欧美大片1688网站| 欧洲精品久久久久毛片完整版| 四虎4545www国产精品| 国产极品久久久久久久久波多结野| av手机在线观看| 涩涩涩久久久成人精品| 一区二区亚洲视频| 小小影院久久| 色狼人综合干| 五月久久久综合一区二区小说| 国产精品传媒精东影业在线| 国产欧美一区二区三区精品观看| 妖精视频一区二区三区| 欧美一区一区| 亚洲a∨精品一区二区三区导航| 国产精品99久久久久久董美香 | 女女互磨互喷水高潮les呻吟| 欧美色图亚洲激情| 免费中文字幕在线| 色婷婷国产精品免| 日韩免费一级片| 91欧美日韩麻豆精品| 亚洲毛片欧洲毛片国产一品色| 黄色网址在线免费观看| av小次郎在线| 2021天堂中文幕一二区在线观| 久久av影院| 亚洲免费专区| 99久久精品费精品国产| 久久电影网站中文字幕| 精品伊人久久久久7777人| 91丨porny丨中文| 欧美日韩国产中文精品字幕自在自线| 555www色欧美视频| 亚洲午夜性刺激影院| 国产精品1区2区在线观看| 狼狼综合久久久久综合网| 亚洲色成人www永久在线观看| 日本熟妇人妻xxxxx| 婷婷国产成人精品视频| 懂色av中文字幕| 亚洲av激情无码专区在线播放| 午夜小视频在线| av高清一区| 四季av一区二区三区免费观看 | 欧美日韩亚洲在线 | 亚洲综合色在线观看| 爱爱的免费视频| 五月激情丁香网| 久久这里精品| 91探花在线观看| 欧美一级网址| 狠狠做深爱婷婷综合一区| 亚洲精品国产setv| 日韩精品午夜视频| 一区二区久久久久久| 亚洲高清一二三区| 欧美日韩xxx| 欧美在线视频免费播放| 黄色网址在线免费看| 91看片在线免费观看| 女同毛片一区二区三区| 91看片在线播放| 经典三级在线| 中文字幕视频精品一区二区三区| 午夜免费一区| 国产欧美精品一区二区色综合朱莉 | 欧美日韩尤物久久| av永久不卡| 麻豆精品国产91久久久久久| 欧美性高潮在线| 日韩免费一区二区三区在线播放| 国产精品网址在线| 好色先生视频污| 91精品小视频| 精品国产av鲁一鲁一区| 亚洲精品无播放器在线播放| 激情久久久久| 国产精品久久久久婷婷二区次| 亚洲成人激情视频| 高清国产在线一区| 91精品人妻一区二区三区四区| 在线观看免费中文字幕| 成人福利av| 国语精品一区| 国产精品天干天干在线综合| 亚洲白拍色综合图区| 国产精品国模大尺度私拍| 搡女人真爽免费午夜网站| www.youjizz.com亚洲| 调教一区二区| 亚洲mv大片欧洲mv大片| 日韩一区有码在线| 精品中文字幕视频| 色欲色香天天天综合网www| 日本少妇激情视频| 亚洲成a人片| 麻豆精品在线视频| 欧美日韩国产大片| 亚洲精品免费av| 国产制服丝袜在线| 成人短视频在线| 少妇精品久久久| 亚洲精品国产品国语在线app| 另类美女黄大片| 蜜臀久久99精品久久久酒店新书| 中文字幕一区二区在线视频| 大型av综合网站| 国产精品久久久久久久久动漫| 九九热这里只有精品免费看| 黄色一级视频片| 亚洲天堂中文网| 午夜先锋成人动漫在线| 国产精品伦理一区二区| 热久久免费国产视频| 久久精品视频在线观看免费| 天天操天天干天天爱| 国产乱码精品一区二区亚洲| 黑人精品xxx一区| 成人黄色免费片| 国产免费a级片| 毛片免费在线观看| 好看的日韩av电影| 日韩欧美一区二区三区| 青青草成人网| 久久国产视频一区| 九色精品91| 午夜精品成人在线| 99se婷婷在线视频观看| 亚洲国产美女视频| 九色porny自拍视频在线观看| 成人精品免费看| 国产成人+综合亚洲+天堂| 麻豆av免费看| 日本高清在线观看| 精品一区二区av| 亚洲欧美制服中文字幕| 日本日本19xxxⅹhd乱影响| 日本激情一区二区| 秋霞午夜av一区二区三区| 久久精品国产69国产精品亚洲 | 日韩一区二区三区视频| 亚洲欧洲国产精品久久| 精品毛片在线观看| 欧美最新另类人妖| 亚洲天堂精品视频| 147欧美人体大胆444| 久久久久亚洲av无码专区体验| 成人黄页网站视频| 玉米视频成人免费看| 亚洲精品免费在线视频| 久草国产精品视频| 亚洲成人tv| 欧美群妇大交群中文字幕| 日本福利一区二区三区| 国产模特av私拍大尺度| 日韩av在线播放网址| 亚洲色无码播放| www.亚洲成人网| 美丽的姑娘在线观看免费动漫| 精品一区二区久久| 国产精品对白刺激| 无码国产69精品久久久久同性| 成人毛片免费| 色老综合老女人久久久| 亚洲AV无码成人精品一区| 国产又粗又猛又黄又爽无遮挡| 影音先锋日韩在线| 色偷偷偷综合中文字幕;dd| 欧洲美熟女乱又伦| 国产原创一区| 午夜视频在线观看一区二区三区| 日韩视频在线免费播放| 欧洲一区av| 91免费看视频| 久久综合福利| 国产精品影院在线| 国产视频一区二区三区在线观看 | 98色花堂精品视频在线观看| 国产亚洲欧美日韩日本| 国产日韩欧美综合精品| 精品久久久免费视频| 日韩精品电影在线| 国产精品9999| 精品人妻aV中文字幕乱码色欲| 高清不卡在线观看| 秋霞av国产精品一区| 日本五十熟hd丰满| 韩日精品在线| 欧美成人午夜激情在线| 国产又黄又爽又无遮挡| 丝袜诱惑制服诱惑色一区在线观看 | 成人国产激情| 亚洲综合一区二区|