HTC View 手柄操作簡介

      網友投稿 978 2022-05-29

      核心類簡介:

      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

      HTC View 手柄操作簡介

      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().index) } void Update{ if(device.GetPress(SteamVR_Controller.ButtonMask.Trigger)) { device.Trigger.TriggerHapicPulse(1000); } }

      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小時內刪除侵權內容。

      上一篇:一個水杯的測試
      下一篇:MySQL這樣學才叫了解!【1】
      相關文章
      亚洲欧洲一区二区三区| 亚洲AV无码XXX麻豆艾秋| 国产精品亚洲lv粉色| 亚洲av产在线精品亚洲第一站| 亚洲午夜精品一区二区| 亚洲妇熟XXXX妇色黄| 国产亚洲美女精品久久久| 亚洲人成网站色在线入口| 亚洲国产成人精品91久久久| 国产精品日本亚洲777| 国产综合激情在线亚洲第一页 | 日本亚洲中午字幕乱码| 亚洲av无码日韩av无码网站冲| 亚洲av无码成人精品区一本二本 | 亚洲精品蜜夜内射| 亚洲AV综合色区无码一二三区| 久久精品亚洲日本波多野结衣| 亚洲日韩av无码中文| 亚洲国产AV无码一区二区三区| 亚洲1区2区3区精华液| 亚洲成a人无码av波多野按摩| 亚洲国产免费综合| 国产亚洲一区区二区在线| 亚洲中文字幕无码久久精品1| 亚洲欧洲日产国码av系列天堂| 日本红怡院亚洲红怡院最新 | 亚洲Av永久无码精品三区在线| 亚洲av无码成h人动漫无遮挡| 亚洲综合精品香蕉久久网97| 亚洲精彩视频在线观看| 亚洲一区二区影视| 亚洲日韩av无码中文| 亚洲AV永久无码精品一区二区国产| 亚洲黄黄黄网站在线观看| 亚洲午夜福利AV一区二区无码| 亚洲AV无码专区国产乱码电影 | 4480yy私人影院亚洲| 亚洲制服丝袜一区二区三区| 亚洲熟妇av午夜无码不卡| 成a人片亚洲日本久久| 丁香五月亚洲综合深深爱|