當前位置:編程學習大全網 - 源碼下載 - 使用three.js如何實現3D影院

使用three.js如何實現3D影院

本篇文章主要給大家講解了如何通過three.js實現3D影院的功能以及原理分析,需要的朋友參考壹下吧。

本篇文章我們通過介紹3D影院的視覺原理,並介紹了three.js事件處理過程,全面分析了實現3D影院的基礎知識。

1.創建壹個3d的空間

可以想象壹下我們在房間內,房間是壹個立方體,如果妳有生活品味,可能會在房間內貼上壁紙,three.js可以很方便的創建壹個立方體,並且給它的周圍貼上紋理,讓照相機在立方體之中,照相機可以360旋轉,就模擬了壹個真實的場景。

轉換為代碼:

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創建壹個超大的立方體 MeshFaceMaterial給立方體貼上文理,由於視角是在立方體內部,所以side:BackSide 2.粒子效果

壹個3d模型是由點,線,面組成的,可以遍歷模型的每壹個點,把每壹個點轉換為幾何模型,並且給它貼上文理,拷貝每壹個點的位置,用這些幾何模型重新構成壹個只有點的模型,這就是粒子效果的基本原理。

this.points = new Group()

const vertices = []

let point

const texture = new TextureLoader().load('assets/image/dot.png')

geometry.vertices.forEach((o, i) => {

// 記錄每個點的位置

vertices.push(o.clone())

const _geometry = new Geometry()

// 拿到當前點的位置

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.pointsnew Group創建壹個群,可以說是粒子的集合通過point.position.copy(pos)設置粒子和位置,坐標和模型中對應點的位置相同 3.點擊事件的處理

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

Raycaster發射壹個射線,intersectObject監測射線命中的物體

this.raycaster = new Raycaster()

// 把妳要監聽點擊事件的物體用數組儲存起來

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)

// 檢測命中的座位

const intersects = this.raycaster.intersectObjects(this.seats)

if (intersects.length > 0) {

intersects[0].object.material = new MeshLambertMaterial({

color: 0xff0000

})

}

}intersects.length > 0 表示射線命中了某個幾何體偷懶只實現了移動端的點擊實現,如果想看pc怎麽實現,請看thee.js官網

4.著色器的初步使用

著色器分為頂點著色器和片元著色器,用GLSL語言編寫,是壹種和GPU溝通的的語言,這裏只講如何使用

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);

}

`

// 設置物體的質材為著色器質材

let material = new ShaderMaterial({

uniforms: uniforms,

vertexShader: vertext,

fragmentShader: fragment,

transparent: true,

})5.光暈效果

由於是模擬電影院,我想做壹個投影儀,模擬投影儀射出的光線。

// 光暈效果必須設置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)上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

在mongoose中有關於更新對象的詳細介紹

在JS函數中有關setTimeout詳細介紹

使用jquery如何實現側邊欄左右伸縮效果

在Vue中如何實現數字輸入框組件

在jquery中如何實現自定義顯示消息數量

在Angular2中如何實現組件交互

在js中如何解決軟鍵盤遮擋輸入框

  • 上一篇:如何在多個Wowza Streaming Engine之間實現負載均衡
  • 下一篇:如何使用redis cluster命令集群節點
  • copyright 2024編程學習大全網