此篇为 SteamVR 系列教程第二篇,主要内容为介绍 SteamVR Input System

特别鸣谢:

本文大量内容参考自 SteamVR 2.0 Unity插件使用指南 (作者:邵伟)

一、为什么需要 SteamVR Input System

近几年来,越来越多的厂商开始生产 VR 设备,随着越来越多的 VR 设备的推出,控制器类型逐渐趋向于碎片化。每当有新的控制器发布,都会给开发者带来一些额外的工作量——游戏项目需要修改交互代码以适配新的设备。这为 VR 应用的开发和传播造成了很大麻烦。

鉴于此,V社(Valve)为Unity开发者推出了 SteamVR Unity Plugin 2.0(以下简称SteamVR),SteamVR 2.0 中加入了 Input System ,它能够使开发者在编程中专注于用户的动作,而不是具体的控制器按键。

Input System 与之前处理用户输入有显著的不同,使用 SteamVR Input System,开发人员可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键。这样新的设备可以快速适配应用程序,无需更改代码。比如,当开发者检测玩家是否抓取某个物体的时候,不是检测Vive控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的"Grab"动作是否为True即可。作为开发者,可以在SteamVR中为Grab动作设置默认按键和阈值,当程序运行时,也可修改这些数值以满足玩家的个人偏好。基于这种机制,不光能够解决控制器碎片化的问题,也可以快速适配未来发布的设备。

动作(Actions)Input System 的核心概念是动作(Action),基于动作的输入系统对于游戏引擎来说更有意义, Unreal一直在沿用这种方案,而Unity目前在开发中的输入系统也将遵循这一原则。开发者需要放弃之前关于“按下某个按键发生什么事情”的思想,取而代之的是使用“做出某个动作发生什么事情”的思想。SteamVR 2.0将动作抽象为以下6种类型,简介如下:Boolean类型的动作代表只有两种状态的动作——True或False,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态。在Unity中对应类为SteamVR_Action_Boolean。Single类型的动作能够返回0~1之间的数值,比如 Trigger 键按下到松开的过程。在Unity中对应类为SteamVR_Action_Single。Vector2类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆。使用这样的数值能够控制物体在四个方向的运动,典型的应用时使用Touchpad控制无人机或小车的运动。在Unity中对应类为SteamVR_Action_Vector2。Vector3类型的动作能够返回三维数值,在Unity中对应类为SteamVR_Action_Vector3。Pose类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器。在Unity中对应类为SteamVR_Action_Pose。Skeleton类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像LeapMotion等设备获取手指输入那样精确,但是足以获得良好的沉浸感。在Unity中对应类为SteamVR_Action_Skeleton。3.1 骨骼输入对于骨骼输入,Knuckles控制器为SteamVR体验带来了手指跟踪功能,能够估算用户手指的位置,然后将数据传递给驱动程序,驱动程序将其对应解析到手部模型的31块骨骼上,从而给用户带来更好的沉浸式体验。该功能并不是Knuckles所独有,SteamVR还能够为HTC Vive和Oculus Touch这样的设备提供手指状态估算,比如判断手部是否打开,手指是否放置在Touchpad上。同时Valve公司还将与Microsoft展开合作,以增加对Windows MR控制器的支持。默认情况下,运行Interaction System示例场景中能够同时看到手部和控制器模型,此外,还有一个辅助组件SteamVR_Behaviour_Skeleton,如下图所示。有关该组件的使用,可以参考Interaction System的示例场景。