HTC View 手柄操作简介
核心類簡介:
SteamVR_TrackedObject
此類用于根據(jù)硬件設(shè)備,并為硬件設(shè)備分配相應(yīng)的索引
SteamVR_Controller.Device
最重要的類,封裝了跟蹤設(shè)備的全部信息,例如手柄的各種交互相應(yīng)勾動扳機(jī)等。
SteamVR_Controller.ButtonMask
手柄各按鍵的名稱
SteamVR_Controller
此類通常使用靜態(tài)方法Input根據(jù)設(shè)備索引值獲取對應(yīng)的設(shè)備(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);} }實(shí)際上在SteamVR_TrackedObject類枚舉類型EIndex中,已經(jīng)預(yù)先定義了16個設(shè)備索引,頭盔默認(rèn)索引為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,通過手柄游戲?qū)ο笊系腟teamVR_TrackedObject組件進(jìn)行獲取,,,
//獲取跟蹤對象 此時通過trackObj.index 就可以訪問到設(shè)備對象
2,通過找到索引獲取到設(shè)備(Device)對象,
這時就用到了SteamVR_Controller.Input方法傳入上面獲取的到設(shè)備索引,就可以訪問到設(shè)備中的方法,相應(yīng)手柄操作,,,
3,調(diào)用Divice中的相應(yīng)函數(shù),來獲取手柄的按鍵操作,,,
按鍵: Device.GetPressDown(按下) / GetPressUp(抬起) / GetPress(一直按)
觸摸鍵:Device.GetTouchDown / GetTouchUp / GetTouch
觸摸板:
通過獲取用戶觸摸操作,然后根據(jù)當(dāng)前的狀態(tài)進(jìn)行獲取,,,Touchpad圓盤坐標(biāo)是和平面直角坐標(biāo)系一致,,上下和左右都是(-1,1)值,,,
手柄的震動: TriggerHapicPulse
手柄震動是通過TriggerHapicPulsefangf ,第一個參數(shù)可以理解為震動強(qiáng)度,默認(rèn)500,不要超過4000,,第二個參數(shù)默認(rèn)就好,不用填寫
簡例:按下Trigger觸發(fā)震動:
Device常用屬性:
valid:GetControllerStateWithPose() 函數(shù)調(diào)用是否成功;
connected:判斷設(shè)備是否連接
hasTracking :判斷設(shè)備是否正常跟蹤
結(jié)果得到三個參數(shù):
outOfRange:判斷設(shè)備是否超出范圍
calibrating:判斷設(shè)備是否正在校正
uninitialized:判斷設(shè)備是否未初始化
transform:獲取的結(jié)果是包含12個元素的一維數(shù)組,通過SteamVR_Utils.RigidTransform函數(shù)將12元素重組為3×4的矩陣針對Unity的坐標(biāo)系進(jìn)行修正,同時添加了懟position和rotation的方便的引用
velocity和angularVelocity:兩個速度也針對Unity的坐標(biāo)系進(jìn)行修正,Lighthouse跟蹤的空間軸方向與Unity存在偏差,,,
上面描述所對應(yīng)的SteamVR插件中寫好的類:
public class Device//最重要的類,封裝了跟蹤設(shè)備的全部名稱{public Device(uint i) { index = i; }public uint index { get; private set; }public bool valid { get; private set; }//GetControllerStateWithPose()函數(shù)調(diào)用是否成功;public bool connected { get { Update(); return pose.bDeviceIsConnected; } }//判斷設(shè)備是否連接public bool hasTracking { get { Update(); return pose.bPoseIsValid; } }//判斷設(shè)備是否跟蹤正常 //判斷設(shè)備是否超出范圍 public bool outOfRange { get { Update(); return pose.eTrackingResult == ETrackingResult.Running_OutOfRange || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } }//判斷設(shè)備是否正在校正 public bool calibrating { get { Update(); return pose.eTrackingResult == ETrackingResult.Calibrating_InProgress || pose.eTrackingResult == ETrackingResult.Calibrating_OutOfRange; } }//判斷設(shè)備是否未初始化public bool uninitialized { get { Update(); return pose.eTrackingResult == ETrackingResult.Uninitialized; } }//獲取的結(jié)果是包含12個元素的一維數(shù)組,通過SteamVR_Utils.RigidTransform函數(shù)//將12個元素重組為3X4矩陣并針對Unity的坐標(biāo)系進(jìn)行修正,同時添加了對position和rotation方便的引用public SteamVR_Utils.RigidTransform transform { get { Update(); return new SteamVR_Utils.RigidTransform(pose.mDeviceToAbsoluteTracking); } }//velocity和angularVelocity :這兩個速度也針對Unity的坐標(biāo)系進(jìn)行修正,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); } }總結(jié)
以上是生活随笔為你收集整理的HTC View 手柄操作简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis集群为什么至少需要三个mast
- 下一篇: 重庆大学计算机学院最好老师,“一切都是最