steamVR

  • 动作(Action)
  • 获取Boolean类型的动作
  • 获取Vector1类型的动作
  • 获取Pose类型
  • 振动输出


动作(Action)

0.SteamVR2.0将动作抽象为6种类型:Boolean、Single、Vector2、Vector3、Pose、Skeleton等类型;

1.[Boolean]类型的动作代表只有两种状态的动作:True或False,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态;(在Unity中对应类为:SteamVR_Action_Boolean);

2.[Single]类型的动作能够返回0~1之间的数值,比如Trigger键按下到松开的过程;(在Unity中对应类为:SteamVR_Action_Single);

3.[Vector2]类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆;使用这样的数值能够控制物体在四个方向的运动,典型的应用是使用Touchpad控制无人机或小车的运动;(在Unity中对应类为:SteamVR_Action_Vector2);

4.[Vector3]类型的动作能够返回三维数值;(在Unity中对应类为SteamVR_Action_Vector3);

5.[Pose]类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器;(在Unity中对应类为SteamVR_Action_Pose);

6.[Skeleton]类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像Leap Motion等设备获取手指输入那样精确,但是足以获得良好的沉浸感;(在Unity中对应类为:SteamVR_Action_Skeleton);

获取Boolean类型的动作

这里用GrabGrip这个动作举例(其他的都一样)

void Start()
{
SteamVR_Actions.default_GrabGrip.onStateDown += Default_GrabGrip_onStateDown;
}
private void Default_GrabGrip_onStateDown
(SteamVR_Action_Boolean fromAction, SteamVR_Input_Sources fromSource)
{
Debug.Log(fromSource);
}

简单解释一下(后面就不再解释了),Actions是动作集的意思。steamVR给了四个动作集。default是其中一个动作集的名称。default_GrabGrip是指default这个动作集下面叫GrabGrip的动作,onStateDown表示按键按下。

unity3d 车辆和地面晃动_unity3d 车辆和地面晃动


当按下手柄上对应GrabGrip键时就会执行Default_GrabGrip_onStateDown这个方法。

或者可以这么写

if(SteamVR_Actions.default_GrabGrip.GetStateDown(SteamVR_Input_Sources.LeftHand))
{
Debug.Log(“Left GrabGrip”);
}

当按下左手柄的对应按键时就会在控制台输出“Left GrabGrip“(右手柄同理)

也可以这么写

if(SteamVR_Actions.default_GrabGrip.stateDown)
{
Debug.Log(“GrabGrip”);
}

用第一或第三种方法的时候,如果想要区分左右手柄的输入还得再加一个判断

//左手
if(SteamVR_Actions.default_GrabGrip.activeDevice == SteamVR_Input_Sources.LeftHand)
//右手
if(SteamVR_Actions.default_GrabGrip.activeDevice == SteamVR_Input_Sources.RightHand)

获取Vector1类型的动作

Vector1是Single类型的变量(能够返回0~1之间的数值)
这里用Squeeze这个动作举例

void Start()
{
SteamVR_Actions.default_Squeeze.onAxis += Default_Squeeze_onAxis;
}
private void Default_Squeeze_onAxis
(SteamVR_Action_Single fromAction, SteamVR_Input_Sources fromSource, float newAxis, float newDelta)
{
Debug.Log(“newAxis” + newAxis + " newDelta" + newDelta);
}

newAxis表示当前的值,newDelta是一个当前值与上一个值之间的差值

可以把onAxis换成onChange.区别是,如果使用onChange的话当扳机键停留在某一位置不动时就不会触发.如果使用onAxis的话只要扳机键在扳动的状态就会触发.
另一种方法:

SteamVR_Actions.default_Squeeze.GetAxis(SteamVR_Input_Sources.LeftHand)

这样可以直接获取对应手柄的值

获取Pose类型

if(SteamVR_Actions.default_Pose.activeDevice == SteamVR_Input_Sources.LeftHand)
Debug.Log
(SteamVR_Actions.default_Pose.localPosition+ " " + SteamVR_Actions.default_Pose.localRotation);

这样可以直接在控制台输出左手柄的位置和旋转的角度

或者可以用这种方式在控制台输出左手柄的位置和旋转角度

Debug.Log(SteamVR_Actions.default_Pose.GetLocalPosition(SteamVR_Input_Sources.LeftHand));
Debug.Log(SteamVR_Actions.default_Pose.GetLocalRotation(SteamVR_Input_Sources.LeftHand));

振动输出

//振动输出
SteamVR_Actions.default_Haptic.Execute
(float secondsFromNow, float durationSeconds, float frequency, float amplitude, SteamVR_Input_Sources inputSource);

  1. 第一个参数表示震动条件被触发时隔多久开始震动(设置为0就是立即震动)
  2. 第二个参数表示震动的时间
  3. 第三个参数表示震动频率(0-320hz)
  4. 第四个参数表示震动强度(0-1之间)
  5. 第五个参数表示哪个手柄震动