You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three.js提供有控制模型的控件OrbitControls.js,引入后可通过var controls = new THREE.OrbitControls(camera,renderer.domElement);来控制模型。由于本案例产品只需要模型能通过绕Y轴进行预览,所以没有引入控件,而是通过监听touchstart和touchmove事件,及结合requestAnimationFrame进行控制。
一、Threejs简介
Three.js是基于原生WebGl API和着色器封装得到的3D引擎,也就是一个.js库。通过原生WebGL直接编写程序,会比较麻烦,一般开发项目直接使用Three.js引擎。
程序的整体结构
Three.js提供了丰富的API,模型和灯光组成场景,Threes.js的
渲染器
结合场景
和相机
,就能渲染出3d效果。模型
Three.js提供各种几何体Geometry的API用来构造几何体,也可以使用模型加载器,例如OBJLoader加载.obj文件,几何体Geometry和材质Material结合,组成模型Mesh。材质可以类比现实于生活的材料,比如玻璃、木材等,几何体就是一个骨架,就像窗户的铝合金框架,给框架安装玻璃后才能成为窗户。也就是给几何体拼接材质后,才会组成一个模型。Three.js也提供各种创建各种材质的API,材质可以设置颜色,也可以使用贴图。
几何体 + 材质 => 模型
窗体骨架 + 玻璃 => 窗户
本案例是通过OBJLoader加载美术提供的.obj文件,加载完毕后,再给其设置纹理贴图
使用不同的材质可以得到不同的kiki模型
光源
世间五彩缤纷,是因为有光,如果没有关,所有物体都是黑色。所以为了更好的渲染场景,Three.js提供了生活中常见的一些光源api。包括环境光AmbientLight、点光源PointLightSpotLight、平行光DirectionalLight和聚光灯光源SpotLight,效果如下
从几何体的顶部照射两道光,可以看到点光源的两侧有阴影,而平行光则没有
纹理贴图
通过纹理贴图加载器TextureLoader的
load()
方法加载一张图片可以返回一个纹理对象Texture
,纹理对象Texture
可以作为模型材质颜色贴图.map
属性的值。材质的颜色贴图属性
.map
设置后,模型会从纹理贴图上采集像素值,这时候一般来说不需要再设置材质颜色.color
。.map
贴图之所以称之为颜色贴图就是因为网格模型会获得颜色贴图的颜色值RGB。摄像机
Three.js是通过场景、渲染器和相机构造出的3D效果,相机对象分为正投影相机OrthographicCamera和透视投影相机PerspectiveCamera。正视投影相当于平行光,投影面积只跟投影角度有关,跟投影距离无关。透视投影则相当于人眼观察世界,从相机的位置发散出去。
创建摄像机
二、本次实践
协作关系
3D美术导出kiki的模型文件kiki.obj,及5张不同kiki的纹理贴图。前端使用Three.js提供的OBJLoader模型加载器加载kiki.obj模型,加载完毕后,给其设置相应kiki公仔的纹理贴图。
初始化
首先初始化渲染出三位场景的必备因素,场景、相机和渲染器
加载模型
由于打包工具不具备解析obj文件的loader,所以需要将文件上传到CDN服务器,然后从服务器加载,然obj无法上传cdn,通过修改拓展名完成上传。
加载材质
加载材质有两种方案,方案一,前端自然光,加载烘焙后贴图;方案二,前端自然光+点光源,加载无灯光处理的贴图。本案例采用方案二
模型控制
Three.js提供有控制模型的控件OrbitControls.js,引入后可通过
var controls = new THREE.OrbitControls(camera,renderer.domElement);
来控制模型。由于本案例产品只需要模型能通过绕Y轴进行预览,所以没有引入控件,而是通过监听touchstart和touchmove事件,及结合requestAnimationFrame进行控制。防止内存泄漏
组件关闭时移除相应时间,并重置requestAnimationFrame的标志位
参考文章
Three.js教程
The text was updated successfully, but these errors were encountered: