SteamVR_ControllerManager和SteamVR_TrackedObject

    Vive控制器由菜单键(ApplicationMenu),触摸板(Touchpad),系统键/电源键(System),扳机键(Trigger),侧柄键(Grip),组成

    使用方法:

    在Origin物体上添加2个子物体代表Vive的2个手柄,增加SteamVR_TrackedObject,Index设置为None

    在Origin物体上添加SteamVR_ControllerManager,设置左右手柄

     7.11 SteamVR Plugin  - 图2

    在origin上再加一个子对象主相机作为head如图,加上steam vr_tracked object


    关于控制器的相关信息都包含在SteamVR_Controller这个脚本之中。注意:SteamVR_Controller是非Monobehavior的脚本,并没有挂在场景下,其运行是通过SteamVR_Render脚本对于其中Update()函数的调用从而一直循环获取手柄相关信息。

    而SteamVR_Render脚本是在程序运行时自动加载至场景。

    Device类:最重要的类,封装了跟踪设备的全部信息。

    Update()函数:被SteamVR_Render脚本调用,更新各跟踪设备的信息。

    Input()函数:根据Index初始化Device[]数组,并实例化所有16个Device。

     7.11 SteamVR Plugin  - 图4

    DeviceRelation和GetDeviceIndex()结合获取特定的设备Index,如leftmost、rightmost。在SteamVR_TestController脚本中有使用到该函数获取用户的左右手手柄的Index。用该方法应该可以识别出用户所拿的手柄是哪一个。

    下面着重分析Device类:

    针对按键的三个函数,每种函数有两个重载,参数为ButtonMask或EVRButtonId类,第二种形式会将EVRButtonId转换为ButtonMask后调用第一种得到结果。

    Touchpad针对Touchpad的三个函数,一样的两种形式。

    GetAxis()

    获取Touchpad圆盘坐标或Trigger的行程值(0-1),函数默认参数是手柄上的Touchpad。共有5个AxisId参数可选,0是TouchPad,1是Trigger,2,3,4应该是没有用的,且此函数只接受EVRButtonId类参数而不接受ButtonMask。

    手柄震动

    GetHairTriggerGetHairTriggerDown定义为有false转至true的过程,判断先前状态和当前状态。GetHairTriggerUp 定义为有true转至false的过程,判断先前状态和当前状态。

    这三个函数获取HairTrigger的状态,其值对应rAxis1.x的值。But什么是HairTrigger?形象点说就是像头发般轻轻的触发。HairTrigger是检测当你握住扳手超过一个固定值(0.1,可调)时即触发的状态。相当于利用Trigger的变化量来做一个功能的触发,很棒不是吗。轻轻碰一下Trigger使得行程大于0.1即可触发一个功能。

    整个脚本的执行顺序如下:

    Update();Input()初始化16个设备的信息存储空间,并返回某个设备;Device.Update():做两件事

    根据ETrackingResult的结果得到下面三个参数:

    transform:获取的结果是包含12个元素的一维数组,通过SteamVR_Utils.RigidTransform函数将12个元素重组为3X4矩阵并针对Unity的坐标系进行修正,同时添加了对position和rotation方便的引用。

    velocity和angularVelocity:这两个速度也针对Unity的坐标系进行修正,lighthouse跟踪的空间轴方向与Unity存在偏差。

    • UpdateHairTrigger()。检测自定义的一种操作:轻按Trigger。
      关于DeviceRelation和GetDeviceIndex()没有太多解释,可以深入挖一挖如何使用。

    ButtonMusk及其他地方有用到很多按位进行的操作,可以补充一下相关知识。

    Unity环境下空间坐标轴的修正原理没有研究:Unity使用的是左手坐标系,lighthouse的结果应该是右手坐标系,所以才会有速度的z分量相反和角速度x、y分量相反的结果。

    ?