VR开发笔记(一),HTC手柄类的介绍

本博文是自己开发VR项目从网上搜罗的一些关于代码的介绍教程,整理一波,方便以后使用。

SteamVR_Controller类:

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

ButtonMask类:手柄各按键的名称。

        //以下是API中复制出来的按键列表  
        /*       public class ButtonMask 
           { 
               public const ulong System = (1ul << (int)EVRButtonId.k_EButton_System); // reserved 
               public const ulong ApplicationMenu = (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu); 
               public const ulong Grip = (1ul << (int)EVRButtonId.k_EButton_Grip); 
               public const ulong Axis0 = (1ul << (int)EVRButtonId.k_EButton_Axis0); 
               public const ulong Axis1 = (1ul << (int)EVRButtonId.k_EButton_Axis1); 
               public const ulong Axis2 = (1ul << (int)EVRButtonId.k_EButton_Axis2); 
               public const ulong Axis3 = (1ul << (int)EVRButtonId.k_EButton_Axis3); 
               public const ulong Axis4 = (1ul << (int)EVRButtonId.k_EButton_Axis4); 
               public const ulong Touchpad = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad); 
               public const ulong Trigger = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Trigger); 
           } 
           */ 

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

 || GetPress:按下按键一直触发。

 || GetPressDown : 按下按键只触发一次。

 || GetPressUp : 抬起按键只触发一次。

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

 || GetTouch 触摸一直触发

 || GetTouchDown 触摸触发一次

 || GetTouchUp 抬起触发一次

针对TouchPad的三个函数,一样的两种形式,同上描述。

 || GetAxis() 

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

 || TriggerHapticPulse

手柄震动控制函数,参数名称解释的是时间,默认500,但实际上控制的是震动的强度。默认AxisId是EVRButtonId_touchpad,选择其他EVRButtonId没用(等价参数axis0可以),其回调用OpenVR中的同名函数。参数超过4000会无效,导致震动不触发。可以通过协程的while(true)+waitforsecond控制震动间隔,通过stop协程控制震动结束。

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


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

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

1.GetControllerStateWithPose()调用OpenVR中的函数获取手柄状态和姿态。结果存在这两个变量State(VRControllerState_t)和Pose(TrackedDevicePose_t)中,由GetState()和GetPose()获取并由此返回一系列的可查询参数及各种Get函数。

各可查询参数说明如下(相当于对TrackedDevicePose_t中的参数翻译了下)

valid: GetControllerStateWithPose()函数调用是否成功;

conneted:判断设备是否连接;

hasTracking:判断设备是否跟踪正常;

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

outOfRange:判断设备是否超出范围;

calibrating:判断设备是否正在校正;

uninitlalized:判断设备是否未初始化;

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

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

2.UpdateHairTrigger().检测自定义的一种操作:轻按Trigger.

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

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

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


猜你喜欢

转载自blog.csdn.net/qq1084327456/article/details/79423014
今日推荐