毕业到工作已经半年了,以前一直在用有道笔记,今天第一次发表自己的技术博客,希望能得到个人的支持和鼓励,也希望以后能坚持。
threejs的三大对象代模型的导入最近一段时间开始接触threejs相关的项目,一直在挖坑和填坑之中,于是用webpack+vue2.5+sass搭建了一个threejs的项目,物理引擎:基于ammo.js的pysijs物理引擎,采用的是vue-clic直接搭建:
npm install -g vue-cli vue init webpack threejstest cd threejstest npm install npm run dev由于threejs需要引用three.js等一些依赖模块,将这些资源通过以静态资源的形式引入,注:npm包安装threejs模块尝试过,虽然可以导入获取全局模块,但是引入的其他包无法获取对应的three全局变量,接下来讲讲本人对threejs的一些理解:
fov推荐使用45,代表视场,aspect默认采用window.innerWidth/window.innerHeight,near为0.1,远面far默认1000,相机添加完成会需要添加到场景中,scene.add(camera);
导出为js格式,可以直接修改文件后缀变成json格式,静态模型的导入和动画的导出选择可能需要有些区别,动画模型的导出需要选择anmation等参数,以便在引擎中进行调用。
在利用threejs来导入模型时候需要用到loader工具,obj模型采用OBJLoader.js,fbx模型的导入利用FBXLoader.js导入模块,为了便于模型在服务端的存储,通过blender将前面两种模型导出成json格式然后通过THREE.JSONLoader来导入json格式的模型数据:
mesh生成之后就是需要将mesh添加到场景中,通过scene的add方法可以直接将mesh添加到空间中,mesh在三维空间中有很多属性,position用来定义mesh在空间中的位置,rotation用来控制物体的旋转角度,scale可以对物体进行所以,这三个属性分别对应xyz三个方向上的操作。
let objectLoader = new THREE.JSONLoader(); objectLoader.load(modelurl, function (geometry, materials) { let loader = new THREE.TextureLoader(); loader.load(pngurl, function (texture) { let material = new THREE.MeshPhongMaterial({ map: texture }); geometry.center(); let mesh = new Physijs.BoxMesh(geometry, Physijs.createMaterial(material, 1, 0.1), 10); mesh.scale.set(9, 9, 9); if (rotationX && rotationY && rotationZ) { mesh.rotation.x = -Math.random() * 2 * Math.PI; mesh.rotation.y = -Math.random() * 2 * Math.PI; mesh.rotation.z = -Math.random() * 2 * Math.PI; } material.morphTargets = true; mesh.position.set(x, y, z); //(objectx.max.y - objectx.min.y) / 2 mesh.castShadow = true; mesh.receiveShadow = true; scene.add(mesh); }); });位置更新的过程:mesh.position.x=40相当于将模型x移动到x=40的位置,对模型位置进行更新的时候需要加上mesh.__dirtyPosition=true;
