three.js自学之旅(8)—— 天空盒研究、完善nodejs服务器、使用TrackballControls控制器
2018-01-26 10:36
696 查看
日更停了,因为碰到了坑,这章开始,会贴近于最终的毕设来学习。有需要学习three.js的童鞋可以前往该博客
http://blog.csdn.net/birdflyto206
个人感觉这个博主对three.js的解析更加丰富透彻,毕竟他是真的做游戏的,我是做前端的哈哈。
本章开始前,先填一个之前的坑,由于之前的服务器搭建的过于脆弱,做了一定的调整,如果是从第一章开始看的朋友注意将你一直在用的nodejs服务器的代码替换成以下代码,不然你会加载不了图片,顺带说一下,由于之后的需求会涉及数据库操作以及在nodejs里开发接口,因此这个服务器还会继续完善(对于不需要用nodejs搭建本地服务器的人请立即跳过此开头。)
对于跳过开头的朋友这句也不用看,关于前后端分离的问题我多嘴一句,由于现在程序员公司前后端基本是分离,因此在我的笔记本上根本就没有装任何SQL数据库软件,我的ajax请求完全通过fidder代理转发到服务器上,有兴趣的同学可以打我电话110。经过测试,我搭建的服务器已经可以通过fidder转发请求到服务器上的数据。
填了本地服务器的坑之后再来填一个相机的坑
之前在写相机的旋转功能时,对三维坐标的计算想的过于简单,加入y轴之后,计算量瞬间不是我这个数学学渣能解决的,所以
打算另辟蹊径,直接上网找了个插件来用。关于这个插件的源码我会放在最后,这里只讲如何使用。
先上所有的代码和最终的效果图,请不要太惊讶,因为这章开始我会围绕全景图平台的搭建为终极目的做研究。
下面来看图说话
第一步:把相机放到坐标轴(0,0,2)的位置,再把立方体放在(0,0,0)的位置,然后让相机lookAt(0,0,0),也就是相机的视角始终对着立方体的中心(重心?什么心?反正就是那个心,你懂的),为什么不直接把相机放在坐标轴的(0,0,0)点呢?如果你不想你的滚轮放大物体的功能失效你可以这么做。
第二步:创建一个纹理数组,分别对应立方体的右、左、上、下、前、后,注意这个顺序问题,然后将这个纹理数组,放到MeshFaceMaterial材质里,参考的是网上比较简易的方法,而且这个对象已经被弃用了,所以后面遇到解决不了的问题可能会替换这种方法。
第三步:复制主要代码,然后把下面的图拿走就能看到一个三维的场景了
http://blog.csdn.net/birdflyto206
个人感觉这个博主对three.js的解析更加丰富透彻,毕竟他是真的做游戏的,我是做前端的哈哈。
本章开始前,先填一个之前的坑,由于之前的服务器搭建的过于脆弱,做了一定的调整,如果是从第一章开始看的朋友注意将你一直在用的nodejs服务器的代码替换成以下代码,不然你会加载不了图片,顺带说一下,由于之后的需求会涉及数据库操作以及在nodejs里开发接口,因此这个服务器还会继续完善(对于不需要用nodejs搭建本地服务器的人请立即跳过此开头。)
var http = require("http"); var url = require("url"); var fs = require("fs"); var querystring = require("querystring"); var server = http.createServer(); server.listen(5681,"localhost"); server.on("request",function(req,res){ var urlObj = url.parse(req.url); var dir = __dirname; var pathName = urlObj.pathname; var type = pathName.substr(pathName.lastIndexOf(".")+1); //判断是否为ajax请求 if(type.indexOf("\/")==-1){ var filePath =dir+pathName ; filePath = filePath.replace(/\//g,'\\'); fs.readFile(filePath,function(err,data){ if(err){ res.writeHead(404,{ 'content-type' : 'text/html;charset=utf-8' }); res.end(); }else{ res.writeHead(200,{ 'content-type' : 'text/html;charset=utf-8' }); res.end(data); } }) }else{ console.log("这是一个"+req.method+"请求"); if(req.method.toUpperCase() == 'GET'){ console.log(querystring.parse(urlObj.query)); res.writeHead(200,{ 'content-type' : 'text/html;charset=utf-8', }); res.end(); }else{ var str = ''; req.on("data",function(chunk){ str += chunk; }) req.on("end",function(){ console.log(querystring.parse(str)); res.writeHead(200,{ 'content-type' : 'text/html;charset=utf-8', }); res.end(); }) } } })
对于跳过开头的朋友这句也不用看,关于前后端分离的问题我多嘴一句,由于现在程序员公司前后端基本是分离,因此在我的笔记本上根本就没有装任何SQL数据库软件,我的ajax请求完全通过fidder代理转发到服务器上,有兴趣的同学可以打我电话110。经过测试,我搭建的服务器已经可以通过fidder转发请求到服务器上的数据。
填了本地服务器的坑之后再来填一个相机的坑
之前在写相机的旋转功能时,对三维坐标的计算想的过于简单,加入y轴之后,计算量瞬间不是我这个数学学渣能解决的,所以
打算另辟蹊径,直接上网找了个插件来用。关于这个插件的源码我会放在最后,这里只讲如何使用。
先上所有的代码和最终的效果图,请不要太惊讶,因为这章开始我会围绕全景图平台的搭建为终极目的做研究。
camera.lookAt(0,0,0); camera.position.set(0,0,2); //首先我对相机的位置做了处理 var urlArr = ["/img/right.png","/img/left.png","/img/top.png","/img/bottom.png","/img/font.png","/img/behind.png"] var textureArr = getTexture(urlArr); function getTexture(arr){ var textureArr = []; for (var i = 0; i < 6; i++) { textureArr.push(new THREE.MeshPhongMaterial({ map: new THREE.TextureLoader().load(arr[i]),//将图片纹理贴上 side: THREE.BackSide,/*镜像翻转,因为你身处在盒子的内部*/ bumpMap:true, //凹凸纹理,据说能让纹理显示效果更佳感觉并没什么软用 bumpScale:0.2 })); } return textureArr; } var material = new THREE.MeshFaceMaterial(textureArr); //该方法已被弃用,如果以后有更好的解决办法我会尽快贴出 var cube = new THREE.Mesh(geometry,material); cube.position.set(0,0,1); scene.add(cube); var controls = new THREE.TrackballControls(camera); //相机控制器的创建 controls.noPan = true; //这里我把相机的右键功能 改变相机的观察半径功能去了 controls.minDistance = 1; //这两个参数用于控制鼠标滚轮滚动的时候相机的距离坐标(0,0,0)的最大和最小半径差值 controls.maxDistance = 4; function renderLoop(){ controls .update(); requestAnimationFrame(renderLoop); renderer.render(scene,camera); }
下面来看图说话
第一步:把相机放到坐标轴(0,0,2)的位置,再把立方体放在(0,0,0)的位置,然后让相机lookAt(0,0,0),也就是相机的视角始终对着立方体的中心(重心?什么心?反正就是那个心,你懂的),为什么不直接把相机放在坐标轴的(0,0,0)点呢?如果你不想你的滚轮放大物体的功能失效你可以这么做。
第二步:创建一个纹理数组,分别对应立方体的右、左、上、下、前、后,注意这个顺序问题,然后将这个纹理数组,放到MeshFaceMaterial材质里,参考的是网上比较简易的方法,而且这个对象已经被弃用了,所以后面遇到解决不了的问题可能会替换这种方法。
第三步:复制主要代码,然后把下面的图拿走就能看到一个三维的场景了
相关文章推荐
- Three.js官方案例源码解析----TrackballControls控制器进行3D图片查看
- Three.js学习记录——TrackballControls控制器
- 10 Three.js使用orbit controls插件(轨道控制)来控制模型交互动作
- 解决Three.js中使用OrbitControls导致不能选中DOM的问题
- three.js 天空盒子使用方法
- 8 Three.js使用轨迹球插件(trackball)增加对模型的交互功能
- Manipulating Pages and Server Controls with JavaScript(使用JS处理页面和服务器控件)
- three.js自学之旅(5)—— 辅助对象的使用、扩展一个新的基础方法调整对象参数
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器
- 【JQUERY】ASPX多服务器控件下使用Jquery.validate.js
- 母版页中使用js取服务器控件ID或class
- 牛腩购物11:完善用户注册 onblur 失去焦点 jquery ajax post方式使用 一般处理程序 判断用户是否存在 前台js的应用
- three.js使用一:本机建网站浏览example
- three.js使用四:加载有材质和纹理的模型
- three.js使用三:加载有纹理的模型,结合blender和convert_obj_three.py
- ASP.NET服务器验证控件和JS自定义验证同时使用(小技巧)
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建输出验证码图片的控制器
- [原创]使用 NodeJS, MarkdownJS, PrettifyJS 打造个人博客写作平台 - 打包下载
- [原创]使用 NodeJS, MarkdownJS, PrettifyJS 打造个人博客写作平台 - 整体思路
- three.js使用二:修复three.js的纹理路径多一个\的问题