使用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中如何解决软键盘遮挡输入框

(贺俊可15865645412)如何使用javascript实现网页上相册的3D特效 - ______ <html><head></head><body><script type="text/javascript"> var createDiv = document.createElement("div");//createDiv.innerHTML = "adasas" createDiv.style.height = "122px"; createDiv.style.width = "122px"; document.body....

(贺俊可15865645412)网页浏览记录数据怎么使用在建模中 - ______ 可以通过使用three.js实现在网页上显示3D模型,具体操作方法如下:1、先用proe转成obj格式的文件,再用OBJLoader.js将其载入即可实现.2、试过转成vtk的格式,在Chrome可以显示,但在ie11没显示.3、浏览器需Chrome 及 ie11以上.不用装额外插件及flash.

(贺俊可15865645412)threejs加载3d模型 怎样控制鼠标 - ______ 解决方案:用raycaster这个类,例子:Left to right: buffer geometry - geometry - indexed buffer geometry

(贺俊可15865645412)如何使点的three.js 2D图形 - ______ 演示实验场景效果 下面的演示将会向你展示使用Three.js库和WebGL渲染出的场景效果.也许它也可以通过WebGL直接实现该效果,但是如果加上Three.js库的帮助,将会使得开发变得更加简单.1. Nucleal Nucleal 是一个搭载Three.js实现的WebGL实验,它能够将图片分解成成千上万的物理颗粒.你可以选择多种图片的颗粒组合效果,包括速度和效果.动画的实现非常平滑自然令人印象深刻.2. Lights 光照效果 Lights 光照效果实现了一个惊人的视觉体验,它由Three.js所驱动,它搭配了多种颜色丰富的形状,这是一道光,它穿过一个充满五颜六色形状的空间,效果非常震撼,建议带上耳机效果会更好.

(贺俊可15865645412)threejs加载3d模型 怎样控制鼠标点击选中某个模型 - ______ https://threejs.org/examples/?q=outlin#webgl_postprocessing_outline 官网有例子 把touch事件换成click事件就行了

(贺俊可15865645412)three.js怎么在线展示大于100兆的3D模型 - ______ 在线展示100M的3D模型问题不是怎么展示,而主要是100M除非是内网要不打开个网页得要多久?

(贺俊可15865645412)在用three.js画一个航线图,3D的 我现在做好了地球但是不知道怎样在球上加上点,并用线将他们连接起来急 - ______ 给你个思路.具体要自己写.球的中心点知道,半径知道,那么表面所有点的xyz坐标能得出.高亮你行进路线上的点.

(贺俊可15865645412)three.js可以使用gpu吗 - ______ 首先获取点击的位置,然后转换成3d的坐标,使用raycaster 向坐标发射一个射线,如果击中了表示点击成功.大概思路是这个,three.js有demo的.

(贺俊可15865645412)在线急等,关于网页中如何通过threejs 导入带动画的模型 - ______ 额 这个很简单啊 红包都就没必要了. 你的问题是maya的obj模型 你要转化成three.js的json格式. threejs提供了这个工具 three/utils/exporters/maya/plug-ins中 是python的 你上github下一份three的源码就好啦就可以用了

(贺俊可15865645412)three.js可以在移动端使用吗 - ______ three现在还很不成熟,而且有很多OpenGL和webGL的内容,可以在移动端使用,但是借口什么的都没有很清楚,会造成一些很奇怪的bug