基于Unity3D虚拟空间在虚拟现实漫游校园中的应用
作者: 刘顺裕
摘要:随着计算机网络的发展和信息化技术的整合升级,很多高校都实现了自己的校园漫游系统,但大部分高校的校园浏览系统借助二维图形技术实现,浏览的身临其境和景物的真实度较差,不能为用户提供良好的使用体验。随着数字化技术的不断发展以及VR技术的兴起,漫游浏览系统在漫游方式上发生了翻天覆地的变化。用户可以借助Unity3D开发VR设备,能够在自然、逼真且沉浸感强的虚拟校园中进行浏览,感知更加精准化,交互方式更加多维性。
关键词:校园漫游;VR技术;Unity3D
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2022)31-0096-03
1 引言
在新冠肺炎疫情暴发的大背景下,很多校园在封闭管理的情况下,为了维持学生的学习进度,开启了网络教学,例如网络课堂教学,或是以网络直播的方式进行。但笔者认为,在线教学只是满足学生在学习上的需求,社交需求、办公需求等很多需求,户外运动需求是无法满足的。
以设备安装、场景漫游、互动展示为例,设计了包含教室会议、课堂互动等一体的Unity3D模拟场景,形成适合学生生活学习的校园模拟仿真立体化系统,通过游戏手柄、射线等方式对房屋进行场景漫游,为学生提供互动真实的漫游体验。
2 Steam VR Plgin
1) 拥有Unity和HTC Vive
①Unity官网https://unity.cn/下载。
②HTC官方旗舰店各方电商网站均有。
2) Steam VR Plugin的下载
①Asset Store中搜索Steam VR Plugin。
②下载并导入插件。
③打开SteamVR文件夹,查看Prefabs。
3) 配置摄像机以及对应的控制器
把插件中的脚本SteamVR_Camera挂到任一camera上,然后点击expand即可。而对于控制器手柄,则先建立一个游戏物体,接着进行脚本SteamVR_ControllerManager添加操作,并构建2个相关子游戏物体,按照系统配置需要,进行脚本SteamVR_TrackedObject添加操作,并将相应的Index设置为None,接着完成左右两个手柄添加;最后再在两个子游戏物体上各添加一个游戏物体,添加脚本SteamVR_RenderModel用于渲染手柄的模型,并且跟踪手柄的位置。至此,就可以完成设置并开展工程了。
3 关于Steam VR插件中的代码事件
3.1 SteamVR_GazeTracker.cs 提供凝视时的事件
这个脚本的作用是判断当前物体是否被用户(头显)注视,进入注视后会出现回调,离开注视时也会出现回调。在注视状态下的物体与实际注视点的距离范围被定义为小于0.15米,而在0.4米以上离开注视状态的距离范围。之所以有一个大致的范围,并且使用了一个平面进行相交,是因为注视这个动作比较粗糙,玩家想要精准地观看难度比较大。
3.2 SteamVR_LaserPointer.cs 应该是镭射光线
这个脚本的作用与上面的SteamVR_GazeTracker相关并类似。GazeTracker是通过头显的正视方向与物体相交来计算交点的。而这里就是通过所谓的激光束来和物体进行交互的。激光束是手柄指向的方向,在游戏中可以渲染出一个方向的激光束,特别是通过手柄进行UI操作菜单的时候。在github openvr的sample目录下的unity_teleport_sample示例有使用,它被加到右手柄上同上面的GazeTracker一样,触发的事件所带的参数。
3.3 SteamVR_Teleporter.cs 传送功能
此脚本在github上的openvr的samples里面的unity_teleport_sample示例中有使用,从名字上看是用来做瞬移的。这个例子是在场景中放一些球,然后把这个脚本放在右边的控制器上,也就是通过右边的控制器可以做瞬移。其做法是会从控制器上发出激光束,按下扳机键,就能瞬间移动到激光束所指之处。通过观察球的相对位置,可以看出位置的变换。这在游戏中很常见,拿鼠标一点,被操作的对象就会过去(当然过去有两种方式,一种是慢慢走过去,一种是直接跳过去),另一种是看到的校园地图。
3.4 SteamVR_TestThrow.cs 投掷东西
这个脚本上面的测试场景的控制脚本,要与SteamVR_TrackedObject一起使用。实际上它会加到手柄上。
3.5 SteamVR_TrackedController.cs 手柄按钮事件的接口
这个脚本对控制器的输入做了一个简单的封装,将原始的输入数据转化成事件回调模式,它在SteamVR_LaserPointer.cs和SteamVR_Teleporter.cs中有使用,也就是在github上openvr中的teleporter示例中有使用。在SteamVR_Teleporter.cs中,如果当前物体上没有SteamVR_TrackedController.cs,会自动添加它(在老版的插件中,如果没有添加,会报错)。
4 VRTK实现与Vie控制器的交互
4.1 触摸交互对象(VRTK_InteractTouch)
将脚本T进行添加,主要是添加到之前设置的控制器上,尤其是触摸交互类型的那种脚本。
4.2 抓取交互对象(VRTK_InteractGrab)
VRTK与Vie控制器交互,在控制器中需运用抓取脚本以及VRTK_ControllerEvents脚本,后者可对按钮事件作出监听,并参照实际操作需要,迅速判断获得是否存在AliasGrabOn或AliasGrabOff 事件,从而明确对象后续应如何处理,如是否应进入抓取环节或是否应进入释放环节。
控制器对象可运用VRTK_InteractTouch 脚本,以获知何时可交互对象能够被触摸。仅有可被触摸的物品方可抓取。
若控制器在运行过程中,同时满足下述两项条件:一是,触碰到VRTK_InteractableObject脚本;二是,isGrabbable 标志位呈现为“真”。此时判定该游戏对象可抓取,则按下相应的抓取按钮,使得抓取对象以及对其对象能够被放至控制器,直至松开该按钮进行释放操作。
松开抓取按钮,此时若互动对象能够被抓取,可能够按一定速率往松开方向逐步推进,即完成模拟抛掷操作任务。
可交互物体在达成碰撞体激活条件之后能够完成触发,在此状态下刚体可实施拾取操作,进而达成移动目的。
4.3 使用可交互对象(VRTK_InteractUse)
一种脚本而且是可交互使用、添加至[CameraRig] 之前设定的相关控制器的对应目标对象,此后还需要进行另外的一个步骤,比如说是把VRTK_ControllerEvents用来做其他的流程,比如是进行监听。这种监听要监听特定的事件,比如AliasUseOn 和AliasUseOff,从而确定是否应该继续进行下去,还是说需要进行停止的程序。
在这时,还需要考虑其他的因素,比如添加VRTK_InteractTouch,从而来决定什么时候可以接触,什么时候不可以接触。基本可以确定的是进行有效的接触才能产生有效使用。
如果说发生了以下的情况,如触碰VRTK_InteractableObject 脚本同时isGrabbable 标志位呈现为“真”,此时表示“有效”。
4.4 自动抓取可交互对象(VRTK_ObjectAutoGrab)
对VRTK_ObjectAutoGrab脚本作出进一步的处理和应用,比如把它放到控制器上,然后再进行之后的抓取步骤,从而实现自动这一程序和要求。之后可以接着进行下一次操作,比如把[CameraRig] 进行添加,主要是添加到控制对象上,之后再次添加
VRTK_InteractGrab 脚本。在进行Clone Grabbed Object的步骤中,如果进行以下操作也就是勾选,那么这样一来会添加到控制器上,其他的就会留在之前的场景中。
5 简单激光指针与传送(VRTK_SimplePointer)
简单指针脚本从控制器尾部发出一个光束来控制世界指针,控制玩家瞬间转移。
这在场景中对指向对象是有用的,它可以判断所指向的对象使用控制器抓起与握住物体,使用控制器与物体互动。
期间默认激光射线通过控制器的抓握键来激活。侦听的事件是把游戏物体变成交互式的UI元素,所以相关的文件都存放在VRTK这个文件中,此文件可以通过复制完成到现有的所有工程中。
简单指针脚本添加到预制里的控制器对象上,同时添加需要脚本来监听启用和禁用光束的控制器按钮事件,Examples文件夹包括了该工具集中的实例的场景中。
5.1 可调节性的垂直高度传送器(VRTK_HeightAdjustTeleport)
该传送器能够结合传送位置,判断目标对象是否位于其余对象的顶部区域,因此可以改变相应的y位置,从而满足实际调节需要。
和建好场景之后,直接加到游戏场景中,无须多余的操作。当开始运行时,从头盔就可以看到两个控制器手柄。
Play Space Falling 选项表示参与者头盔在处于对象上方时,此时可直接判断是否能够自动传送至其他对象顶部位置,在模拟爬梯操作时具有实践意义,无须通过指针光束进行定位。若不勾选此选项,玩家就可以在所站物体的相同Y高度(即物体外部有一部分游玩区)的空中行走。
激光束默认按控制器上的抓握键Grip来激活。在预制体下面的控制器对象上,并且对外提供事件处理监听器。原因是系统菜单按钮行为是Steam平台提供的,它不能被覆盖。
5.2 基础性物理传送器(VRTK_BasicTeleport)
基础传送器的实时性,直接由弹性变形元件感测压力带动指针变动。 基础传送器脚本采用精密压力矫正器或者是物理系统重量设置传送器。
静止压力与差型号经过传送器后产生位移,当弹力膜收到张力,将电阻力量与刚体形变拉长,变细,即可崩坏以及弹力增大。
5.3 贝瑟尔指向性地添加性控制器
可将脚本添加至[CameraRig]中所预制形成的控制器。
最重要的是开始使用函数中调用游戏体发射的函数,该函数实例化一个子类游戏体,对游戏体的刚体施加一定的力,发射出去之后,经过一段时间即可销毁。VRTK_ControllerEvents脚本可用于监听按钮开关光束。
在开始运行时,设置一个旋转速度,在结束运动时候设置为0,这实现了通过触发器的时候胶囊体是一直旋转的,松懈时可以立刻停止。贝瑟尔生成的激光射线并不是直线,而是曲线,允许用户在消失的物体顶端爬动。
5.4 头部装置设定淡出显示碰撞器
该设置可以了解参与者VR头盔何时会触碰其他相关游戏对象,此时会形成一个单色。目的是处理玩家将头放入一个游戏对象中,就是文章所提到的菟葵,能够获知对象内部裁剪情况,并不是如预期一般。
这一情况主要是由于若参与者将头摆放至不应摆放的位置,则会形成一种特定颜色(比如红色),而不是绿色。这会让玩家意识到自己做错了事情,然后可能自然而然地就会反观自己的行为是否出错。若头盔发生碰撞,那么传送行为将被立刻禁止,防止有类似穿墙的外挂行为发生 。
5.5 呈现碰撞结束标记
虚拟现实用户在游戏呈现上有身体的概念,可结合用户自身所处位置,采取持续冲撞的方式强化身体概念。在整个游戏过程中,碰撞及刚性车身能够防止游戏玩家出现穿墙或其他实体碰撞物的情况。在系统设计中,碰撞体高度一般与玩家头盔具体高度相关,若玩家蹲下或者需要上坡或者下坡,碰撞体收缩的幅度一样大,这就意味着在较低的空间里可能会去蹲下爬行通过。
参考文献:
[1] 李欢.基于Unity+3D的室内VR仿真设计[J].科技创新与应用,2019(10):40-42.
[2] 朱惠娟.基于Unity3D的虚拟漫游系统[J].计算机系统应用,2012(10):36-39.
【通联编辑:李雅琪】
收稿日期:2022-04-11
基金项目:广东省普通高校青年创新人才类项目:《基于VR技术的虚拟校园漫游系统的开发与研究》(编号:2019GKQNCX001)
作者简介:刘顺裕,男,广东江门人,本科,主要研究方向为计算机应用技术、数字媒体技术。