赞
踩
现代浏览器都支持 WebGL,这样我们就不必使用 Flash、Java 等插件就能在浏览器中创建三维图形。虽然 WebGL 提供的接口非常丰富和强大,但使用起来过于繁琐和复杂。
Three.js 的出现完美地解决了这个矛盾。它提供一个很简单的关于 WebGL 特性的 JavaScript API,使得用户不需要详细地学习 WebGL,就能轻松创作出好看的三维图形样例。
基本上所有的现代浏览器都支持 Three.js。
如果想在低版本的 IE 浏览器(IE10 或者更低版本)上运行 Three.js,可以安装 iewebgl 插件。
Three.js 还可以在移动设备上运行,不同设备对于 Three.js 的支持情况如下:
在ThreeJs中有个物体元素的基类,通过设置顶点的个数来呈现不同的几何体,一个顶点一般是三个参数即xyz的坐标点,如果设置两个参数,则z轴默认为0 。
ThreeJs中所有的模型都是通过顶点来构成的。比如:线模型(两个顶点),网格模型的基本单位三角形(三个顶点)
同时顶点可以有颜色值,还有顶点法向量(光照影响)
几何体的本质:
立方体网格模型Mesh是由立方体几何体geometry和材质material两部分构成,立方体几何体BoxGeometry
本质上就是一系列的顶点构成,只是Threejs的APIBoxGeometry
把顶点的生成细节封装了,用户可以直接使用
- var geometry = new THREE.BoxGeometry(100, 100, 100); //创建一个立方体几何对象Geometry
- var material = new THREE.MeshLambertMaterial({
- color: 0x0000ff
- }); //材质对象Material
- var mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
几何体对象:
几何体对象 | 区别 | 场景 |
Geometry | 顶点数据用一个对象表示 | 适用于一般案例场景 |
BufferGeometry | 顶点数据使用类型化数组集中表示 | 适用于实际应用场景,使用 BufferGeometry 可以有效减少向 GPU 传输上述数据所需的开销 |
几何体结构:
几何体对象 | 属性 | 旋转、缩放、平移 |
Geometry | vertices(位置),colors(颜色),face3(每个三角面属性) | 改变几何体的顶点位置数据 |
BufferGeometry | attributes(属性,包括position,color,normal... ),index (索引,便于重复使用顶点) | 改变几何体的顶点位置数据 |
材质就像是物体的皮肤,决定物体外表的样子,例如物体的颜色,看起来是否光滑,是否有贴图等等。
本质: 顶点着色器、片元着色器代码、unifomrs数据
分类:点材质、线材质、网格材质、精灵材质、自定义着色器材质
常用网格材质:
以网格 Phong 材质为例创建材质
- var material = new THREE.MeshPhongMaterial({
- color: "yellow" //设置颜色为yellow
- });
-
- //创建物体
- var cube = new THREE.Mesh(geometry, material);
类型 | 特性 | 渲染方式 |
点模型 | 几何体的每个顶点,可以设置大小 | 每个顶点对应位置都会渲染出来一个方形的点区域 |
线模型 | 两个顶点构成一线条,可以设置大小,变换位置 | 从第一个点开始到最后一个点,依次连成线 |
网格模型 | 三个顶点构成一个三角面,可以设置大小,变换位置 | 顶点每三个顶点为一组可以确定一个三角形,顶点可以重复使用 |
模拟生活中的光源效果
环境光:没有特定的方向,只有颜色。不会产生阴影,可以理解为全局的背景色。
点光源:由一个点散发的光,类似于蜡烛,可以设置阴影。
平行光:从一个方向平行照射的光,类似于阳光,可以设置阴影。
基类Geometry:BoxGeometry、CylinderGeometry、SphereGeometry ...
几何体有提供的基类对象:
2D转3D的几种方案:
ExtrudeGeometry 拉伸:
ExtrudeGeometry 扫描:
常见几何体:
类型 | Geometry | BufferGeometry |
长方体 | BoxGeometry | BoxBufferGeometry |
圆柱体 | CylinderGeometry | CylinderBufferGeometry |
球体 | SphereGeometry | SphereBufferGeometry |
圆锥 | SphereGeometry | SphereBufferGeometry |
正四面体 | TetrahedronGeometry | TetrahedronBufferGeometry |
正八面体 | OctahedronGeometry | OctahedronBufferGeometry |
正十二面体 | OctahedronGeometry | OctahedronBufferGeometry |
正二十面体 | DodecahedronGeometry | DodecahedronBufferGeometry |
圆平面 | CircleGeometry | CircleBufferGeometry |
矩形平面 | PlaneGeometry | PlaneBufferGeometry |
贴图是通过将图像应用到对象的一个或多个面,来为3D对象添加细节的一种方法。
这使我们能够添加表面细节,而无需将这些细节建模到我们的3D对象中,从而大大精简3D模型的多边形边数,提高模型渲染性能
应用场景:
UV映射原理:
相机拍照本质就是投影计算的过程,相机分为两种相机,正投影相机OrthographicCamera和透视投影相机PerspectiveCamera。
目前的实际项目中,一般使用的就是 PerspectiveCamera,其他相机很少用。
相机对象 | 特性 | 应用场景 |
正投影相机 | 物体不受物体与相机的距离影响,改变相机位置,物体大小不会变化 | 小的场景,比如一些物品展示 |
透视投影相机 | 物体随着距离的变化显示的大小会变化,类似于人的眼睛 | 大的场景,比如游戏,地图,数据展示之类的 |
相机是继承基类Object3D,所以相机有position属性来设置位置。然后通过.lookAt()来设置相机对着哪里(看向哪里)。
精灵模型对象Sprite
可导出模型:几何体、网格模型、材质、光源、相机...
导出方法:toJSON()
导出一个json的过程:threejs对象-->从threejs对象提取数据-->执行toJSON方法得到一个对象-->将JSON对象转为字符串→HTML5的文件保存模块
几种可导入模型类型:
THREEJS 中的后期处理通道(ShaderPass)以及特效合成器(effectComposer)
后期处理通道(Pass),每个通道都是一个ShaderPass,也就是一个Shader,熟悉 GLSL 的 learner 都可以自定义ShaderPass,每个通道就类似于美图秀秀的滤镜的功能,能给你的画面一些特效,比如发光、褐色、清新之类的。
而特效合成器(effectComposer)就会把叠加在这个画面上的所有通道(一个画面可以叠加多个通道,类似于一个图片用多个滤镜)的结果计算并渲染出来,所以特效合成器也算是一个render
案例:让场景模型点击发光。
主要后期处理代码:
- this.composer = new EffectComposer(this.renderer)
- var renderPass = new RenderPass(this.scene, this.camera)
- this.composer.addPass(renderPass)
- this.outlinePass = new OutlinePass(
- new THREE.Vector2(window.innerWidth, window.innerHeight),
- this.scene,
- this.camera
- )
- this.outlinePass.edgeStrength = 5 //包围线浓度
- this.outlinePass.edgeGlow = 0.5 //边缘线范围
- this.outlinePass.edgeThickness = 2 //边缘线浓度
- this.outlinePass.pulsePeriod = 2 //包围线闪烁频率
- this.outlinePass.visibleEdgeColor.set('#ffffff') //包围线颜色
- this.outlinePass.hiddenEdgeColor.set('#190a05') //被遮挡的边界线颜色
- this.composer.addPass(this.outlinePass)
处理前效果:
处理后效果:
web worker
,web worker
是运行在后台的 JavaScript,它独立于其他脚本,不会影响页面的性能,通过webworker先把计算做好,再渲染。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。