文章转自:http://www.cnblogs.com/czaoth/p/5610883.html
研究了几天htc vive的接口,总算是把基本的按键功能研究出来了,这里分享一下,一来当做笔记,二来也希望对大家有所帮助。
如何导入Steam_VR那个包什么的我就不说了,网上有几个前辈已经教了,蛮牛论坛啥的上面都有,这里只把比较详细的按键功能分享一下,不知啥高端的东西,也算一段时间劳动成果啦,所以转载的帮我留个名写个转,谢谢啦。
个人感觉手柄上开始比较难搞明白的就是那个圆盘键,这个键是一个以中心为(0,0)点的直角坐标系,四个端长度都是1,可接收触摸和按压两种事件,大体就是下图这个意思(手绘水平略渣,见谅见谅),触摸touch或按压press会通过GetAxis方法返回一个坐标系中的点,可以判断你按在哪里,触发不同的事件,可以根据角度或各种方法来切分按键为n个按钮(就像切蛋糕一样)
这里用的是C#脚本 ,直接上代码了,我个人写注释比较话唠,适合新手看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 |
using UnityEngine; using System.Collections; //检测手柄功能的脚本 这个脚本挂到手柄上(controler(right)和controler(left))上 public class ButtonTouchAction : 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); } */ //同样是三种按键方式,以后不做赘述 if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) { Debug.Log("按了 “trigger” “扳机键”"); //右手震动 //拉弓类似操作应该就是按住trigger(扳机)gettouch时持续调用震动方法模拟弓弦绷紧的感觉。 var deviceIndex2 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost); SteamVR_Controller.Input(deviceIndex2).TriggerHapticPulse(500); } if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger)) { Debug.Log("按下了 “trigger” “扳机键”"); } if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) { Debug.Log("松开了 “trigger” “扳机键”"); //左手震动 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” “系统按钮/Steam”"); } if (device.GetPressDown(SteamVR_Controller.ButtonMask.System)) { Debug.Log("用press按下了 “System” “系统按钮/Steam”"); } //ApplicationMenu键 带菜单标志的那个按键(在方向圆盘上面) if (device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu)) { Debug.Log("按下了 “ApplicationMenu” “菜单键”"); } if (device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu)) { Debug.Log("用press按下了 “ApplicationMenu” “菜单键”"); } //Grip键 两侧的键 (vive雇佣兵游戏中的换弹键),每个手柄左右各一功能相同,同一手柄两个键是一个键。 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip)) { Debug.Log("按下了 “Grip” “ ”"); } if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip)) { Debug.Log("用press按下了 “Grip” “ ”"); } //Axis0键 与圆盘有交互 与圆盘有关 //触摸触发 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0)) { Debug.Log("按下了 “Axis0” “方向 ”"); } //按动触发 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0)) { Debug.Log("用press按下了 “Axis0” “方向 ”"); } //Axis1键 目前未发现按键位置 //触摸触发 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” “ ”"); } <pre name="code" class="csharp"> //方向圆盘: //这里开始区分了press检测与touch检测的不同之处,圆盘可以触摸,顾名思义,touch检测的是触摸,press检测的是按动<pre name="code" class="csharp"> //Axis0键 与圆盘有交互 与圆盘有关 //触摸触发 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0)) { Debug.Log("按下了 “Axis0” “方向 ”"); } //按动触发 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0)) { Debug.Log("用press按下了 “Axis0” “方向 ”"); } //Axis1键 目前未发现按键位置 //触摸触发 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” “ ”"); } //ATouchpad键 圆盘交互 //触摸触发 if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad)) { Debug.Log("按下了 “Touchpad” “ ”"); //方法返回一个坐标 接触圆盘位置 Vector2 cc = device.GetAxis(); Debug.Log(cc); // 例子:圆盘分成上下左右 float jiaodu = VectorAngle(new Vector2(1, 0), cc); Debug.Log(jiaodu); //下 if (jiaodu > 45 && jiaodu < 135) { Debug.Log("下"); } //上 if (jiaodu < -45 && jiaodu > -135) { Debug.Log("上"); } //左 if ((jiaodu < 180 && jiaodu > 135) || (jiaodu < -135 && jiaodu > -180)) { Debug.Log("左"); } //右 if ((jiaodu > 0 && jiaodu < 45) || (jiaodu > -45 && jiaodu < 0)) { Debug.Log("右"); } } //按动触发 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad)) { Debug.Log("用press按下了 “Touchpad” “ ”"); } } // 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; } } |
- 本文固定链接: http://www.u3d8.com/?p=568
- 转载请注明: 网虫虫 在 u3d8.com 发表过