APP下载

基于VR技术的三维校园漫游系统的设计与实现

2019-09-10李满陈展鹏

现代信息科技 2019年19期
关键词:虚拟现实

李满 陈展鹏

摘  要:基于VR技术的三维校园漫游系统,是根据VR技术的三大特征——沉浸感、交互性和构想性去设计实现的,其中使用到三维建模软件3DS MAX、功能实现软件Unity3D 5.5.3f以及SteamVR插件和VRTK插件。本文主要实现漫游功能、UI交互功能。借助于虚拟现实设备,能够做到足不出户就能观察到真實的虚拟校园。

关键词:校园漫游;虚拟现实;Unity3D;C#

中图分类号:TP391.41       文献标识码:A 文章编号:2096-4706(2019)19-0100-04

Abstract:The design and implementation of 3D campus roaming system based on VR technology is designed according to the three characteristics of VR technology-immersion,interactivity and conception,including 3D modeling software 3DS MAX,function realization software Unity 3D 5.5.3f,as well as the steam SteamVR plugin and the VRTK plugin. This topic mainly implements roaming functions and UI interaction functions. With the help of virtual reality devices,real virtual campuses can be observed without leaving home.

Keywords:campus roaming system;VR;Unity3D;C#

0  引  言

随着科技的进步,VR(Virtual Reality,虚拟现实)技术和设备开始走向大众,据IDC(国际数据公司)近期发布的《中国VR/AR市场季度跟踪报告》显示,2019年第一季度中国头显设备出货量接近27.5万台,同比增长15.1%[1]。VR设备的俏销说明VR的应用越来越广泛,如在教育、医疗、旅游、游戏及建筑行业的应用如日中天,各个大学也纷纷把校园以VR形式搬到线上,达到宣传学校、提高学校社会知名度的目的。

在国内,BAT(B——百度,A——阿里巴巴,T——腾讯)三巨头都在投资虚拟现实。仅在中国网民中,BAT就已经拥有了非常庞大的虚拟现实内容受众群体。如:

百度在2017年提出建造世界上最大的中国语言VR服务;阿里巴巴建设了VR购物体验系统,推出VR商场——Buy+;2015年,腾讯公布了Tencent VR SDK及开发者支持计划,并且系统阐释了对虚拟现实领域硬件和平台两大部分的规划。

在国内不少高校已经建立起VR实验室,开展虚拟现实相关的教学活动和研究活动。并且把校园以VR的形式搬到线上,达到更直观地宣传学校的目的[2]。

未来,5G技术带来的高带宽和低时延等优势,将带动VR应用市场朝着更高精度、更强专业性的行业领域深入发展。IDC中国终端系统研究部市场分析师谭睿指出:“在经历了一段技术与生态的沉淀期后,国内VR/AR行业将伴随着迭代产品进入市场从而释放增长潜能。VR/AR产业作为5G技术重要的落地应用场景之一,深度应用云计算、语音交互等技术,建立先发优势。”[3]

1  校园漫游系统总体设计

本文以广州工商学院三水校区为蓝本,设计完成校园的漫游系统。主要解决模型、移动、场景切换、UI交互以及打包发布五个问题,如图1所示。模型由美工、美术人员进行搭建。移动和UI交互需要用到SteamVR和VRTK(Virtual Reality Toolkit)这两个插件去实现,场景切换需要载入和UI交互配合使用。打包发布用软件的打包工具。

1.1  用户漫游移动

在SteamVR插件的[CameraRig]上添加VRTK的VRTK_HeightAdjustTeleport脚本实现虚拟现实的基本远程传送,通过调整这个脚本的参数可以调整是否使用重力、速度等的参数。

在SteamVR的[CameraRig]下的两个Controller上都挂载VRTK的VRTK_Tracked Object和VRTK_Simple Pointer来实现在手柄上添加一条射线,方便用户知道自己在往哪个方向传送和知道哪些地方能够过去、哪些地方不能过去。再配合VRTK_ControllerEvents等脚本实现手柄射线控制用户移动[4]。

1.2  场景切换

Unity3D引擎由于场景物体过多会导致过度占用内存,所以一个场景之中一般不能存在过多的物体,否则会占用大量内存,影响用户体验。这个时候就需要使用场景切换。场景切换有四种方法。

第一种是同步载入,代码是Application.LoadLevel();第二种是异步载入,代码是Application.LoadLevelAsync();第三种是同步附加式载入,代码是Application.LoadLevel Addictive();第四种是异步附加式载入,代码是Application.LoadLevelAddictiveAsync()。

使用同步载入的时候,在A场景切到B场景时,Unity3D会销毁A场景显示B场景,但是如果B场景比较大的时候会感到异常的卡顿。

使用异步载入的时候,载入场景是在后台进行的,所以在切换场景的时候不会卡顿,适合载入大型场景的时候使用。

使用同步附加式载入的时候,在载入结束后场景A和场景B将会同一时间存在,比较适合地图比较大的时候使用。

异步附加式载入跟同步附加式载入的区别依旧是一个在主线程运行一个在后台线程异步进行。

1.3  UI交互

在Unity3D中有两种方法制作UI交互面板。一个是NGUI插件,另一个是Unity自带的UGUI。NGUI和UGUI都是出自同一个制作组,前者是在Unity3D没有UI制作面板的时候由NGUI的制作组制作发布供给用户使用;后者则是在Unity3D 5.X版本之后Unity的公司招募这个制作组制作的。

1.3.1  使用NGUI进行制作UI交互面板

在创建NGUI的时候,系统会自动检测有没有UI Root和NGUI的Camera,如果没有,会自动生成UI Root和Camera,所有UI空间都必须放在UI Root中。其中,Sprite是图片,使用Sprite的时候需要把图片打包成图集,使用NGUI的Atlas Maker把图片打包,然后使用图片,通过调整参数调整图片大小等。Label是文字,值得注意的是NGUI自带的字体不支持中文,需要使用Unity3D里的字体才能支持中文。Texture也是图片,它与Sprite的区别是不用把图片打包成图集,一般用于制作背景。Prefab Toolbar把里面需要的按钮放上去就能直接使用,按钮背景可以根据自己喜好去修改[5]。

1.3.2  使用UGUI进行制作UI交互面板

因为是出自同一个制作组,跟NGUI部分原理相同。UGUI使用的时候需要添加一个Canvas(画布),用作于承载体,所以UGUI的控件也必须放在Canvas里。Panel相当于NGUI的Texture,image相当于NGUI的Sprite,Text相当于NGUI的Label。功能一样,但是,使用image的时候,图片不需要打包成图集,可以直接放进去使用。功能按钮控件的使用方法和NGUI基本相同,导入就能直接使用。

1.4  Unity的打包与发布

在制作好之后要把自己制作好的东西打包发布成exe、apk等格式的文件供用户使用,因为这个三维校园漫游系统是在PC端运行的,所以需要将文件打包成exe格式发布供用户下载使用。

2  三维校园漫游系统的设计与实现

2.1  前期准备

在制作三维校园漫游系统之前,首先要进行拍摄,掌握学校每一栋建筑的特点,这对于建模和场景搭建都有非常深远的影响。以学生宿舍为例,学生宿舍结构都是一样的,只不过是位置和房间的数量不同,掌握好这些基本条件,很快就能将大量宿舍的模型创建出来。同时还需要准备一张学校的俯视图和施工图,这样方便场景搭建,能够很好地确定每个模型在场景中的具体位置。

2.2  场景搭建

场景搭建是至关重要的一步,如果没搭建好场景就开始制作,会导致一些功能的实现出现bug。在搭建场景时,需要注意比例。在Unity3D里面所使用的单位是米,所以在建模和搭建场景要使用米来做单位,防止因为单位比例不对而导致出现模型失调等bug。在制作初期通常使用白模或者是低精度模去搭建场景,以便保持进度一致,在完成低模场景搭建后再进行功能实现,在后期将白模或者低精度模替换成有贴图的高精度模型,并不会影响到功能的实现。图2是制作三维校园漫游系统使用白模搭建的校门口场景。在使用虚拟现实设备调试时,由于纯白色的模型显示会对眼睛造成伤害,要把模型加上颜色,如紫色,方便观察以及后期的调试。

在搭建场景时,使用地形工具创建河流和湖泊,首先要先将地形抬高,再按住Shift+鼠标左键,对地形进行降低处理,再在降低的地形上放置Unity3D官方提供的水材质,把水铺上去就能完成河和人工湖了。如图3所示为校园内河流添加水面后的效果。

2.3  漫游系统的实现

漫游系统的实现主要是靠SteamVR插件和VRTK这两个插件共同完成,SteamVR插件主要是使用[CameraRig]预制体。这个预制体是已经自带相机的,所以需要删除或者隐藏场景中的主要摄像机,以获取SteamVR的摄像机。[CameraRig]下是带有两个控制手柄的,这个控制手柄只有在运行的时候才会显示出来。这两个手柄都已经是有对应的脚本功能的,使用时只要获取按钮就能实现交互功能。使用SteamVR_TrackedObject trackdeObjec;这句代码能够获取到SteamVR手柄[6]。

在开始前输入这一段代码能够获取到手柄上的组件。

void Awake()

{

//获取手柄上的这个组件

trackdeObjec = GetComponent<SteamVR_TrackedObject>();

}

在获取完手柄组件之后,在FixedUpdate中获取手柄的输入“var device = SteamVR_Controller.Input((int)trackdeObjec. index);”,然后使用if()条件语句来设置事件,例如下面这一句是当触碰到扳机键后,控制台会打印出“触碰扳机键,持续中…”:

if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))

{

Debug.Log("触碰扳机键,持续中…");

}

这就是SteamVR手柄按鈕的获取以及功能的实现。

在获取SteamVR手柄按钮之后,就需要实现漫游功能,而VRTK这个插件的脚本正好能够实现漫游功能。VRTK_HeightAdjustTeleport这个脚本能实现基本的传送功能,把它挂载到SteamVR的摄像机上,但是它必须要使用VRTK的世界坐标。然后使用VRTK_Tracked Object、VRTK_Simple Pointer、VRTK_ControllerEvents等脚本,挂载在SteamVR手柄上,能实现可视化传送目标,能够根据射线颜色和目标点来确定传送的地方。

if (pointer.gameObject.activeSelf)

{

Ray pointerRaycast = new Ray(transform.position, transform.forward);

RaycastHit pointerCollidedWith;

var rayHit = Physics.Raycast (pointerRaycast, out pointerCollidedWith, pointerLength,~layersToIgnore);

var pointerBeamLength = GetPointerBeam Length(rayHit, pointerCollidedWith);

SetPointerTransform(pointerBeamLength, pointerThickness);

}

这一段代码实现可视化传送,在手柄上发射一条射线,射线击中的地方就是传送的目的地。但是要注意,因为有些地方是不能过去的,所以要给物体加上碰撞体的组件,否则会出现穿模。

在添加碰撞体组件时要注意包裹住整个模型,以免出现因为部分穿模而产生bug。添加完碰撞体组件后,有阻挡的地方射线会变成红色,用户就无法传送到红色的地方。

2.4  场景跳转的实现

实现场景跳转需要使用UI交互,UI交互是用户体验最重要的环节。在这个三维校园漫游系统里面,选择使用异步载入的方式,以防止部分用户因设备问题导致加载卡顿。异步载入使用SceneManager.LoadSceneAsync()方法进行载入场景。首先是在场景A里面创建一个Canvas,然后在Canvas里面创建一个Button,新建一个脚本,用于实现跳转加载场景,因为加载场景里面就只有一张图片和加载条,所以一般用户很快就能读取到加载场景。所以脚本直接使用同步载入。代码如下:

public class ToLoading : MonoBehaviour,IPointerClickHandler

{

[Tooltip("Loading")]

public string nextSceneName="Loading";

public void OnPointerClick(PointerEventData eventData)

{

SceneManager.LoadScene(nextSceneName);

}

}

在加载场景Loading里面放入图片和滑动条以及文字,在文字上新建一个脚本就能实现异步载入。完成异步载入,能够使得电脑配置较差的用户在切换场景时不会过于卡顿。

任何漫游系统都不能缺少场景切换,如果场景较小,对于设备要求不高的可以使用同步载入;如果场景较大,对于设备要求较高的就需要使用异步载入。如果说场景较大对设备要求不高但是切换场景后不销毁前一个场景那就是用同步附加式载入;对设备要求高则用异步附加式载入。

2.5  UI交互实现

UI交互是非常常见也是必需的一种功能,三维校园漫游系统是使用虚拟现实设备手柄去体验UI交互的。所以需要使用到SteamVR插件和VRTK插件。

在右手的手柄上添加以下几个组件:VRTK_Controller Events;VRTK_Controller Actions;VRTK_Pointer;VRTK_UI Pointer以及VRTK_Straight Pointer Render。添加完组件之后要注意指定Renderer,否则无法运行。

然后开始设置UI。创建UGUI,把GUI的模式设置为World Space,如果不设置World Space的话会无法使用UI的。在Canvas上添加一个VRTK_UI Canvas组件用于交互。然后把需要的按钮等放进去就能使用虚拟现实设备去进行UI交互了。

但是这样还不够,不能让UI面板一直显示在视线前面,需要先把UI面板隐藏,然后添加一个脚本,获取到手柄的输入,当用户按下菜单键的时候让UI面板显示,不需要时再按一次将其隐藏。

2.6  音乐的添加

音乐也是必须要有的功能,可以让用户在轻松愉快的音乐声中漫游虚拟校园。

在SteamVR的攝像机上添加一个Audio Source组件,把准备好的音乐放进去就能够实现音乐的播放,可以设置循环播放;如果音乐太少可以使用Audio Clip编辑音频添加多音乐进去。也可以通过添加UI来调整声音的大小,添加一个Slider,然后设置脚本绑定Audio Source组件的音量,就能实现声音大小调整的功能了。

2.7  打包发布

设计完成,调试通过,最后就要进行打包发布。在选项File中找到Build Setting,然后设置发布,选择PC端打包发布,把做好的场景拖进去,然后点击Build就能打包发布了。要注意场景顺序不要打乱,否则发布之后会导致场景混乱和bug的出现。

3  结  论

三维校园漫游系统的开发,是技术和艺术综合知识能力的应用,要有整体规划,要掌握拍摄技术、建模技术,要懂美工和编程等等,作为VR技术开发人员,必须要技艺两全,有开拓创新精神和团队合作意识,综合素质要高。

尽管整个三维校园漫游系统的开发已经完成,功能内容已经实现,具有一定的使用价值,但是由于时间关系和开发经验不足,在这个系统中仍有值得去改进的地方,比如所代码的简化完善、场景优化等等。

参考文献:

[1] 赵佳蕊.2019年Q1中国VR头显出货量同比增长15.1%,增量来自桌面头显 [EB/OL].智东西.(2019-07-10).http://www. sohu.com/a/326214839_115978,2019-07-10.

[2] VR小哥.深度解析BAT在VR领域的布局和投资 [EB/OL].(2018-03-07).http://www.sohu.com/a/225049842_ 100085695.

[3] 卢雁明.国外VR虚拟现实技术的发展及应用现状 [EB/OL].(2016-11-09).http://www.yuloo.com/mbgx/1611/ 1475372.shtml.

[4] Karli Watson,Christian Nagel,等著.C#入门经典:第5版 [M].齐立波,译.北京:清华大学出版社,2010.

[5] 程杰.大话设计模式 [M].北京:清华大学出版社,2007.

[6] 锐萌瑞.SteamVR插件使用 [EB/OL].(2018-01-29).https://blog.csdn.net/qq_34552886/article/details/79200302.

作者简介:李满(1966.12-),女,汉族,河南南阳人,副教授,本科,硕士,研究方向:计算机应用;陈展鹏(1997.10-),男,汉族,广东广州人,本科,学士学位,研究方向:数字媒体技术。

猜你喜欢

虚拟现实
在虚拟现实中体验上课 Experiencing a class in VR
移动VR正照进现实
虚拟现实,让学习更“沉浸”
培训新势力从人工智能到虚拟现实
虚拟现实LG 360 VR眼镜
Facebook组建虚拟现实社交团队
View Master虚拟现实显示器