three.js实现3 d影院的原理的代码分析

  

本篇文章我们通过介绍3 d影院的视觉原理,并介绍了three.js事件处理过程,全面分析了实现3 d影院的基础知识。

  

1。创建一个3 d的空间

  

可以想象一下我们在房间内,房间是一个立方体,如果你有生活品味,可能会在房间内贴上壁纸,three.js可以很方便的创建一个立方体,并且给它的周围贴上纹理,让照相机在立方体之中,照相机可以360旋转,就模拟了一个真实的场景。

  

转换为代码:

        const path=资产/图像/'   const格式=' jpg '   const url=[   “${路径}px ${}格式”,“${路径}nx ${格式}’,   “${路径}py ${}格式”,“$ {path}纽约${}格式”,   “${路径}pz ${}格式”,“${路径}{格式}新西兰元'   ]   const材料=[]   url。forEach (url=比;{   const textureLoader=new textureLoader ()   textureLoader.setCrossOrigin (this.crossOrigin)   const纹理=textureLoader.load (url)   材料。推动(新MeshBasicMaterial ({   地图:纹理,   透支:没错,   一面:臀部   }))   })   const立方体=new网(新CubeGeometry(9000、9000、9000),新MeshFaceMaterial(材料)   this.scene.add(立方体)      

  

CubeGeometry创建一个超大的立方体MeshFaceMaterial给立方体贴上文理,由于视角是在立方体内部,所以一面:背面2。粒子效果

  

一个3 d模型是由点,线,面组成的,可以遍历模型的每一个点,把每一个点转换为几何模型,并且给它贴上文理,拷贝每一个点的位置,用这些几何模型重新构成一个只有点的模型,这就是粒子效果的基本原理。

        这一点。点=新组()   const顶点=[]   让点   const纹理=new TextureLoader () .load(“资产/图像/dot.png”)   geometry.vertices。forEach ((o, i)=比;{//记录每个点的位置   vertices.push (o.clone ())   const _geometry=new几何()//拿到当前点的位置   const pos顶点=[我]   _geometry.vertices。推动(新Vector3 ())   const=new颜色()   颜色。r=Math.abs (math . random () * 10)   颜色。g=Math.abs (math . random () * 10)   颜色。b=Math.abs (math . random () * 10)   const材料=new PointsMaterial ({   的颜色,   大小:math . random () * 4 + 2,   地图:纹理,   混合:AddEquation,   depthTest:假的,   透明:真   })   点=new点(_geometry、材料)   point.position.copy (pos)   this.points.add(点)   })   返回this.points      

  

新组创建一个群,可以说是粒子的集合通过point.position.copy (pos)设置粒子和位置,坐标和模型中对应点的位置相同3。点击事件的处理

  

three.js的点击事件需要借助光线投射器(Raycaster),为了方便理解,请先看一张图:

  

 three.js实现3 d影院的原理的代码分析

  

Raycaster发射一个射线,intersectObject监测射线命中的物体

        这一点。raycaster=new raycaster ()//把你要监听点击事件的物体用数组储存起来   this.seats.push(座位)      onTouchStart(事件){   event.preventDefault ()   事件。clientX=event.touches [0] .clientX;   事件。clientY=event.touches [0] .clientY;   this.onClick(事件)   }>   const vertext='   void main ()   {   gl_Position=projectionMatrix * modelViewMatrix * vec4(位置,1.0);   }   `      const片段='   制服vec2决议;   统一的浮动时间;      vec2兰特(vec2 pos)   {   返回部分(0.00005 *(战俘(pos + 2.0, pos.yx + 1.0) * 22222.0));   }   vec2 rand2 (vec2 pos)   {   返回兰德公司(rand (pos));   }      浮动softnoise (vec2 pos,浮动范围)   {   vec2 smplpos=pos *规模;   浮动c0=rand2((地板(smplpos) + vec2(0.0, 0.0))/规模)方式;   c1=rand2浮动(地板(smplpos) + vec2(1.0, 0.0))/规模)方式;   浮动c2=rand2((地板(smplpos) + vec2(0.0, 1.0))/规模)方式;   浮动c3=rand2((地板(smplpos) + vec2(1.0, 1.0))/规模)方式;      vec2 a=打破(smplpos);   返回组合(   混合(c0, c1, smoothstep (0.0, 1.0, a.x)),   混合(c2、c3 smoothstep (0.0, 1.0, a.x)),   smoothstep (0.0, 1.0, a.y));   }      void main(空白)   {   vec2 pos=gl_FragCoord。xy/resolution.y;   pos.x +=* 0.1;   浮色=0.0;   浮动s=1.0;   for (int i=0;我& lt;8;我+ +)   {   颜色+=softnoise (pos + vec2(我)* 0.02 * 4.0)/s/2.0;   *=2.0;   }   gl_FragColor=vec4(颜色);   }   `//设置物体的质材为着色器质材   让材料=new ShaderMaterial ({   制服,制服,   vertexShader: vertext,   fragmentShader:片段,   透明:没错,   })   

three.js实现3 d影院的原理的代码分析