最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

three.js實(shí)現(xiàn)3D影院的原理的代碼分析

 更新時(shí)間:2017年12月18日 13:54:04   投稿:laozhang  
本篇文章主要給大家講解了如何通過three.js實(shí)現(xiàn)3D影院的功能以及原理分析,需要的朋友參考一下吧。

本篇文章我們通過介紹3D影院的視覺原理,并介紹了three.js事件處理過程,全面分析了實(shí)現(xiàn)3D影院的基礎(chǔ)知識(shí)。

1.創(chuàng)建一個(gè)3d的空間

可以想象一下我們?cè)诜块g內(nèi),房間是一個(gè)立方體,如果你有生活品味,可能會(huì)在房間內(nèi)貼上壁紙,three.js可以很方便的創(chuàng)建一個(gè)立方體,并且給它的周圍貼上紋理,讓照相機(jī)在立方體之中,照相機(jī)可以360旋轉(zhuǎn),就模擬了一個(gè)真實(shí)的場(chǎng)景。

轉(zhuǎn)換為代碼:

const path = 'assets/image/'
 const format = '.jpg'
 const urls = [
 `${path}px${format}`, `${path}nx${format}`,
 `${path}py${format}`, `${path}ny${format}`,
 `${path}pz${format}`, `${path}nz${format}`
 ]
 const materials = []
 urls.forEach(url => {
 const textureLoader = new TextureLoader()
 textureLoader.setCrossOrigin(this.crossOrigin)
 const texture = textureLoader.load(url)
 materials.push(new MeshBasicMaterial({
 map: texture,
 overdraw: true,
 side: BackSide
 }))
 })
 const cube = new Mesh(new CubeGeometry(9000, 9000, 9000), new MeshFaceMaterial(materials))
 this.scene.add(cube)

CubeGeometry創(chuàng)建一個(gè)超大的立方體 MeshFaceMaterial給立方體貼上文理,由于視角是在立方體內(nèi)部,所以side:BackSide 2.粒子效果

一個(gè)3d模型是由點(diǎn),線,面組成的,可以遍歷模型的每一個(gè)點(diǎn),把每一個(gè)點(diǎn)轉(zhuǎn)換為幾何模型,并且給它貼上文理,拷貝每一個(gè)點(diǎn)的位置,用這些幾何模型重新構(gòu)成一個(gè)只有點(diǎn)的模型,這就是粒子效果的基本原理。

this.points = new Group()
 const vertices = []
 let point
 const texture = new TextureLoader().load('assets/image/dot.png')
 geometry.vertices.forEach((o, i) => {
 // 記錄每個(gè)點(diǎn)的位置
 vertices.push(o.clone())
 const _geometry = new Geometry()
 // 拿到當(dāng)前點(diǎn)的位置
 const pos = vertices[i]
 _geometry.vertices.push(new Vector3())
 const color = new Color()
 color.r = Math.abs(Math.random() * 10)
 color.g = Math.abs(Math.random() * 10)
 color.b = Math.abs(Math.random() * 10)
 const material = new PointsMaterial({
 color,
 size: Math.random() * 4 + 2,
 map: texture,
 blending: AddEquation,
 depthTest: false,
 transparent: true
 })
 point = new Points(_geometry, material)
 point.position.copy(pos)
 this.points.add(point)
 })
 return this.points

new Group創(chuàng)建一個(gè)群,可以說是粒子的集合通過point.position.copy(pos)設(shè)置粒子和位置,坐標(biāo)和模型中對(duì)應(yīng)點(diǎn)的位置相同 3.點(diǎn)擊事件的處理

three.js的點(diǎn)擊事件需要借助光線投射器(Raycaster),為了方便理解,請(qǐng)先看一張圖:

Raycaster發(fā)射一個(gè)射線,intersectObject監(jiān)測(cè)射線命中的物體

this.raycaster = new Raycaster()
// 把你要監(jiān)聽點(diǎn)擊事件的物體用數(shù)組儲(chǔ)存起來(lái)
this.seats.push(seat)

onTouchStart(event) {
 event.preventDefault()
 event.clientX = event.touches[0].clientX;
 event.clientY = event.touches[0].clientY;
 this.onClick(event)
 }

 onClick(event) {
 const mouse = new Vector2()
 mouse.x = ( event.clientX / this.renderer.domElement.clientWidth ) * 2 - 1
 mouse.y = - ( event.clientY / this.renderer.domElement.clientHeight ) * 2 + 1;
 this.raycaster.setFromCamera(mouse, this.camera)
 // 檢測(cè)命中的座位
 const intersects = this.raycaster.intersectObjects(this.seats)
 if (intersects.length > 0) {
 intersects[0].object.material = new MeshLambertMaterial({
  color: 0xff0000
 })
 }
 }

intersects.length > 0 表示射線命中了某個(gè)幾何體偷懶只實(shí)現(xiàn)了移動(dòng)端的點(diǎn)擊實(shí)現(xiàn),如果想看pc怎么實(shí)現(xiàn),請(qǐng)看thee.js官網(wǎng)

4.著色器的初步使用

著色器分為頂點(diǎn)著色器和片元著色器,用GLSL語(yǔ)言編寫,是一種和GPU溝通的的語(yǔ)言,這里只講如何使用

const vertext = `
 void main()
 {
 gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
 }
 `

const fragment = `
 uniform vec2 resolution;
 uniform float time;

 vec2 rand(vec2 pos)
 {
 return fract( 0.00005 * (pow(pos+2.0, pos.yx + 1.0) * 22222.0));
 }
 vec2 rand2(vec2 pos)
 {
 return rand(rand(pos));
 }

 float softnoise(vec2 pos, float scale)
 {
 vec2 smplpos = pos * scale;
 float c0 = rand2((floor(smplpos) + vec2(0.0, 0.0)) / scale).x;
 float c1 = rand2((floor(smplpos) + vec2(1.0, 0.0)) / scale).x;
 float c2 = rand2((floor(smplpos) + vec2(0.0, 1.0)) / scale).x;
 float c3 = rand2((floor(smplpos) + vec2(1.0, 1.0)) / scale).x;

 vec2 a = fract(smplpos);
 return mix(
 mix(c0, c1, smoothstep(0.0, 1.0, a.x)),
 mix(c2, c3, smoothstep(0.0, 1.0, a.x)),
 smoothstep(0.0, 1.0, a.y));
 }

 void main(void)
 {
 vec2 pos = gl_FragCoord.xy / resolution.y;
 pos.x += time * 0.1;
 float color = 0.0;
 float s = 1.0;
 for(int i = 0; i < 8; i++)
 {
 color += softnoise(pos+vec2(i)*0.02, s * 4.0) / s / 2.0;
 s *= 2.0;
 }
 gl_FragColor = vec4(color);
 }
 `
// 設(shè)置物體的質(zhì)材為著色器質(zhì)材
 let material = new ShaderMaterial({
 uniforms: uniforms,
 vertexShader: vertext,
 fragmentShader: fragment,
 transparent: true,
 })

5.光暈效果

由于是模擬電影院,我想做一個(gè)投影儀,模擬投影儀射出的光線。

// 光暈效果必須設(shè)置alpha = true
 const renderer = this.renderer = new WebGLRenderer({alpha: true, antialias: true})

 let textureFlare = new TextureLoader().load('assets/image/lensflare0.png')
 let textureFlare3 = new TextureLoader().load('assets/image/lensflare3.png')
 let flareColor = new Color(0xffffff)
 let lensFlare = new LensFlare(textureFlare, 150, 0.0 , AdditiveBlending, flareColor)
 lensFlare.add(textureFlare3, 60, 0.6, AdditiveBlending);
 lensFlare.add(textureFlare3, 70, 0.7, AdditiveBlending);
 lensFlare.add(textureFlare3, 120, 0.9, AdditiveBlending);
 lensFlare.add(textureFlare3, 70, 1.0, AdditiveBlending);
 lensFlare.position.set(0, 150, -85)

主要的光線還是靠lensflare0.png模擬 textureFlare3設(shè)置光暈的范圍

相關(guān)文章

  • Javascript的一種模塊模式

    Javascript的一種模塊模式

    全局變量是魔鬼。在YUI中,我們僅用兩個(gè)全局變量:YAHOO和YAHOO_config。YUI的一切都是使用YAHOO對(duì)象級(jí)的成員或這個(gè)成員作用域內(nèi)的變量。我們建議在你的應(yīng)用程序也使用類似的規(guī)則。
    2010-09-09
  • 原生js實(shí)現(xiàn)下拉菜單

    原生js實(shí)現(xiàn)下拉菜單

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)下拉菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 由 element.appendChild(newNode) ,談開去

    由 element.appendChild(newNode) ,談開去

    由 element.appendChild(newNode) ,談開去...
    2006-11-11
  • Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼

    Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼

    這篇文章主要介紹了Javascript實(shí)現(xiàn)可旋轉(zhuǎn)的圓圈實(shí)例代碼,可實(shí)現(xiàn)圓圈的旋轉(zhuǎn)與運(yùn)動(dòng)效果,涉及javascript動(dòng)態(tài)操作頁(yè)面元素屬性及進(jìn)行相應(yīng)數(shù)學(xué)運(yùn)算的技巧,需要的朋友可以參考下
    2015-08-08
  • js中Array對(duì)象的常用遍歷方法詳解

    js中Array對(duì)象的常用遍歷方法詳解

    今天小編就為大家分享一篇關(guān)于js中Array對(duì)象的常用遍歷方法詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • javascript學(xué)習(xí)基礎(chǔ)筆記之DOM對(duì)象操作

    javascript學(xué)習(xí)基礎(chǔ)筆記之DOM對(duì)象操作

    javascript是一種基于對(duì)象和世界驅(qū)動(dòng),并且安全性較強(qiáng)的腳本語(yǔ)言。一個(gè)完整的javascript實(shí)現(xiàn)包括核心(ECMAScript),文檔對(duì)象模型(DOM)和瀏覽器對(duì)象模型(BOM)
    2011-11-11
  • js canvas實(shí)現(xiàn)擦除動(dòng)畫

    js canvas實(shí)現(xiàn)擦除動(dòng)畫

    在移動(dòng)設(shè)備上將某張圖片擦掉顯示另一張圖片,利用canvas來(lái)實(shí)現(xiàn)這篇文章就為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)擦除動(dòng)畫的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 以fetch為例詳解如何消除js異步的傳染性

    以fetch為例詳解如何消除js異步的傳染性

    這篇文章主要為大家介紹了以fetch為例詳解如何消除js異步的傳染性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • js中對(duì)象與對(duì)象創(chuàng)建方法的各種方法

    js中對(duì)象與對(duì)象創(chuàng)建方法的各種方法

    這篇文章主要給大家介紹了關(guān)于js中對(duì)象與對(duì)象創(chuàng)建方法的各種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • js 性能優(yōu)化之算法和流程控制

    js 性能優(yōu)化之算法和流程控制

    循環(huán)處理是最常見的編程模式之一,也是提升性能必須關(guān)注的要點(diǎn)之一。本文將對(duì)此進(jìn)行介紹。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論

廉江市| 浦江县| 洮南市| 调兵山市| 东莞市| 望江县| 湟中县| 浪卡子县| 屏东市| 绥江县| 玉溪市| 嘉鱼县| 龙陵县| 聊城市| 宜城市| 湖北省| 南宫市| 大渡口区| 济宁市| 互助| 东安县| 额济纳旗| 柞水县| 辉县市| 和平区| 韶山市| 于田县| 保康县| 治多县| 梓潼县| SHOW| 新蔡县| 盱眙县| 禄丰县| 吉林市| 汝南县| 云南省| 海丰县| 稷山县| 龙岩市| 枣庄市|