日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HTC View 手柄操作简介

發(fā)布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTC View 手柄操作简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

核心類簡介:
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è)備對象

SteamVR_TrackedObject trackObj = this.GetComponent<SteamVR_TrackedObject>();

2,通過找到索引獲取到設(shè)備(Device)對象,
這時就用到了SteamVR_Controller.Input方法傳入上面獲取的到設(shè)備索引,就可以訪問到設(shè)備中的方法,相應(yīng)手柄操作,,,

//通過設(shè)備索引獲取到相應(yīng)設(shè)備對象Device SteamVR_Controller.Device device= SteamVR_Controller.Input((int)trackObj.index);

3,調(diào)用Divice中的相應(yīng)函數(shù),來獲取手柄的按鍵操作,,,
按鍵: Device.GetPressDown(按下) / GetPressUp(抬起) / GetPress(一直按)
觸摸鍵:Device.GetTouchDown / GetTouchUp / GetTouch

void Update { //按下Tigger鍵if(device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger){Debug.Log("您按下了Trigger")} }

觸摸板:
通過獲取用戶觸摸操作,然后根據(jù)當(dāng)前的狀態(tài)進(jìn)行獲取,,,Touchpad圓盤坐標(biāo)是和平面直角坐標(biāo)系一致,,上下和左右都是(-1,1)值,,,

void Update {//按下Touchpad鍵if(device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad){Debug.Log("您按下了Touchpad")} }

手柄的震動: TriggerHapicPulse
手柄震動是通過TriggerHapicPulsefangf ,第一個參數(shù)可以理解為震動強(qiáng)度,默認(rèn)500,不要超過4000,,第二個參數(shù)默認(rèn)就好,不用填寫
簡例:按下Trigger觸發(fā)震動:

private SteamVR_Controller.Device device; void Strar(){ //獲取設(shè)備 device = SteamVR_Contorller.Input((int)GetComponent<SteamVR_TrackedObject>().index) } void Update{if(device.GetPress(SteamVR_Controller.ButtonMask.Trigger)){device.Trigger.TriggerHapicPulse(1000);} }

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。