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表示按键按下。
当按下手柄上对应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);
- 第一个参数表示震动条件被触发时隔多久开始震动(设置为0就是立即震动)
- 第二个参数表示震动的时间
- 第三个参数表示震动频率(0-320hz)
- 第四个参数表示震动强度(0-1之间)
- 第五个参数表示哪个手柄震动