用抛物线的点实现HTC Vive瞬移系统

来源:互联网 发布:可以拼长图的软件 编辑:程序博客网 时间:2024/05/16 07:15

原文链接:[https://github.com/Flafla2/Vive-Teleporter#htc-vive-teleportation-system-with-parabolic-pointer]

这个是针对HTC Vive和unity引擎简单易用的瞬移系统。这个系统是模仿Valve的Vive游戏“The Lab”而作,即玩家可以穿过比游戏区域大的VR环境。下图可以看到对于系统的演示:

这里写图片描述

提供的这个系统解决了以下问题:

1 计算可导航空间:我们显然不希望玩家可以传送出边界,或者在不透明物体内部。为了解决这个问题,这个系统使用了Unity生成的导航网格作为玩家可以传送的边界。因为这个过程包括了Unity的工作,所以它很稳定并且可以放心的应用到大多数工程中。为了预加载这个数据,只需要在场景的任何位置添加一个”Vive Nav Mesh”组件,并且在检视面板点击”UpdateNavmesh Data”按钮。这样无论什么时候更新场景都可以用新的NavMesh烘焙来更新Vive Nav Mesh。上边的过程说明如下图:
这里写图片描述

2 选择瞬移目的地:这个系统通过简单的运动学方程使用了直观的抛物线选择机制。再次说明,这是受到了Valve的“The Lab”启发。用户将控制器举到更高的角度时,选择点会生成的更远一些。如果用户将控制器举过45度(抛物线的最大距离),角度将会锁定在那个距离。
3 表现游戏区域:很有必要知道传送后防护边界在哪里。因此系统围绕防护边界划定了一个盒子。
4 减少不适感:瞬移(显示为“眨眼”)时屏幕的淡入淡出可降低用户的疲劳和眩晕感。

这个Unity工程(版本5.3.4p6)提供了两个简单场景:一个直接集成了SteamVR,另一个适用于没有HTC Vive的小伙伴来演示系统功能。资源代码已经做了文档和注释,或者可以跟随MIT Licence(参照LICENSE.txt)使用.

开始吧
为了使瞬移设置运行需要使用三个组件:
Vive Nav Mesh组件控制Unity的NavMesh系统到可渲染网格的转换。它还会计算NavMesh的边界,所以当玩家选择传送位置时可以被显示出来。
Parabolic Pointer组件生成/显示一个指示网格并从Vive Nav Mesh进行采样。
Vive Teleporter组件控制实际传送机制。它从Parabolic Pointer找出指示数据这样就知道要传送到哪里。当用户决定传送时它还会平稳的淡入淡出屏幕防止带来的不适感。它还可以和SteamVR配合来控制按钮点击事件、控制器管理、触觉反馈,当选择传送位置后还可以显示传送区域边界。

注:Teleport ViveParabolic Pointer组件都会自动添加一个Border Renderer组件。Border Renderer仅仅生成并渲染出显示 ViveNav Mesh边界的网格和SteamVR游戏区域。

第一步:配置Vive NavMesh
这里写图片描述

从添加Vive Nav Mesh对象开始,可以在Assets文件夹中的Vive-Teleporter/Prefabs/Navmesh.prefab路径下找到一个预配置的Vive NavMesh。可以将这个对象放在场景层级面板的任何地方和场景中的任何位置。
接下来需要在Unity中烘焙一个导航网格(“Navmesh”)。这个可以在Navigation窗口中完成(Window > Navigation)。

这里有几点需要考虑:
系统自动剔除斜坡导航网格三角形。这意味着任何没有直接面向上的部分的导航网格都会被传送系统忽略。这个在VR中是合理的,因为玩家不能走上斜坡!

必须在所以可传送表面使用物理碰撞器。抛物线的点(见下边第二步)使用物理射线来确定玩家指向。因此所有可传送表面必须有碰撞器(包括像墙这种不可传送的表面并且要阻止指示)。

为不可传送区域分配不同的导航区域也是个不错的主意。这个对于优化(因此当玩家选择传送位置时系统不需要渲染巨大的预览网格)和游戏平衡(这样玩家就不会传送到地图以外了)很有帮助。

烘焙完导航网格之后(使用Navigation窗口底部的“Bake”按钮),回到之前创建的Vive Nav Mesh 对象。如果决定专用的导航区域(见上方),可以通过Area Mask属性选择那些区域是可传送的。然后点击检视面板中的“Update Navmesh Data”按钮,就会看到导航网格显示在场景视图中。

第二步:配置ParabolicPointer
这里写图片描述

接下来添加Parabolic Pointer 对象。可以在Assets文件夹中 Vive-Teleporter/Prefabs/Pointer.prefab路径下找到一个预配置的指针。可以将它放在场景层级面板的任何地方和场景中的任何位置。
你当然可以修改Parabolic Pointer脚本中的任何设置了,不过只允许设置其中的一个:配置从第一步的ViveNav Mesh对象到指针的“Nav Mesh”。

第三步:配置Vive Teleporter
这里写图片描述

最后需要为SteamVR Camera添加一个Vive Teleporter (Component > Vive Teleporter > Vive Teleporter)组件。这是用来渲染Vive显示的摄像机。如果是使用了SteamVR 插件中的[CameraRig]预制件则应该将Vive Teleporter 添加给那个预制件中的Camera (eye) 对象。

接下来为组件属性配置以下值:
Pointer:将这个设置为第二步创建的Parabolic Pointer 对象。
OriginTransform:将这个设置为追踪空间的起点。如果使用了SteamVR插件,这个就是[CameraRig] 游戏对象。当玩家传送时这个对象是实际移动的。
HeadTransform:将这个设置为玩家的头部。这个应该是Origin Transform的子集。如果使用了SteamVR插件,这个是Camera (head) 游戏对象。
Navmesh Animator:将这个设置为第一步创建的Vive Nav Mesh 对象的动画。
Fade Material:将这个设置为Vive-Teleporter/Art/Materials/FadeBlack.mat中的材质
Controllers:将SteamVR控制器对象填到这里。如果使用了SteamVR的 [CameraRig] 预制件,则应该将Controller(left) 和 Controller(right) 两个对象填到这里。

0 0
原创粉丝点击