HTCVive使用

1.設備的安裝與配置 https://wenku.baidu.com/view/fa172fd7482fb4daa48d4b44.html?from=searchhtml

2.接入SDK、實現簡單示例場景、更換手柄模型、實現手柄投擲功能
  導入SteamVR Plugin.unitypackage
  實現頭盔觀看功能
  更換手柄模型
    要點
      把物體拖到model同級目錄,座標歸零
      在運行狀態下調整模型的大小座標和旋轉值
      複製組件value,而後取消運行,粘貼value到物體上
  實現手柄投擲功能
    按下trigger鍵在手柄上生成一個物體,鬆開trigger鍵投擲出去測試

3.手柄腳本講解
  手柄上各按鍵的輸入
    扳機鍵:trigger
    菜單鍵(三橫)menu:
    側邊鍵(兩個同樣):grip
    圓盤(可點可觸摸):touchpadspa

  1 using UnityEngine;
  2 using System.Collections;
  3 using Valve.VR;
  4 using UnityEngine.iOS;
  5 using System.Runtime.CompilerServices;
  6 
  7 public delegate void VRHandle();
  8 
  9 
 10 
 11 public class VRInput : MonoBehaviour
 12 {
 13 
 14     SteamVR_TrackedObject trackedObject;//獲取手柄對象
 15     SteamVR_Controller.Device device;//定義手柄信息對象
 16 
 17     public VRHandle onTrigger;
 18     public VRHandle onTriggerDown;
 19     public VRHandle onTriggerUp;
 20 
 21     void Start()
 22     {
 23         // 首先要獲取響應按鍵的設備
 24         trackedObject = GetComponent<SteamVR_TrackedObject>();
 25         device = SteamVR_Controller.Input((int)trackedObject.index);
 26     }
 27 
 28     Vector2 startPoint;
 29     Vector2 endPoint;
 30     //獲取觸摸偏移 ,旋轉左手零件庫,小部件什麼的。 
 31     public float GetTouchPadDeltaPos(SteamVR_Controller.Device device)
 32     {
 33         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Axis0))
 34         {
 35             endPoint = startPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
 36         }
 37 
 38         //按下後滑動
 39         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0))
 40         {
 41 
 42             if ((device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad) - endPoint).sqrMagnitude > 0.01f)
 43             {
 44 
 45                 startPoint = endPoint;
 46 
 47                 endPoint = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
 48 
 49                 //Vector2 deltaVector = endPoint - startPoint;
 50                 //float deltaPosY = endPoint.y - startPoint.y;
 51 
 52                 float deltaPosX = endPoint.x - startPoint.x;
 53 
 54                 //使用delta
 55                 //device.TriggerHapticPulse (1000); // 用這個能夠震動手柄
 56                 //target.Rotate (0, 0, deltaPosX * 100);
 57                 return deltaPosX;
 58             }
 59         }
 60         return 0f;
 61     }
 62 
 63 
 64 
 65     void Update()
 66     {
 67 
 68         // Press 和 Touch 除了圓盤,其餘基本通用 Touch能夠直接響應圓盤
 69         // GetPressDown 和 GetTouchDown
 70         // GetPress 和 GetTouch  ___  相似鍵盤的GetKey
 71         // GetPressUp 和 GetTouchUp
 72         //如下不全寫了,不必,就主要以GetTouch 試一下全部按鈕
 73 
 74         //按下圓盤
 75 
 76         if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad))
 77         {
 78             //打印觸摸的位置
 79             print(device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad));
 80         }
 81 
 82         //  Trigger鍵 
 83         if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
 84         {
 85             Debug.Log("我是手柄上的trigger鍵,保持按下狀態");
 86             if (onTrigger!=null) {
 87                 onTrigger ();
 88             }
 89 
 90         }
 91 
 92         if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger))
 93         {
 94             Debug.Log("我是手柄上的trigger鍵,按下狀態");
 95             if (onTriggerDown!=null) {
 96                 onTriggerDown ();
 97             }
 98 
 99         }
100         if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger))
101         {
102             
103             Debug.Log("我是手柄上的trigger鍵,鬆開狀態");
104             if (onTriggerUp!=null) {
105                 onTriggerUp ();
106             }
107         }
108 
109         //觸摸圓盤
110         if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad))
111         {
112             Debug.Log("我是左手柄上的觸摸屏,手指保持觸摸狀態");
113         }
114 
115         // 菜單鍵 (三橫線)
116         if (device.GetTouch(SteamVR_Controller.ButtonMask.ApplicationMenu))
117         {
118             Debug.Log("我是手柄菜單鍵,保持按下狀態");
119         }
120 
121         //手心鍵(隨便取個名^^) 左右兩邊能夠按但實際上是一個鍵!
122         if (device.GetTouch(SteamVR_Controller.ButtonMask.Grip))
123         {
124             Debug.Log("我是左手柄左右側按鍵,保持按下狀態");
125         }
126 
127         // 這些鍵位都有了!! 好像還有個System鍵把!!能用嗎? 通過短期測試,不要用,沒效果不說,容易致使其餘的都不靈還要從新鏈接手柄!
128         //查看定義能夠知道:     public const ulong System= (1ul << (int)EVRButtonId.k_EButton_System); // reserved    reserved了,reserved什麼意思?保留! 不是留留給你的 ^ ^!
129         if (device.GetTouch(SteamVR_Controller.ButtonMask.System))
130         {
131             print("你看不見我!");
132         }
133 
134         //如下三個獲取 追蹤設備的姿態(矩陣等信息),按鍵的狀態等等,請自行研究,歡迎回帖補充
135         device.GetPose();
136         device.GetState();
137         device.GetPrevState();
138 
139         //還沒完!繼續
140         // vive 有個Trigger鍵,有必定鍵程,那麼你按下這個trigger到什麼程度會觸發呢?
141         //通過測試,大概是 75%的樣子!!(why?爲何要研究這個,有意義麼? Of Course!)
142         // 由於 device.GetHairTrigger(), hairTrigger:一觸即發的意思!就是說Trigger鍵你能夠輕輕一碰就能觸發!
143         if (device.GetHairTriggerDown())
144         {
145             print("看到我時,食指不要動,看你按到了多少?");
146         }
147         // 你確定按了0.1,也就是10%的鍵程,我怎麼知道?
148         //print("由於你按了:" + device.hairTriggerDelta);
149         // 那麼,修改了hairTriggerDelta,是否是就修改了 一觸即發的鍵程? √
150 
151         //修改一觸即發鍵程爲一半,再按按試試看!
152         if (Input.GetKeyDown(KeyCode.A))
153         {
154             device.hairTriggerDelta = 0.5f;
155         }
156 
157 
158         // 最後!
159         //Axis,軸
160         //經測試,Axis0對應的是圓盤SteamVR_Controller.ButtonMask.Touchpad ,均可以用
161         //Axis1,對應的是trigger鍵位!
162         // 在SteamVR_Controller.ButtonMask類裏面定義了還有2,3,4Axis呢,它們對於啥呢?
163         //它們不對應啥,猜測一:這個是SteamVR!,又不是隻給火腿腸vive專用,還有其餘VR設備呢,若是其餘設備手柄軸用的多呢?
164         // 二:Axis2,3,4能對應菜單鍵和手心鍵嗎?no no no , 感覺一下軸和按鈕的區別就明白了,軸通常是範圍值,button是yes or no;
165 
166 
167         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis0))
168         {
169             Debug.Log("觸摸盤");
170         }
171         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis1))
172         {
173             Debug.Log("trigger鍵");
174         }
175         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis2))
176         {
177 
178         }
179         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis3))
180         {
181 
182         }
183         if (device.GetTouch(SteamVR_Controller.ButtonMask.Axis4))
184         {
185 
186         }
187 
188     }
189 
190 
191     //把圓盤劃成4個象限區域按鈕,強行用圓盤變出一些按鈕以防按鈕不夠用!
192     public enum TouchPadButton
193     {
194         Default,
195         UpLeft,
196         UpRight,
197         DowmLeft,
198         DownRight
199     }
200 
201     public TouchPadButton GetTouchButton()
202     {
203         TouchPadButton touchButton = TouchPadButton.Default;
204         var device = SteamVR_Controller.Input((int)trackedObject.index);
205 
206         if (device.GetPressDown(SteamVR_Controller.ButtonMask.Axis0))
207         {
208 
209             Vector2 pad = device.GetAxis(EVRButtonId.k_EButton_SteamVR_Touchpad);
210             if (pad.x >= 0 && pad.y >= 0)
211             {
212                 touchButton = TouchPadButton.UpRight;
213             }
214 
215             if (pad.x >= 0 && pad.y <= 0)
216             {
217                 touchButton = TouchPadButton.DownRight;
218             }
219 
220             if (pad.x <= 0 && pad.y >= 0)
221             {
222                 touchButton = TouchPadButton.UpLeft;
223             }
224 
225             if (pad.x <= 0 && pad.y <= 0)
226             {
227                 touchButton = TouchPadButton.DowmLeft;
228             }
229 
230         }
231         return touchButton;
232     }
233 }

 

4.手柄圓盤鍵的自定義劃分
  將一個觸摸板按照4象限劃分紅4個按鍵
    經過座標軸值來劃分
  將一個觸摸板按照4象限旋轉45度劃分紅4個按鍵
    經過斜率值或角度來劃分插件

 

5.UI交互
  1.插件:Vive Input Utility.unitypackage 導入
  2.文檔
    3DUI.docxcode

 

6.瞬移
  1.插件:Vive - teleport.unitypackage 導入
  2.使用文檔
    瞬移.docxhtm

相關文章
相關標籤/搜索