HTC View 手柄操作簡介
核心類簡介:
SteamVR_TrackedObject
此類用于根據硬件設備,并為硬件設備分配相應的索引
SteamVR_Controller.Device
最重要的類,封裝了跟蹤設備的全部信息,例如手柄的各種交互相應勾動扳機等。
SteamVR_Controller.ButtonMask
手柄各按鍵的名稱
SteamVR_Controller
此類通常使用靜態方法Input根據設備索引值獲取對應的設備(Device)對象
HTC View 手柄按鍵簡介:
每個按鈕的名稱都在ButtonMask中定義好了:
public class SteamVR_Controller { 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); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
實際上在SteamVR_TrackedObject類枚舉類型EIndex中,已經預先定義了16個設備索引,頭盔默認索引為0
using UnityEngine; using Valve.VR; public class SteamVR_TrackedObject : MonoBehaviour { public enum EIndex { None = -1, Hmd = (int)OpenVR.k_unTrackedDeviceIndex_Hmd, Device1, Device2, Device3, Device4, Device5, Device6, Device7, Device8, Device9, Device10, Device11, Device12, Device13, Device14, Device15 } }
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
簡單示例:
1,通過手柄游戲對象上的SteamVR_TrackedObject組件進行獲取,,,
//獲取跟蹤對象 此時通過trackObj.index 就可以訪問到設備對象
SteamVR_TrackedObject trackObj = this.GetComponent
1
2
2,通過找到索引獲取到設備(Device)對象,
這時就用到了SteamVR_Controller.Input方法傳入上面獲取的到設備索引,就可以訪問到設備中的方法,相應手柄操作,,,
//通過設備索引獲取到相應設備對象Device SteamVR_Controller.Device device= SteamVR_Controller.Input((int)trackObj.index);
1
2
3,調用Divice中的相應函數,來獲取手柄的按鍵操作,,,
按鍵: Device.GetPressDown(按下) / GetPressUp(抬起) / GetPress(一直按)
觸摸鍵:Device.GetTouchDown / GetTouchUp / GetTouch
void Update { //按下Tigger鍵 if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger) { Debug.Log("您按下了Trigger"); } }
1
2
3
4
5
6
7
8
觸摸板:
通過獲取用戶觸摸操作,然后根據當前的狀態進行獲取,,,Touchpad圓盤坐標是和平面直角坐標系一致,,上下和左右都是(-1,1)值,,,
void Update { //按下Touchpad鍵 if(device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad) { Debug.Log("您按下了Touchpad"); } }
1
2
3
4
5
6
7
8
手柄的震動: TriggerHapicPulse
手柄震動是通過TriggerHapicPulsefangf ,第一個參數可以理解為震動強度,默認500,不要超過4000,,第二個參數默認就好,不用填寫
簡例:按下Trigger觸發震動:
private SteamVR_Controller.Device device; void Strar(){ //獲取設備 device = SteamVR_Contorller.Input((int)GetComponent
1
2
3
4
5
6
7
8
9
10
11
Device常用屬性:
valid:GetControllerStateWithPose() 函數調用是否成功;
connected:判斷設備是否連接
hasTracking :判斷設備是否正常跟蹤
結果得到三個參數:
outOfRange:判斷設備是否超出范圍
calibrating:判斷設備是否正在校正
uninitialized:判斷設備是否未初始化
transform:獲取的結果是包含12個元素的一維數組,通過SteamVR_Utils.RigidTransform函數將12元素重組為3×4的矩陣針對Unity的坐標系進行修正,同時添加了懟position和rotation的方便的引用
velocity和angularVelocity:兩個速度也針對Unity的坐標系進行修正,Lighthouse跟蹤的空間軸方向與Unity存在偏差,,,
上面描述所對應的SteamVR插件中寫好的類:
public class Device//最重要的類,封裝了跟蹤設備的全部名稱 { public Device(uint i) { index = i; } public uint index { get; private set; } public bool valid { get; private set; }//GetControllerStateWithPose()函數調用是否成功; public bool connected { get { Update(); return pose.bDeviceIsConnected; } }//判斷設備是否連接 public bool hasTracking { get { Update(); return pose.bPoseIsValid; } }//判斷設備是否跟蹤正常 //判斷設備是否超出范圍 public bool outOfRange { get { Update(); return pose.eTrackingResult == ETrackingResult.Running_OutOfRange || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } } //判斷設備是否正在校正 public bool calibrating { get { Update(); return pose.eTrackingResult == ETrackingResult.Calibrating_InProgress || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } } //判斷設備是否未初始化 public bool uninitialized { get { Update(); return pose.eTrackingResult == ETrackingResult.Uninitialized; } } //獲取的結果是包含12個元素的一維數組,通過SteamVR_Utils.RigidTransform函數 //將12個元素重組為3X4矩陣并針對Unity的坐標系進行修正,同時添加了對position和rotation方便的引用 public SteamVR_Utils.RigidTransform transform { get { Update(); return new SteamVR_Utils.RigidTransform(pose.mDeviceToAbsoluteTracking); } } //velocity和angularVelocity :這兩個速度也針對Unity的坐標系進行修正,lighthouse跟蹤的空間軸方向與Unity存在偏差。 public Vector3 velocity { get { Update(); return new Vector3(pose.vVelocity.v0, pose.vVelocity.v1, -pose.vVelocity.v2); } } public Vector3 angularVelocity { get { Update(); return new Vector3(-pose.vAngularVelocity.v0, -pose.vAngularVelocity.v1, pose.vAngularVelocity.v2); } }
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
unity
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。