Unity HTC VIVE手柄 按键说明

一、HTC VIVE手柄按键图说明

1 - 菜单键

6 - 系统键(按下后手柄断开连接,再次按下手柄再次连接上)

7 - 扳机键

8 - 握持键

9 - 触摸板键

二、按键的监听方式

1、按键监听方式一:(SteamVR的方式,封装了OpenVR)

(1)点击触发:通过Device.GetPressDown / GetPressUp / GetPress获取按键事件

(2)触摸触发:通过device .GetTouchDown / GetTouchUp / GetTouch获取按键事件

2、按键监听方式二:(OpenVR的方式,偏底层)

通过controllerState.ulButtonPressed & (SteamVR_Controller.ButtonMask.Trigger)获取按键的按下、松开两种状态

 

或者:

注:m_State、m_PrevState分别表示:当前帧状态、前一帧状态

获取按下时,触摸板的值

获取松开时,触摸板的值(这里必须使用前一帧的状态,因为松开时,当前帧的触摸的值为0)

问题:按下时,没有获取到当前帧触摸板的值!

猜测原因:获取值的Update方法在更新状态Update的方法之前执行了,更新状态的Update方法执行后,才能获取触摸板的值

解决方法:如果不想修改脚本执行顺序的话,可以使用LateUpdate

触摸

  • 适用于触摸板键
  • 适用于扳机键(和点按类似,只是键程更短)

方式一:

方式二:

问题:触摸按下时,没有获取到当前帧触摸板的值!

原因:不明,内部机制需要搞清楚

解决办法:在触摸按下后的第二帧才获取到触摸板的值。

(3)触摸板轴的获取

通过以上两种方式获取的VRControllerState_t,获取触摸板的轴

x = state.rAxis0.x

y = state.rAxis0.y

三、代码使用总结如下

//检测手柄功能的脚本 这个脚本挂到手柄上(controller(right)和controller(left))上

public class HTCStick : MonoBehaviour {

//手柄

SteamVR_TrackedObject trackdeObjec;

void Awake ( ) {

//获取手柄上的这个组件

trackdeObjec = GetComponent<SteamVR_TrackedObject> ();

}

// Use this for initialization

void Start ( ) {

}

void FixedUpdate ( ) {   //获取手柄输入

var device = SteamVR_Controller.Input ((int)trackdeObjec.index);

//以下是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);

}

*/

//每种按键都有GetTouch、GetTouchDown、GetTouchUp、GetPressDown、GetPress、GetPressUp

//这里只有Trigger扳机键写了6种,其他的不再重复。

//Trigger的Touch触发条件是扳机键没有按到底,此时不会触发press。触发press时必定触发touch。

if (device.GetTouch (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("轻按了扳机键");

//右手震动

//拉弓类似操作应该就是按住trigger(扳机)gettouch时持续调用震动方法模拟弓弦绷紧的感觉。

var deviceIndex2 = SteamVR_Controller.GetDeviceIndex (SteamVR_Controller.DeviceRelation.Rightmost);

device.TriggerHapticPulse (1200);

}

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("轻按了扳机键");

}

if (device.GetTouchUp (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("松开了扳机键");

//左手震动

var deviceIndex = SteamVR_Controller.GetDeviceIndex (SteamVR_Controller.DeviceRelation.Leftmost);

SteamVR_Controller.Input (deviceIndex).TriggerHapticPulse (3000);

//右手震动

var deviceIndex1 = SteamVR_Controller.GetDeviceIndex (SteamVR_Controller.DeviceRelation.Rightmost);

SteamVR_Controller.Input (deviceIndex1).TriggerHapticPulse (3000);

}

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("用press按下了trigger扳机键");

}

if (device.GetPress (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("用press按了trigger扳机键");

}

if (device.GetPressUp (SteamVR_Controller.ButtonMask.Trigger)) {

Debug.Log ("用press松开了trigger扳机键");

}

//system键 圆盘下面那个键

// reserved 为Steam系统保留,用来调出Steam系统菜单 因此自己加的功能没用  下面的打印不会出现

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.System)) {

Debug.Log ("按下了system系统按钮");

}

if (device.GetPressDown (SteamVR_Controller.ButtonMask.System)) {

Debug.Log ("用press按下了系统按钮");

}

//ApplicationMenu键 带菜单标志的那个按键(在方向圆盘上面)

//ApplicationMenu键 的Touch和Press没有区别,触发都要按下去

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.ApplicationMenu)) {

Debug.Log ("按下了 ApplicationMenu菜单键");

}

if (device.GetPressDown (SteamVR_Controller.ButtonMask.ApplicationMenu)) {

Debug.Log ("用press按下了ApplicationMenu菜单键");

}

//Grip键 手柄两侧的按键 每个手柄左右各一且功能相同,同一手柄两个键是一个键。

//Grip键 的Touch和Press没有区别,触发都要按下去

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Grip)) {

Debug.Log ("按下了 Grip");

}

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Grip)) {

Debug.Log ("用press按下了 Grip");

}

//Axis0键和Touchpad是等价的 与圆盘有关 详情看下面的TouchPad这里不再赘述

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Axis0)) {

Debug.Log ("按下了 Axis0");

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Axis0)) {

Debug.Log ("用press按下了Axis0");

}

//Axis1键  等价于Trigger键详情看上面的Trigger按钮 这里不再赘述

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Axis1)) {

Debug.Log ("按下了Axis1");

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Axis1)) {

Debug.Log ("用press按下了Axis1");

}

//Axis2键 目前未发现按键位置

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Axis2)) {

Debug.Log ("按下了 Axis2");

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Axis2)) {

Debug.Log ("用press按下了Axis2");

}

//Axis3键  目前未发现按键位置

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Axis3)) {

Debug.Log ("按下了Axis3");

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Axis3)) {

Debug.Log ("用press按下了Axis3");

}

//Axis4键  目前未发现按键位置

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Axis4)) {

Debug.Log ("按下了Axis4");

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Axis4)) {

Debug.Log ("用press按下了Axis4");

}

//Touchpad键 圆盘交互

//触摸触发

if (device.GetTouchDown (SteamVR_Controller.ButtonMask.Touchpad)) {

Debug.Log ("按下了 Touchpad");

//方法返回一个坐标 接触圆盘位置

Vector2 cc = device.GetAxis ();

Debug.Log (cc);

// 例子:圆盘分成上下左右

float angle = VectorAngle (new Vector2 (1, 0), cc);

Debug.Log (angle);

//下

if (angle > 45 && angle < 135) {

Debug.Log ("下");

}

//上

if (angle < -45 && angle > -135) {

Debug.Log ("上");

}

//左

if ((angle < 180 && angle > 135) || (angle < -135 && angle > -180)) {

Debug.Log ("左");

}

//右

if ((angle > 0 && angle < 45) || (angle > -45 && angle < 0)) {

Debug.Log ("右");

}

}

//按动触发

if (device.GetPressDown (SteamVR_Controller.ButtonMask.Touchpad)) {

Debug.Log ("用press按下了Touchpad");

Vector2 cc = device.GetAxis ();

Debug.Log (cc);

}

}

// Update is called once per frame

void Update ( ) {

}

//方向圆盘最好配合这个使用 圆盘的.GetAxis()会检测返回一个二位向量,可用角度划分圆盘按键数量

//这个函数输入两个二维向量会返回一个夹角 180 到 -180

float VectorAngle (Vector2 from, Vector2 to) {

float angle;

Vector3 cross = Vector3.Cross (from, to);

angle = Vector2.Angle (from, to);

return cross.z > 0 ? -angle : angle;

}

}

时间: 2024-10-19 03:00:05

Unity HTC VIVE手柄 按键说明的相关文章

《图说VR》——HTC Vive控制器按键事件解耦使用

本文章由cartzhang编写,转载请注明出处. 全部权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/53915229 作者:cartzhang Unity的 Steam VR插件本身也带有事件处理.可是我还想把事件给解耦出来,这样方便在各个项目中,不用关心硬件的各种处理而只用关心使用的,且能够随意的通过接受事件来触发对应的操作. 项目的參考图片可下载地址:https://github.com/cartzhang/ImgSayV

用Unity开发HTC VIVE——手柄控制篇

写这篇文章的原因主要是因为现在虚拟现实非常的火爆但目前主流的虚拟现实设备(HTC VIVE)的教程却少的可怜,这个我深有体会.所以,我想将我平时开发中遇到的问题以及解决方法记录下来,分享给大家,若其中有什么错误或者大家有什么更好的方案也请大家指出,大家互相学习,哈哈. 好了直接上代码. using UnityEngine; using System.Collections; public class shoubingkongzhi : MonoBehaviour { /// /// 手柄 ///

GJM:Unity开发HTC vive 三、远处拖动3D物体 【转载】

腾讯GAD 窗间风月 原文URL : http://gad.qq.com/article/detail/7192223 版权所有,禁止匿名转载:禁止商业使用:禁止个人使用. 在项目中会需要拖动远处的物体,这种要如何去实现,下面就给大家介绍下在Unity HTC vive开发中远处拖动3D物体的教程. 效果如下,手柄射线照射到3D物体的时候,可以通过Trigger按钮抓住物体并拖动 1.导入SDK:SteamVR Plugin和Vive Input Utility 2.删除场景中的默认摄像机,将C

如何透过HTC Vive拍摄Mixed Reality (混合现实)影片

https://www.vive.com/cn/forum/1706?extra=page%3D1 也许你是一位开发者,想为自己的HTC Vive游戏制作酷炫的宣传片:或者你是游戏主播,想为观众带来高质量的VR直播体验:甚至你是一位VR的爱好者.无论如何,如果你对Mixed Reality(混合现实)感兴趣,请继续看下去.本文将介绍如何用HTC Vive拍摄高质量MR视频. ======================================================== 什么是M

Unity的HTC VIVE SDK研究(手柄按键功能的研究,比较详细)

http://blog.csdn.net/ystistheking/article/details/51553237 想交流的朋友我们可以微博互粉,我的微博黑石铸造厂厂长 ,缺粉丝啊 .....求粉求粉 研究了几天htc vive的接口,总算是把基本的按键功能研究出来了,这里分享一下,一来当做笔记,二来也希望对大家有所帮助. 如何导入Steam_VR那个包什么的我就不说了,网上有几个前辈已经教了,蛮牛论坛啥的上面都有,这里只把比较详细的按键功能分享一下,不知啥高端的东西,也算一段时间劳动成果啦,

HTC vive开发:关于手柄按键

一.关于左右手柄的对应关系 两个手柄和SteamVR_TrackedObject.EIndex是对应的,一个是EIndex.Device2,另一个是EIndex.Device3(有编号的那个) 在场景中手柄先后连入,先后激活的是Controller(right).Controller(left),并添加SteamVR_TrackedObject组件 二.手柄按键 1 - 菜单键 6 - 系统键(按下后手柄断开连接,再次按下手柄再次连接上) 7 - 扳机键 8 - 握持键 9 - 触摸板键 (1)

HTC Vive Unity 教程

原文:HTC Vive Tutorial for Unity 作者:Eric Van de Kerckhove 译者:kmyhy HTC Vive 是一个虚拟现实头盔,由 HTC 和 Valve 公司制造.它提供一种在虚拟世界中的浸入式体验,而不是屏幕头像. 如果你是一个 Unity 开发者,在虚拟现实游戏中使用 HTC Vive 非常简单--你可以认为 HTC Vive 和 Unity 是天生一对. 在这篇 HTC Vive 教程中,你会学习如何在 Unity 游戏中集成 HTC Vive.包

Unity 5.4大赞:HTC Vive经典The lab渲染器开源

HTC Vive提供了一个不错的免费VR demo,最近1周仔细体验了一番. 仔细看了其安装文件,竟然是Unity 5.4beta版本(通过查log,知道Valve公司用的是最新的5.4.0b11版本开发的),的确令人信心大振: 要知道,某些创业公司为了打差异化竞争,提高技术门槛,对外称Unreal 4的画质比Unity 5优秀很多,这让很多在Unity技术栈下的公司有些郁闷–多年来Unity画质始终不如Unreal逼格高啊. The Lab 程序路径:Steam\steamapps\commo

htc vive 游戏切换武器功能思路以及demo(unity,c#)

</pre>个人感觉vr游戏或者展示类程序的灵魂就是真实感以及身临其境的感觉,如果场景中加入了大量的ui会破坏真实感,影响感觉,因此我觉得ui这种东西在vr里应该尽量转化为现实物体,比如显示屏,按钮等,一来增加了交互,二来也在增加真实感的同时也实现了ui的功能.<span style="font-family:黑体; word-wrap:break-word; color:rgb(105,105,105); font-size:16px; line-height:25px&qu