张 俊,徐小双,吴 雷,董双峰
(1.黄冈师范学院 图书馆,湖北 黄州 438000;2.黄冈师范学院 教育科学与技术学院,湖北 黄州 438000;3.黄冈市教育局 设备装备处,湖北 黄州 438000)
虚拟图书馆交互漫游的设计与实现
张 俊1,徐小双2,吴 雷2,董双峰3
(1.黄冈师范学院 图书馆,湖北 黄州 438000;2.黄冈师范学院 教育科学与技术学院,湖北 黄州 438000;3.黄冈市教育局 设备装备处,湖北 黄州 438000)
本文以黄冈师范学院图书馆为例,对虚拟图书馆进行系统的设计与制作,包括对图书馆场景的信息采集,图书馆场景三维模型的创建,材质的采集、制作、烘焙,图书馆内部场景的观摩的实现,进行空间移动,摄像机视角变换,最后实现了系统,对网上图书馆建设具有一定的启示。
虚拟现实;Virtools;图书馆;漫游系统
图书馆是学生学习的优秀资源和社会各界人士寻找有价值资料的最权威场所。大学图书馆是大学的重要组成部分,是大学的文献信息中心,是为教学和科研服务的学术性机构,是人类知识的宝库,是寻求知识,追求理想的良师益友,是大学生的第二课堂[1]。虚拟现实技术提供了一个可以直观和清晰的表现信息的途径,越来越显示出广阔的应用前景[2]。将校园图书馆以虚拟现实的形式展现出来,不仅可以使学生足不出户就能了解校园图书馆的内部结构,还可以使刚刚进入大学的新生迅速了解图书馆结构,也便于校园与校园之间的互相了解和提高[3]。
虚拟图书馆漫游系统是实现图书馆内部全景漫游的系统。现代大学图书馆风格各异,功能朝着多层次、灵活性、综合型、高效性发展。藏书室、借书室、阅览室数量众多,分布在各个楼层。系统实现虚拟图书馆建筑结构,完成功能区直观展示,通过交互以第一人称方式在图书馆内走动,方便用户观看图书馆功能区域设定,达到对真实图书馆的预先了解。
图书馆内部具有桌椅、门窗、书柜、储物柜、地图、电脑等,浏览者可以使用键盘上相应的键进行位置和视角的控制,自主观察内部各种模型,水平方向自由行走、360度角环视、上下楼层自由走动等。因此建立虚拟图书馆,一方面需要在现场信息采集基础上创建图书馆场景三维模型,制作和烘焙相关材质,以企达到图书馆内部场景的观摩的实现[4]。另一方面,虚拟图书馆的内部环境具有交互性、真实性,需要采用第一人称视角,在虚拟图书馆任意位置进行前后左右的空间移动,碰撞检测,渲染光效以及沿楼梯的上下移动,使浏览者可以感觉到真实步入图书馆的感觉,从而实现虚拟图书馆漫游的目标[5]。
虚拟图书馆漫游系统开发关键需要有一套功能完备的软件开发平台。而在软件开发平台中最主要的是虚拟现实软件,它承担三维图形场景驱动,提供虚拟现实应用开发的接口,连接虚拟外部设备和应用数据库等重要工作[6]。Virtools 是一款整合软件,由法国达索系统集团提供,互动性强大,是功能强大的元老级虚拟现实制作平台。尤其是Virtools5.0的开放结构支持多种2D、3D文件格式,便于导入或导出文件,与其它资源编辑软件协同工作,使3D技术的应用变得轻松。Unity3D是由Unity Technologies开发的多平台的综合型游戏开发工具,可以创建三维视频游戏、建筑可视化、实时三维动画等虚拟产品。另外还有Quest3d,Cult3d,Torque,开源ORGE都是国际公认的游戏开发平台。国内也有类似的开发平台推出,虚拟现实仿真平台(VRP,Virtual Reality Platform)是中国第一款完全独立自主知识产权的虚拟现实软件,在国内市场占有率最高的虚拟现实软件。在虚拟现实制作过程中,常常需要用到如PhotoShop、AutoCAD、3Dmax、Maya、Promiere、AfterEffects等软件。
相关功能类似软件的优缺点是相对的。我们从自身的角度和用户非专业游戏玩家的特点来选择Virtools作为虚拟现实制作平台。并采用Maya完成三维建模。
3.1 主要模型的分类
虚拟图书馆场景内包含门窗、电脑桌、长桌、教师桌、椅子、书架、电脑、楼梯、称重柱子、内墙和外墙等模型。为了保证场景的简洁性和统一性,使制作过程简化,将差异不大的模型制作为同一种模型,比如对于有扶手和没扶手椅子,在建立模型时只制作没扶手的椅子,有扶手的椅子均被之代替。不仅场景得到简化,而且将模型刻画得更为细致。在制作模型之前,不仅需要采集相关图片信息,还要对需要制作的模型进行测量,绘制出图书馆的内部场景俯视图,以便能够更加准确的制作模型的相关比例和模型的具体摆放位置。
3.2 虚拟图书馆主体建模
为了实现整个虚拟图书馆系统,采用Maya软件来完成建模任务,图书馆主体建筑是其中重要的部分。由于黄冈师范学院图书馆以承载重量的柱子为基础,图书馆中的几乎所有格局都是由这些柱子所划分的,所以首要任务就是将载重柱子创建出来。首先建立一个平面,并将其放大,附着的材质是自己制作的所有承重柱子的位置信息的图片,这样有利于定位。然后创建一个多边形长方体,按照比例调节成为柱子的形状,长宽高比别为1∶1∶112,并通过复制功能和移动功能将其摆放到合适的位置。
在此基础上,对外墙和内部较大的墙面进行制作。首先为模型添加一个地板,新建一个多边形长方体拉伸至合适的比例,然后调整位置即可。接下来制作外墙,新建一个多边形长方体,将其上面和下面删除,只留下一个“筒子”,使用Insert Edge Loop Tool添加必要的线条,拖动中间的面即可制作成为图书馆外墙的凹面。最后新建三个长方体,调节形状,构成电梯和内部的主要墙体,保存文件。最后结果如图1所示。
图1 图书馆的整体结构
图书馆外墙上镶嵌大量的窗户,所以需要对窗户建模。创建一个长宽高为0.075、10、7的一个多边形长方体,然后贴上自己制作的窗子材质,材质使用Photoshop制作,模仿真实的窗子框架的划分,使用白色代表窗子框架,无色代表玻璃,导出PNG格式图片。贴图时注意使用布林材质,即可产生金属和玻璃的高亮效果,如图2所示。
图2 窗户
图书馆中的门主要有两种,玻璃门和不透明的门,不透明的门主要以贴图的形式来完成,在这里只制作玻璃门,其中包括打开的门和关闭着的门。门的制作和窗子一样也主要由贴图完成,不同的是关闭着的门比窗子多了两对把手,把手的创建也较为简单,创建三个圆柱体,调整大小和角度拼凑在一起,放置在门中间的位置,然后经过复制完成四个把手的创建,最后将所有的部件选中,使用Mesh菜单中的Combine命令进行组合,进行保存,如图3所示。接下来在此基础上使用Insert Edge Loop Tool,将其划分成四段,改成面模式之后,选取右边的两部分,使用Mesh菜单中的Extract命令将原来的模型破成两部分,然后对其调整成为门打开的形状,将结果进行另存为,避免覆盖之前的模型,如图4所示。
图3 关闭的门
图4 打开的门
在门窗制作完毕之后,就可以与之前的框架进行结合,制作出一个完整的图书馆模型。首先,要把楼层制作出来,新建一个多边形长方体,设置比例为139∶2∶134,用来分隔楼层,首先将其放置在楼顶的位置,因为本图书馆只有楼顶是一个完整的长方体,而从2楼至6楼的地板都是不规则的,其中4、5、6三层楼的一致,所以只要做三种地板即可。复制刚刚所制作出的长方体,调节模型的细分宽度为8,这样模型就被划分为8份,然后使用顶点模式,调整其形状和图书馆外墙的俯视图一致,将其复制成5份,其中三份就是4、5、6三层的地板。接下来修改另外两份,继续使用点模式,调节成“工”字形,中间稍窄的作为3楼地板,中间较宽的作为2楼地板。将这5个地板模型插入在图书馆中等分之前的模型。在安装门窗之前,需要把门窗的相关位置的墙删除掉。将外墙和内墙按照图书馆的本来面目使用Insert Edge Loop Tool将其需要删除的地方划分出来,转化为面模式,删除门窗应该占据的位置。使用File菜单中的Import命令导入之前保存的门窗文件,通过复制、调整角度和位置,将门窗安放在之前删除墙壁的地方,如图5所示。
浏览者可以在图书馆内部进行自由移动,拥有非常大的自由度,而不是按照计算机已经设定好行进路线进行浏览。在此基础上,争取使模型面片数尽可能少,以避免不必要的运算,使浏览者能够方便快捷的进行浏览欣赏。
虚拟图书馆内部包含储物柜、书架、电脑桌、椅子、楼梯等等,对其建模就不一一论述。
3.3 虚拟图书馆场景组合
当模型建立完成后,需要将其放入同一个文件中。打开大场景,对场景中还没有材质的地方添加已经准备好的材质,当模型比较大而图片比较小,贴图的时候需要仔细调节位置。组合的模型一共分为两部分,一部分是需要参与碰撞检测的,而另一部分则不需要,要将两部分分别进行组合。选择想要制作碰撞检测的部分,包括场景模型内部有关于墙壁、物体、柱子等模型,通过Mesh菜单下的Combine命令,可以将这些模型组合为一个模型。将其他的物体选中,使用同样的方法将其组合,方便碰撞检测。
4.1 模型文件的导入
使用Virtools来完成交互的实现。首先在Maya软件安装nmo格式的导出插件,确保Window菜单下的Settings/Preferences中的Plug-in Manager选项所弹出的窗口中设置插件可使用,然后使用File菜单下的Export All选项即可将文件导出成nmo格式的文件。运行Virtools将该导入,图6是导入后的效果图。
4.2 “人物”脚本的制作
将所需要实现碰撞检测的物体全部放置在一个新建的组内,命名为Slider Group。新建一个摄像机,命名为Main Camera。新建一个立方体并命名为Person,并设置其初始位置为二楼大厅处。调节其透明度为全透明。为Person设置脚本。在Virtools中的脚本是以Building Block为基础,使用箭头连接数个Building Blocks并赋予相关的参数来实现程序的流程。Switch On Key模组可以实现通过按下键盘上的相应的键,来完成相应的功能。Switch On Key模组初始创建的时候只有两个输入参数和输出节点,其模组的左下角有一个“v”符号,代表该模组的参数数量或者参数类型是可变的,这样在制作过程中如果需要使用多于两个相应的参数只是就不许要创建多个Switch On Key,只要右击该模组然后选择增加参数即可。这次使用的Switch On Key输入参数一共有四个,分别是W、A、S、D,是因为想要通过按下这四个键即可完成视角的前后左右移动。
图6 导入Virtools的图书馆模型
Translate模组可以实现在Virtools中任何3D实体的平移,最初创建这个模组的时候只拥有三个可输入参数,分别是“平移坐标”“平移的3D实体”“是否可以移动子实体的BOOL值”,但是根据需要还可以添加一个目标3D实体,将其改成四个可输入的参数,但是这次的设计中,物体的平移是根据键盘输入来完成的,所以不需要这个额外的参数。创建四个Translate模组,分别代表了前后左右四个方向的移动,所以平移坐标分别设置为(0,0.04,0)、(0,-0.04,0)、(-0.04,0,0)和(0.04,0,0),即向自身坐标的Y轴前进和后退0.04个单位和沿着自身X轴左移和右移0.04个单位。数值0.04是经过多次实验而得到的一个比较理想的速度参数。
为了实现沿着楼梯进行移动,需要实现一个关于纵向移动的功能,上楼梯可以直接利用Virtools自身碰撞检测模块提供的沿物体表面进行滑动的功能,但是下楼梯却不能实现。为了解决这一难题,直接在所有水平移动的后面衔接一个垂直向下的移动。添加一个Translate模组让其产生一个向下0.04单位的位移,这个功能就能够很好的实现。Op模组的功能非常强大,它所接收的参数可以是Virtools中支持的全部类型,而且可以将两个参数进行智能运算得到所需要的结果,正因为这个模组如此之灵活,在它的左下方标记着一个“s”符号,该符号表明其模组可以进行更高层次的设定。这里通过添加一个Op直接获得Person的坐标,通过添加第二个Op将获得竖坐标提高4个单位,这个新的坐标就是摄像机视角的位置。模组的特殊标记除了“s”和“v”以外还有“c”,其含义为本模组拥有自己特色的编辑界面。
Set Position模组可以设置3D实体的位置。它的参数类似于Translate,初始参数也是三个,可以添加一个目标,而正好需要这个目标。添加目标参数后将目标设置为Main Camera,将上一步所得到的坐标赋予第二个参数。这样Person每次移动之后都会设置一次摄像机Main Camera的位置,即可做到“眼随人动”。
Object Slider模组可以制作有关于碰撞检测的相关内容。在一些引擎中中实现碰撞检测需要使用非常复杂的代码,却也不能避免错误的发生,而Virtools对于碰撞检测方面的处理非常人性化,只需要将参与到碰撞检测的物体与人物之间添加一个Object Slider模组并设定参数即可完成。具体方法就是创建一个Object Slider模组,为这个模组设置参数:半径设置为2,这样可以避免自身离墙壁太近,也可以避免自己走到很窄的缝隙中去,出现卡住位置的情况;第二个参数设置为之前创建的组Slider Group中,将开始节点连接至Person根节点上面。完成后Person能够移动和碰撞检测,并且根据自身的位置设定Main Camera的位置。具体脚本如图7所示。
图7 Person脚本
4.3 摄像机脚本的制作
在Virtools引擎之中允许存在数个摄像机,多个摄像机可以同时工作,实现像监控摄像一样的效果,也可以单独工作。Set As Active Camera模组可以将一个摄像机设置为当前的摄像机,这样就可以单独使用多个摄像机中的一个,也可以根据需要将其它摄像机设置为当前摄像机,即可实现视角的变换。Main Camera脚本的主要实现了摄像机的转动和Person方向的设置。需要使用一个Switch On Key模组,是用来获取控制旋转功能的键信息。使用“↑”“↓”“←”“→”控制摄像机的仰视、俯视和环视,其余的设置于获取平移信息的Switch On Key模组没什么区别。
Rotate模组可以实现3D实体的旋转,其初始参数一共有四个,分别是“用矢量来表现一个给定的指向”、“角度和旋转次数”、“旋转的3D实体”、“是否可以移动子实体的BOOL值”,与前面的几个模组一样,它也可以增添一个目标参数。这四个Rotate分别实现向上旋转,向下旋转,向左旋转,和向右旋转的四个功能,其中向上旋转和向下旋转有旋转上限为90度。这里仍然使用两个Op模组,第一个模组的参数是摄像机Main Camera,这里主要是想要获得其所指向的X坐标和Z坐标,Y坐标没有必要动,这一项设定由第二个Op进行设置。之前提到过,Op模组具有非常大的灵活性,其返回的结果也会随着计算的不同而出现不同的类别,两个Op模组所得到的结果均为向量,要对这两个向量进行组合,就需要提取其中的X,Y,Z坐标,很容易想到的是使用另外三个Op模组接收一个向量,导出其中一个坐标的数值。但是Virtools提供了另外一个非常简便的设定,当使用连线将Op模组的向量结果传递给另一个模组的数值参数时,会自动提示要求用户获得其中一个坐标。由于所获得的坐标只是三个数字,所以使用Set Component模组将其合并为一个真正的向量坐标。最后通过Set Orientation设置方向,这里只需要第二个参数和通过添加目标实体所产生的一个额外参数。把通过Set Component合并的向量传递给该模组,然后添加目标实体,也就是需要设置方向的Person。如图8所示。
图8 Main Camera脚本
在测试期间,首先打开所制作的图书馆漫游系统,初始的视角为图书馆二楼的大厅位置,和真实进入黄冈师范学院图书馆的情况一致。使用键盘上的W、S、A、D键进行前后左右的行走,检测平移是否会出现问题。使用键盘上的方向键进行视角的变换,检测旋转过程是否会出现问题。通过移动至图书馆内部物体的边上,检查碰撞检测是否正常。图9分别展示了漫游虚拟图书馆二楼大厅,上下楼层所示和漫游人文社科流动部的情景。
图9 虚拟图书馆漫游场景
在测试期间,整体的场景互动比较流畅,系统并未出现跳帧和卡死的现象。图书馆是公共的服务性场所,模拟真实环境能让读者快速了解图书馆,更好利用图书馆的相关资源。相对以往单一的文本介绍图书馆,采用虚拟现实技术实现直观的三维交互更能达到对图书馆的身临其境的体验。通过Photoshop,Maya和Virtools构建虚拟现实场景,从整体来说系统的实现已经达到了交互图书馆漫游的效果。
[1] 李巧蓉.浅论图书馆信息检索可视化技术[J]. 兰台世界,2013,(02):81-82.
[2] 任金波.虚拟现实技术在图书馆的应用[J]. 科技创新与应用,2012,(34):53-54.
[3] 林于凯.虚拟现实技术在高校图书馆文献检索中的应用[J]. 价值工程,2012,(25):173-174.
[4] 林争春,胡艳.数字图书馆的虚拟场景优化技术研究[J]. 情报探索,2012,(07):98-100.
[5] 朱成,朱开梅,胡伟群,等.三维图书馆可视化馆藏文献信息查询系统的应用[J]. 实验室研究与探索,2012,(07):79-83.
[6] 李建荣,孔素真.虚拟现实技术在教育中的应用研究[J].实验室科学,2014,(3):98-103.
责任编辑 喻晓敏
G434
A
1003-8078(2016)06-0079-05
2016-09-20 doi 10.3969/j.issn.1003-8078.2016.06.21
张俊,女,湖北黄冈人,图书馆馆员,主要研究方向为个人知识管理、虚拟漫游。
徐小双,男,湖北天门人,教授,博士,主要研究方向为计算机支撑的协作学习。
教育部人文社会科学研究一般项目(11YJA880125);湖北省教育科学规划课题(2010A051);黄冈师范学院科研项目(2013021803)。