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); // reservedpublic 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);} }實際上在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,通過手柄游戲對象上的SteamVR_TrackedObject組件進行獲取,,,
//獲取跟蹤對象 此時通過trackObj.index 就可以訪問到設備對象
2,通過找到索引獲取到設備(Device)對象,
這時就用到了SteamVR_Controller.Input方法傳入上面獲取的到設備索引,就可以訪問到設備中的方法,相應手柄操作,,,
3,調用Divice中的相應函數,來獲取手柄的按鍵操作,,,
按鍵: Device.GetPressDown(按下) / GetPressUp(抬起) / GetPress(一直按)
觸摸鍵:Device.GetTouchDown / GetTouchUp / GetTouch
觸摸板:
通過獲取用戶觸摸操作,然后根據當前的狀態進行獲取,,,Touchpad圓盤坐標是和平面直角坐標系一致,,上下和左右都是(-1,1)值,,,
手柄的震動: TriggerHapicPulse
手柄震動是通過TriggerHapicPulsefangf ,第一個參數可以理解為震動強度,默認500,不要超過4000,,第二個參數默認就好,不用填寫
簡例:按下Trigger觸發震動:
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); } }總結
以上是生活随笔為你收集整理的HTC View 手柄操作简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis集群为什么至少需要三个mast
- 下一篇: 重庆大学计算机学院最好老师,“一切都是最