zoukankan      html  css  js  c++  java
  • Unity的HTC VIVE SDK研究(手柄按键功能的研究,比较详细)

    研究了几天htc vive的接口,总算是把基本的按键功能研究出来了,这里分享一下,一来当做笔记,二来也希望对大家有所帮助。

    如何导入Steam_VR那个包什么的我就不说了,网上有几个前辈已经教了,蛮牛论坛啥的上面都有,这里只把比较详细的按键功能分享一下,不知啥高端的东西,也算一段时间劳动成果啦,所以转载的帮我留个名写个转,谢谢啦。

    个人感觉手柄上开始比较难搞明白的就是那个圆盘键,这个键是一个以中心为(0,0)点的直角坐标系,四个端长度都是1,可接收触摸和按压两种事件,大体就是下图这个意思(手绘水平略渣,见谅见谅),触摸touch或按压press会通过GetAxis方法返回一个坐标系中的点,可以判断你按在哪里,触发不同的事件,可以根据角度或各种方法来切分按键为n个按钮(就像切蛋糕一样)

     

    这里用的是C#脚本 ,直接上代码了,我个人写注释比较话唠,适合新手看:

    [csharp] view plain copy
     
    1. using UnityEngine;  
    2. using System.Collections;  
    3. //检测手柄功能的脚本 这个脚本挂到手柄上(controler(right)和controler(left))上  
    4. public class ButtonTouchAction : MonoBehaviour {  
    5.     //手柄  
    6.     SteamVR_TrackedObject trackdeObjec;  
    7.   
    8.     void Awake() {  
    9.         //获取手柄上的这个组件  
    10.         trackdeObjec = GetComponent<SteamVR_TrackedObject>();  
    11.     }  
    12.     // Use this for initialization  
    13.     void Start () {     
    14.     }  
    15.     void FixedUpdate()  
    16.     {   //获取手柄输入  
    17.         var device = SteamVR_Controller.Input((int)trackdeObjec.index);  
    18.         //以下是api中复制出来的按键列表  
    19.         /*       public class ButtonMask 
    20.            { 
    21.                public const ulong System = (1ul << (int)EVRButtonId.k_EButton_System); // reserved 
    22.                public const ulong ApplicationMenu = (1ul << (int)EVRButtonId.k_EButton_ApplicationMenu); 
    23.                public const ulong Grip = (1ul << (int)EVRButtonId.k_EButton_Grip); 
    24.                public const ulong Axis0 = (1ul << (int)EVRButtonId.k_EButton_Axis0); 
    25.                public const ulong Axis1 = (1ul << (int)EVRButtonId.k_EButton_Axis1); 
    26.                public const ulong Axis2 = (1ul << (int)EVRButtonId.k_EButton_Axis2); 
    27.                public const ulong Axis3 = (1ul << (int)EVRButtonId.k_EButton_Axis3); 
    28.                public const ulong Axis4 = (1ul << (int)EVRButtonId.k_EButton_Axis4); 
    29.                public const ulong Touchpad = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Touchpad); 
    30.                public const ulong Trigger = (1ul << (int)EVRButtonId.k_EButton_SteamVR_Trigger); 
    31.            } 
    32.            */  
    33.   
    34.            //同样是三种按键方式,以后不做赘述  
    35.         if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) {  
    36.             Debug.Log("按了 “trigger” “扳机键”");  
    37.              
    38.             //右手震动  
    39.             //拉弓类似操作应该就是按住trigger(扳机)gettouch时持续调用震动方法模拟弓弦绷紧的感觉。  
    40.             var deviceIndex2 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);  
    41.             SteamVR_Controller.Input(deviceIndex2).TriggerHapticPulse(500);  
    42.   
    43.         }  
    44.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))  
    45.         {   Debug.Log("按下了 “trigger” “扳机键”");  
    46.   
    47.         }  
    48.         if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) {  
    49.             Debug.Log("松开了 “trigger” “扳机键”");  
    50.             
    51.             //左手震动  
    52.             var deviceIndex = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);  
    53.             SteamVR_Controller.Input(deviceIndex).TriggerHapticPulse(3000);  
    54.              
    55.             //右手震动  
    56.             var deviceIndex1 = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);  
    57.             SteamVR_Controller.Input(deviceIndex1).TriggerHapticPulse(3000);  
    58.         }  
    59.   
    60.         //这三种也能检测到 后面不做赘述  
    61.         if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) {  
    62.             Debug.Log("用press按下了 “trigger” “扳机键”");  
    63.         }  
    64.         if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))  
    65.         {  
    66.             Debug.Log("用press按了 “trigger” “扳机键”");  
    67.         }  
    68.         if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))  
    69.         {  
    70.             Debug.Log("用press松开了 “trigger” “扳机键”");  
    71.         }  
    72.   
    73.         //system键 圆盘下面那个键   
    74.         // reserved 为Steam系统保留,用来调出Steam系统菜单 因此貌似自己加的功能没啥用  
    75.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.System))  
    76.         {  
    77.             Debug.Log("按下了 “system” “系统按钮/Steam”");  
    78.         }  
    79.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.System))  
    80.         {  
    81.             Debug.Log("用press按下了 “System” “系统按钮/Steam”");  
    82.         }  
    83.   
    84.         //ApplicationMenu键 带菜单标志的那个按键(在方向圆盘上面)  
    85.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
    86.         {  
    87.             Debug.Log("按下了 “ApplicationMenu” “菜单键”");  
    88.         }  
    89.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu))  
    90.         {  
    91.             Debug.Log("用press按下了 “ApplicationMenu” “菜单键”");  
    92.         }  
    93.   
    94.         //Grip键 两侧的键 (vive雇佣兵游戏中的换弹键),每个手柄左右各一功能相同,同一手柄两个键是一个键。  
    95.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip))  
    96.         {  
    97.             Debug.Log("按下了 “Grip” “ ”");  
    98.         }  
    99.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip))  
    100.         {  
    101.             Debug.Log("用press按下了 “Grip” “ ”");  
    102.         }  
    103.   
    104.    
    105.           
    106.         //Axis0键 与圆盘有交互 与圆盘有关  
    107.         //触摸触发  
    108.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))  
    109.         {  
    110.             Debug.Log("按下了 “Axis0” “方向 ”");  
    111.         }  
    112.         //按动触发  
    113.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))  
    114.         {  
    115.             Debug.Log("用press按下了 “Axis0” “方向 ”");  
    116.         }  
    117.   
    118.         //Axis1键  目前未发现按键位置  
    119.         //触摸触发  
    120.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))  
    121.         {  
    122.             Debug.Log("按下了 “Axis1” “ ”");  
    123.         }  
    124.         //按动触发   
    125.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))  
    126.         {  
    127.             Debug.Log("用press按下了 “Axis1” “ ”");  
    128.         }  
    129.   
    130.         //Axis2键 目前未发现按键位置  
    131.         //触摸触发  
    132.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))  
    133.         {  
    134.             Debug.Log("按下了 “Axis2” “ ”");  
    135.         }  
    136.         //按动触发  
    137.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))  
    138.         {  
    139.             Debug.Log("用press按下了 “Axis2” “ ”");  
    140.         }  
    141.   
    142.         //Axis3键  未目前未发现按键位置  
    143.         //触摸触发  
    144.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))  
    145.         {  
    146.             Debug.Log("按下了 “Axis3” “ ”");  
    147.         }  
    148.         //按动触发  
    149.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))  
    150.         {  
    151.             Debug.Log("用press按下了 “Axis3” “ ”");  
    152.         }  
    153.   
    154.         //Axis4键  目前未发现按键位置  
    155.         //触摸触发  
    156.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))  
    157.         {  
    158.             Debug.Log("按下了 “Axis4” “ ”");  
    159.         }  
    160.         //按动触发  
    161.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))  
    162.         {  
    163.             Debug.Log("用press按下了 “Axis4” “ ”");  
    164.         }  
    165.   
    166. <pre name="code" class="csharp">       //方向圆盘:  
    167.         //这里开始区分了press检测与touch检测的不同之处,圆盘可以触摸,顾名思义,touch检测的是触摸,press检测的是按动<pre name="code" class="csharp"> //Axis0键 与圆盘有交互 与圆盘有关  
    168.         //触摸触发  
    169.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))  
    170.         {  
    171.             Debug.Log("按下了 “Axis0” “方向 ”");  
    172.         }  
    173.         //按动触发  
    174.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))  
    175.         {  
    176.             Debug.Log("用press按下了 “Axis0” “方向 ”");  
    177.         }  
    178.   
    179.         //Axis1键  目前未发现按键位置  
    180.         //触摸触发  
    181.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis1))  
    182.         {  
    183.             Debug.Log("按下了 “Axis1” “ ”");  
    184.         }  
    185.         //按动触发   
    186.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis1))  
    187.         {  
    188.             Debug.Log("用press按下了 “Axis1” “ ”");  
    189.         }  
    190.   
    191.         //Axis2键 目前未发现按键位置  
    192.         //触摸触发  
    193.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis2))  
    194.         {  
    195.             Debug.Log("按下了 “Axis2” “ ”");  
    196.         }  
    197.         //按动触发  
    198.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis2))  
    199.         {  
    200.             Debug.Log("用press按下了 “Axis2” “ ”");  
    201.         }  
    202.   
    203.         //Axis3键  未目前未发现按键位置  
    204.         //触摸触发  
    205.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis3))  
    206.         {  
    207.             Debug.Log("按下了 “Axis3” “ ”");  
    208.         }  
    209.         //按动触发  
    210.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis3))  
    211.         {  
    212.             Debug.Log("用press按下了 “Axis3” “ ”");  
    213.         }  
    214.   
    215.         //Axis4键  目前未发现按键位置  
    216.         //触摸触发  
    217.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis4))  
    218.         {  
    219.             Debug.Log("按下了 “Axis4” “ ”");  
    220.         }  
    221.         //按动触发  
    222.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis4))  
    223.         {  
    224.             Debug.Log("用press按下了 “Axis4” “ ”");  
    225.         }  
    226.   
    227.   
    228.         //ATouchpad键 圆盘交互  
    229.         //触摸触发  
    230.         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad))  
    231.         {     
    232.             Debug.Log("按下了 “Touchpad” “ ”");  
    233.               
    234.             //方法返回一个坐标 接触圆盘位置  
    235.             Vector2 cc = device.GetAxis();  
    236.             Debug.Log(cc);  
    237.             // 例子:圆盘分成上下左右  
    238.             float jiaodu = VectorAngle(new Vector2(1, 0), cc);  
    239.             Debug.Log(jiaodu);  
    240.             //下  
    241.             if (jiaodu > 45 && jiaodu < 135)  
    242.             {  
    243.                 Debug.Log("下");  
    244.             }  
    245.             //上  
    246.             if (jiaodu < -45 && jiaodu > -135)  
    247.             {  
    248.                 Debug.Log("上");  
    249.             }  
    250.             //左  
    251.             if ((jiaodu < 180 && jiaodu > 135) || (jiaodu < -135 && jiaodu > -180))  
    252.             {  
    253.                 Debug.Log("左");  
    254.             }  
    255.             //右  
    256.             if ((jiaodu > 0 && jiaodu < 45) || (jiaodu > -45 && jiaodu < 0))  
    257.             {  
    258.                 Debug.Log("右");  
    259.             }  
    260.         }  
    261.         //按动触发  
    262.         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad))  
    263.         {  
    264.             Debug.Log("用press按下了 “Touchpad” “ ”");  
    265.         }  
    266.   
    267.          
    268.   
    269.   
    270.   
    271.     }  
    272.         // Update is called once per frame  
    273.         void Update () {  
    274.       
    275.     }  
    276.     //方向圆盘最好配合这个使用 圆盘的.GetAxis()会检测返回一个二位向量,可用角度划分圆盘按键数量  
    277.     //这个函数输入两个二维向量会返回一个夹角 180 到 -180  
    278.     float VectorAngle(Vector2 from, Vector2 to)  
    279.     {  
    280.         float angle;  
    281.         Vector3 cross = Vector3.Cross(from, to);  
    282.         angle = Vector2.Angle(from, to);  
    283.         return cross.z > 0 ? -angle : angle;  
    284.     }  
    285. }  
  • 相关阅读:
    Balanced Binary Tree
    Swap Nodes in Pairs
    Reverse Nodes in k-Group
    Reverse Linked List II
    Remove Nth Node From End of List
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Partition List
    Merge Two Sorted Lists
    【Yii2.0】1.2 Apache检查配置文件语法
  • 原文地址:https://www.cnblogs.com/czaoth/p/5610883.html
Copyright © 2011-2022 走看看