制作H5-“3D全景漫游”引擎说明和常用全景开发框架引擎整理分析【krpano | ThreeJS等】

近来VR虚拟现实技术,基于年初完成的“星球计划”项目,总结篇文章与各位分享一下制作H5-“3D全景漫游”秘籍和常用全景框架整理分析【krpano | ThreeJS等】

 

标签

QQ物联与深圳市天文台合作,在手Q“发现新设备”-“公共设备”里,连接QQ物联摄像头为用户提供2016年天体大事件的直播,大家可以通过手Q实时观看到世界各地最佳观测点的日食,流星等天体现象。承载整个“星球计划”活动的运营页面,经多方讨论,我们决定尝试3D全景漫游模式的H5运营页进行推广,今天就不详述活动的具体内容,先和大家聊一聊这H5里“3D全景漫游”的制作方法。

328e8f2522ed586f24726537907e9e011458711324

先贴一个体验地址(请忽略GIF录屏的卡顿及字体,iOS开启陀螺仪体验最佳),Page3的宇宙部分-转动手机在模拟的宇宙里搜寻各大行星,就是我们今天要说的基于Html5的3D全景漫游-制作H5-“3D全景漫游”秘籍和常用全景框架整理分析【krpano | ThreeJS等】

1458701938_69_w180_h320   1458699549_88_w175_h177

 

标签2

要制作全景漫游,首先得有全景图像。全景图像的获取通常是借助鱼眼的全景摄像机的拍摄来完成的,或者是单反相机、鱼眼镜头、云台和三角架的组合。需要按照一个方向旋转360度拍摄一组照片,照片之间要有部分重合的部分,方便进行后期的拼接和融合。在拍好照片后需要将它们无缝拼接在一起,生成的全景图像可分为球面全景图、立方体全景图以及柱状全景图等。(咋们腾讯地图的街景体验,就是最常见的全景漫游技术啦)

没有全景摄像机,也可以通过一些素材站点拿到适合我们项目的全景图。例如:某素材站点

1458649923_24_w594_h245

当然,星球计划的背景图是宇宙星际,相对而言是无序的,所以靠视觉设计师进行拼接绘制也是可以的。

而什么是全景漫游呢,全景漫游技术可以让普通用户或者访客体验者在360度/720度全景图像构建的全景空间里切换视角的浏览。它是通过拍摄全景图像(比如jpg或者png全景图),再采用3D计算机图形图像技术构建出全景空间,让使用者能用控制浏览的方向,或左或右、或上或下观看物体或场景,仿佛身临其境一般。与传统的3D建模相比,全景漫游技术制作简单,数据量小,系统消耗低,且更有真实感。故近年来,也是VR技术的一大热门实现手法,用前面的贴图例子来个demo。而在移动端的全景漫游,更是可以绑定陀螺仪,让你更有身临其境的感觉。

1458708567_79_w400_h282

 

标签3

在项目初期,预研了一些全景漫游制作方案,包括目前最为常用的全景漫游制作工具是Pano2vr & Krpano,以及用Flash,QuickTime,基于Java,js等其他方式制作全景漫游,但据预研所了解的个方案优劣势对比图如下图,结合“星球计划”项目的具体情况,最终优先选择了Threejs的实现方案。【备注,WebGLStudy.COM整理此文时,不少引擎已经有了变动和升级,请访客以最新的版本特性为准】

1458714569_76_w660_h354

这里顺便和大家聊聊目前最为常用的全景漫游制作工具是Pano2vr & Krpano。

(1)Pano2vr操作简单功能虽少但非常实用,“导入全景图-设置交互热点-微调-导出”即可直接生产flash,html5,Quicktime等格式。

Pano2vr对于仅用在PC,iOS上的需求非常合适快捷,但对Android机的支持表现不佳。

1458649789_65_w530_h483

(2)Krpano,功能强大完善,各平台兼容性高,拓展性很强,各类VR场景特效都可承载。但自成体系,需要遵循Krpano xml的这套编程语言,没有gui的软件界面,新手上手及后期维护成本较大,生成的全景漫游专业但对载入速度,内存占用都有影响。但对于想做高阶的,个性化,定制化全景漫游项目,Krpano是不二选择。

但这2个工具都需要购买授权码才可商用,非免费。

1458712691_34_w594_h443

(3)Three.js源自Github的一个开源项目,https://github.com/mrdoob/three.js,官网:http://threejs.org/ 。

看到一个同行的解释,说理解成Three + js就可以了。Three表示3D的意思,js表示javascript的意思,故three.js就是使用javascript来写3D程序的意思,格外的直白清晰啊。依靠javascript的语言编写,自然给这个方案带来了高拓展,高兼容,低开发成本,可高性能且免费的几大优势。

(4)Flash,QuickTime,基于Java,js等其他方式这里就不一一详述,大致的优劣势对比请参考上面的表格(具体评分仅供参考,软件版本更新也许会有各方面的升级)。

 

标签4

想要利用Three.js制作一个物体渲染到网页中去,需要构建这3个组建:场景(scene)、相机(camera)和渲染器(renderer):

(1)场景(scene)

即是画布,是所有物体object的容器。在最开始的时候对场景实例化,将之后构建的物体都添加到场景中即可。

1458641722_92_w462_h68

(2)相机(camera)

用户是通过相机Camare来查看在scene下的3d场景,在three.js里包含了正交投影照相机(Orthographic Camera)和透视投影照相机(Perspective Camera)2种,从模拟人眼看物体的方式来选,透视投影照相机更适合。如下图所示,fov是相机视角的夹角,aspect等于相机画幅比例,near和far分别是照相机到视景体最近、最远的距离,均为正值,且far应大于near。

1458649605_72_w584_h311

1458642567_32_w706_h221

(3)渲染器(renderer)

渲染器是用来设定渲染的结果会在页面的什么元素上面呈现,以及按什么规则来渲染。

1458646180_90_w838_h110

在Three.js中,场景是容器,把我们星球计划的星星们放置在构建的3D场景中的不同位置;相机对着下场景拍摄,拍摄结果通过渲染器实时的绘制在我们的浏览器上。

1458649506_95_w817_h294

(4)构建宇宙并置入场景中

定义了这三大元素之后,下一步,就是构建我们的星球计划所需的宇宙了。前文有提到,全景图像可分为球面全景图、立方体全景图以及柱状全景图。

虽然球面全景图具有和人眼最接近的构建模式,但需要很多个立面才可以构建成一个球体,球面的经纬度坐标无法展开成一个平面贴图,相对于其他方案,性能消耗过高,拼接方法过于繁琐;而柱形全景图的垂直视野小,不好做顶部底部的俯仰视角。我们选定了最常见的立方图全景图来构建我们的3D场景。

立方体全景图有6个面,我们需要定义每个面贴图的背景图片,3D位置,旋转角度(默认的6个面都是朝着我们的,我们需要定义朝坐标轴的各个方向做90度的旋转,才可以搭建成一个立方体)。

g

0002

1458651678_11_w1031_h355

然后添加到THREE.Object3D 的数组中,这样我们就在场景中构建好了一个3D的宇宙空间。

1458652123_35_w576_h123

这里,考虑到星空背景主要为了氛围烘托,我们将6个面的贴图减少成2个,以此缩减了资源文件的大小,如下图所示。

(5)渲染

这里我们用的是Threejs的 实时渲染:就是需要不停的对画面进行渲染,即使画面中什么也没有改变,也需要重新渲染。其中一个重要的函数是requestAnimationFrame,这个函数就是让浏览器去执行一次参数中的函数,这样通过上面animate中调用requestAnimationFrame()函数,requestAnimationFrame()函数又让animate()再执行一次,就形成了我们通常所说的渲染循环 了。

1458710328_52_w464_h193

通过上面这些步骤,我们就构建好这个3D的宇宙空间了。

1458709041_63_w200_h358

(6)构建星球放置在宇宙中

一期的星球计划中,需要增加8颗星球,为了避免画面过于拥挤,星球们被分散定位在了6个面上。之前我们定义宇宙六个面的时候给了每个面一个固定的section id,通过简单的js 我们可以往平面中加入星球的DOM结构。

1458709420_85_w859_h239

因此也可以很轻松的利用CSS给这些星球定位及增加个性的动画效果,这里要特别注意,不要增加阴影等耗内存特别大的动画效果,它们是Crash罪魁祸首。

1458710132_30_w217_h214

1458710022_45_w683_h345

(7)绑定陀螺仪

最后一步,将全景漫游绑定陀螺仪,这里涉及到需要对陀螺仪事件做个保护代码,判断机器是否支持陀螺仪。完成以上几步,既可以实现一个在移动端的全景漫游啦。

1458711042_64_w200_h357

(8)其他

在项目完成的初期,对部分安卓机的内存消耗还是过大,为此在完成项目之后继续尝试了一些优化工作,包括 缩减宇宙的尺寸,合并全景贴图,禁用陀螺仪,预加载和懒加载,星球CSS3动画缩减,资源文件深度压缩等工作,但还是无法避免在内存不足的安卓机下存在Crash的风险,为保证项目的稳定上线,退而求其次对安卓机做了兼容版的体验,预期在后续的项目迭代中再优化页面在安卓下的表现,实现全平台的体验统一。

最后,仅以此文总结在主流移动端构建3D全景漫游的试水项目总结,该尝试基本上能够满足项目的需求,但在性能优化,细节完善上还继续打磨,希望能对有兴趣的小伙伴带来一些帮助,这篇文章非常棒,整理了主流的全景引擎框架,WebGL学习推荐大家学习了解!人人为我,我为人人,知识交流创造火花!

WEBGL学习网(WebGLStudy.COM)专注提供WebGL 、ThreeJS、BabylonJS等WEB3D开发案例源码下载。
声明信息:
1. 本站部分资源来源于用户上传和网络,如有侵权请邮件联系站长:1218436398@qq.com!我们将尽快处理。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源打赏售价用于赞助本站提供的服务支出(包括不限服务器、网络带宽等费用支出)!
7.欢迎加QQ群学习交流:549297468 ,或者搜索微信公众号:WebGL学习网
WEBGL学习网 » 制作H5-“3D全景漫游”引擎说明和常用全景开发框架引擎整理分析【krpano | ThreeJS等】

发表评论

提供优质的WebGL、ThreeJS源码

立即查看 了解详情