从上一篇文章到这篇中间快过了一年了,时间真滴过得快。不是在下中间没想过写新的文章,而是本身确实变懒了(体重+1 +1 +1 +1....) 。。OTL。。。不过到最后以为仍是须要写点东西,否则人就真废了,因而便有了这样一个插件(实际上是偶然看到别人的一个全景案例不是用webgl写的,从而产生了兴♂趣,就去练了一下手)。css
代码总的来讲比较简单,相比较webgl上手难度来说,用css3简单太多了,主要是简单的初高中数学几何学知识,而后用好perspective和transform就好了,废话就到这里,下面开始正文。html
demo : 点我,我是demo
github : 欢迎你们来点个星linux
总的来讲,就一句话: 保证3D的视点在场景立方体的内部就好了,以下图(从别人那里拿的)css3
不理解的能够看这篇文章,原理写得比我详细多了:地址git
我这里补充一点踩坑状况:github
1.各边偏移距离的计算方法
首先须要肯定多边形的边数,最小为4,咱们这里设为10,那么每条边与中心点的夹角为 360/10 = 36度
其次肯定每条边的长度, 边长 = 图片宽度 / 数量, 咱们这里假设 图片宽度 5000,有 边长 = 5000 / 10 = 500px
最后肯定偏移距离:web
let num = 10; //边数 let angle = 360 / num; //每条边对应夹角 let width = 5000; let unit = width / num; let translateZ = ( unit / 2 ) / Math.tan( angle / 2 * Math.PI / 180 ); //这里基本上已经计算完成,可是实际效果是每一块区域都会显示一条条白色的边,很难看,具体能够参考上面别人写的那篇文章里的案例。因此咱们须要作点处理 let transZ = translateZ - 5; //往中心偏移5px,这样就看不出来了
2.关于初始角度的问题
因为处理多边形每条边的时候是 “先旋转,后偏移” 因此“默认状况下”咱们见到的第一张图是并不属于第一条边,第一条边正对屏幕向外。这里咱们让 场景元素 初始从-180度 开始就能够了app
无依赖库
详细能够查看 githubwebgl
let w3d = new watch3D({ wrapper : ".wrapper", //容器元素为.wrapper autoplay : true, //自动播放 width: 5000, //宽度为5000 height : 2500, //高度为2500 num : 12, //分红12块 maxY : 25, //最大仰俯角为25度 reverse : false, //反向为false tips : { //tip数据 0 : { styles : { "height" : "100px", "width" : "100px", "background-color" : "#6cf", "text-align" : "center", "margin-right" : "10px", "color" : "#fff", "cursor" : "pointer" }, content : "风景1", callback : function(e){ w3d.pause(); w3d.changeData({ num : 10, resource : "sources/4.jpg" },true); } } }, resource : "sources/5.jpg", //图片资源地址 loadstart : function(){ //加载开始时 }, loading : function(data){ //加载中 }, loadend : function(data){ //加载结束后 }, start : function(point){ //触摸开始 }, move : function(point){ //触摸移动中 }, end : function(point){ //触摸结束 } });
文章写得比较简单,主要是不知道要写些什么东西,贴代码一段一段解释的话感受很累,并且源码中基本上我都加了注释,因此偷点懒吧。spa
插件只提供了一些基本的功能,没有监听deviceorientation事件,不是没这打算,是在编写过程当中遇到了一个bug并且查了半天也没找到解决办法(当beta值处于90和-90时,alpha和gamma会跳动得很厉害,没办法让体验变得顺畅,因此去除了)。若是有人碰到过相似的问题而且找到了解决办法的话,强烈欢迎留言或者私信,毕竟本人仍是想写个完整的插件的。
以上,文章很乱,写也得不怎么尽兴,主要是没办法把教程写清楚,若是确实疑问很大的话能够联系我,我会尽力回答的,求各位大神轻喷,谢谢。