(成果展示: 渔村苏维埃政府旧址-数字博物馆

前言

  前几天(7月16号-18号),我去到了清远雅堂村开启我们团队的扶贫项目,我们的任务是为当地博物馆扫描制作三维的数字博物馆,这个项目隶属于物联网+比赛中,由各个高校自行主持举办。清远雅堂村是广东工业大学指定的扶贫村,学校希望我们学生能够发挥特长,在雅堂村中制作一些别具特色的东西。

  这次活动每支团队都有1000元的经费,墙绘团队因为有其他任务,所以他们有6000元的经费(当然颜料就是一笔不少的开销)

  雅堂村并没有博物馆,所以我们分配去了鱼湾的苏维埃政府旧址博物馆,距离雅堂村大概半小时的车程,我们三天的吃住就在鱼湾村的好世界宾馆中。(每天每间房90元,我们开了两间房,经费在燃烧,加上饭钱各个开销,最后我们只能尽快回来,否则本来要住一个星期的)


坑爹状况

  在之前我们并没有来过这个博物馆,也不清楚会遇到什么样的情况,所以我们为三维扫描做了全方位的探索,探索的成果可以关注我Photogrammetry-学习之路系列。

  去到当地才发现,完完全全坑爹了。

  • 博物馆很破旧(这个其实是意料之中的)
  • 展览时间很短(早上9点半到下午4点半)
  • 文物全部在玻璃里面不能拿出来(最坑爹的)

  这些突如其来的状况,真的让我们乱了手脚,不过当即想到了全景博物馆的方案,毕竟之前也看到过类似的效果,再加上之前张家荣制作的threejs全景丝绸之路给了我启发。

  我觉得全景博物馆未必不能做,只是还需要攻克两个难点。

  • 如何实现全景图的坐标定位,点击事件
  • 如何完成全景图的制作

  猛然回头,我发现自己都掌握了解决方法的钥匙

  张家荣的大作业是解决第一个问题的钥匙。

  而第二个难点的钥匙真的是多亏了以前看高中电脑书的记忆象,我记得有软件可以将摄像机的照片拼接起来,制作出全景图。


死马当活马医

  我确定了方案之后,就立马开始研究了。

  聪哥还提出全三维的方案,真是想让我们累到半死不活呀,之前搭建南沙政务大厅还嫌不够累吗?

  首先要解决的是全景照片的问题,因为前者问题即使没有解决方案也没关系,至少我可以用最原始的three.js来完成全景图观察,完整度至少还可以接受。

  所以第一步想到的当然还是百度一下,毕竟不知道什么软件比较适合。

  后面再百度的推荐下找到了ptgui软件

  后面还是多亏了ghostxx.com,我在上面发现了更多的全景图制作软件,我一个一个下载下来测试(当然我测试的标准是最新更新版本为主)

  最后我觉得Kolor Autopano Giga 4.4 这款软件是最好用的全景图软件。

  那个时候刚好研究到了接近晚上,基本把最大的难关解决了,我让建模团队帮忙拍一圈试试全景图的制作。

  后面在回去宾馆之后,成功的制作出完美的全景图(除了地面和天花板)

  第一个难点就顺利被解决了。

  回去宾馆只有,下一个难点接踵而至,我把张家荣的github文件下载下来,进行研究。

  原来是基于three.js实现的photo sphere viewer 插件,因崔思婷。

  后面去找photo sphere viewer(后面简称为PSV)的具体使用方法,想不到原制作者的github仓库已经丢弃了,我拿了个很久很久的版本,死活不知道同学怎么额外加入那么多其他脚本的。

  后面才发现,原来插件是有官网的,而且官网上有API文档,真是新大陆。

  有了方向之后,后面的工作就好办了,主要就是在家荣的大作业上面进行魔改测试PSV的用法。


PSV难点

  其实PSV的难点也还好啦,基于three.js的针对全景图的插件,学过three.js的我来说难度不大。

  家荣的丝绸之路实训

  官方API文档地址

  主要是摸清楚以下几点

  • PSV参数设置
  • 实现窗口大小的实时更新
  • 如何添加自定义标记
  • 如何实现全景图跳转
  • 全局地图显示
  • 如何实现标记点击出现嵌套html

PSV参数设置

操作截图

  • panorama - 全景图路径
  • container - 嵌套的html标签
  • (无视后两个参数)
  • navbar - 下面导航栏的参数设置
  • size - 设置大小为浏览器窗口大小(three.js偷学过来的)
  • transition - 全景图过渡用的参数
  • latitude_range - 限制镜头移动范围
  • lang - 按钮提示

  很多参数官方都有给了,API文档里面也有详细的参数设置。

  再初始化的阶段涉及导航栏的参数,通过导航栏可以制作出自定义的按钮,从而实现全局地图的显示。这个后面涉及再详细讲解

实现窗口大小的实时更新

操作截图

  这里最大的难点是理解resize传入的参数CSSsize,这个不是单纯传数字而是传入字符串,对于动态窗口的字符串设置也是搞了好久才终于搞懂原理。

  不过弄好了之后其实也是令人意外的简单。

如何添加自定义标记

  自定义标记看了官方文档之后就知道是addMarker函数,鉴于每一个全景图都需要制作多个标记,我想到了用for循环遍历数组的方式来生成对应全景图的标记。

操作截图

  这样我就可以将参数存储到对应数组元素当中。

操作截图

  传入的参数大概是这样子的,所以数组中的每一个对象也是一个类。

操作截图

  因为标记也分为两种,一种是跳转全景图的,另一种是用于点击显示嵌套html的

操作截图

  通过 new 来声明对象的各种相关的参数。

操作截图

  然后将所有的元素统一放进一个数组里面。

  这就是我对自定义标记的数据管理。

  在实现这个结构的过程中除了输入数据很繁琐之外,最痛苦的莫过与坐标的输入,一开始没有弄清楚的坐标返回函数,导致所有的坐标都错误地在控制台输入,弄了一轮才发现问题。

  后面为了方便输入,我专门将这种格式封装成一个js字符串输出到控制台,然后复制粘贴批量制作出我想要的变量字符串。

如何实现全景图跳转

操作截图

操作截图

  全景图跳转官方也有一套模板的,我本来没有封装的,但是后面因为跳转的标记太多了,我将它封装一个函数了。

  跳转标记最多的区域有两个,所以针对这两个庭院内侧和外侧的区域都针对做了函数封装。同时也有往庭院跳(第一张图)和庭院往外跳(第二张图)区别

  主要的核心代码就是PSV.setPanoram(url,true)

  这里的运行逻辑:

  • 跳转全景图
  • 清理当前的标记
  • 然后设置当前的全景图状态为False
  • 将跳转的全景图设置为True
  • 添加跳转全景图的标记
  • 随机将镜头移动到标记中

  这里的去全景图状态是用来判断当前是哪一个全景图在观察,在后面的地图制作非常有用。

操作截图

全局地图显示

  全局地图就是导航栏下面的地图按钮

操作截图

  实现点击地图对应按钮进行跳转

操作截图

  这里的操作涉及到导航栏的自定义按钮制作,上面的参数是官方提供用来设置按钮的基本属性。

操作截图

  clickEvent是封装好的按钮跳转函数,跳转逻辑和标记的跳转基本一致。

  最后一行加多了按钮图标刷新的函数。

操作截图

操作截图

  通过这些方法实现全局地图跳转的功能。

  在制作的过程中我还加入了html5tooltip插件,实现图标上方的提示标签,我以前些three.js有封装过相应的函数,直接拿来用了。

标记点击出现嵌套html

  普通标记的嵌套Html我也封装了函数

操作截图

操作截图

  通过markerInfo函数将按钮的所有信息整合到一起,其中倒数第二个参数content是实现嵌套html的关键

操作截图

  通过addMarker函数将content嵌套进去,PSV就会自动完成右侧的弹出菜单,简单快捷。

  嵌套的html的内容和id需要提前定义好。

操作截图

全屏按钮BUG

  上面是已知问题的解决方案,然而在测试的过程中,我发现PSV自带的全屏效果和地图按钮的窗口冲突了,只要全屏就看不见地图。

  经过调试,我也不知道是哪里的问题,最开始以为是z-index的问题,但是我调试的时候吧PSV的style都设为透明了,还是看不见弹出窗口。

  最后我只能重做全屏窗口。

  重做其实也并没有那么难,以前写three.js的时候有写过相关的函数,这里也是直接复制套用了。效果也是立竿见影,很不错。

  同时我也想将PSV自带的全屏图标转换弄到自定义按钮当中,实现是这样子的。

操作截图

  PSV用的图标是SVG来的,我用Jquery把它加进去。

手机自适应问题

  在手机上Chrome浏览器会出现鼠标浮动的问题,需要在头部加入以下代码

1
<meta name="viewport" content="width=device-width, initial-scale=1">

制作总结

  以上就是PSV使用过程中的全部技术难点,也并没有那么复杂,最难受的是数据输入,大量的数据等着我,这个过程非常繁琐,所以后面经常是生成代码,复制粘贴进去修改的。

总结

  这次清远之行也还好,虽然突发状况让我们很慌,最后也还是有个明确方案解决问题。比起其他团队,我们的待遇好很多,博物馆的影音室有空调,平时工作都可以叹空调,虽然拍全景的时候在房间里面拍照,很闷很热,不过还可以回到影音室休息。

  最想吐槽的是聪哥,他带队,没对接好,然后也没怎么帮我们干活……
  方案是我想的,代码是我去研究的,拍照基本上都是我和建模团队一起完成的┗|`O′|┛ 嗷~~

  目前所有的数据录入已经完成,等建模团队把模型弄好基本就可以完成任务了。