SteamVR插件詳解:SteamVR_Controller

關於控制器的相關信息都包含在SteamVR_Controller這個腳本之中。注意:SteamVR_Controller是非Monobehavior的腳本,並無掛在場景下,其運行是經過SteamVR_Render腳本對於其中Update()函數的調用從而一直循環獲取手柄相關信息。而SteamVR_Render腳本是在程序運行時自動加載至場景的數組

ButtonMask類:手柄各按鍵的名稱。函數

Device類:最重要的類,封裝了跟蹤設備的所有信息。翻譯

Update()函數:被SteamVR_Render腳本調用,更新各跟蹤設備的信息。orm

Input()函數:根據Index初始化Device[]數組,並實例化全部16個Device。協程

DeviceRelation和GetDeviceIndex()結合獲取特定的設備Index,如leftmost、rightmost。在SteamVR_TestController腳本中有使用到該函數獲取用戶的左右手手柄的Index。用該方法應該能夠識別出用戶所拿的手柄是哪個。htm

下面着重分析Device類:ci

  • l  GetPress:按下按鍵一直觸發
  • l  GetPressDown:按下按鍵只觸發一次
  • l  GetPressUp:按下按鍵只觸發一次

針對按鍵的三個函數,每種函數有兩個重載,參數爲ButtonMask或EVRButtonId類,第二種形式會將EVRButtonId轉換爲ButtonMask後調用第一種獲得結果。it

  • l  GetTouch
  • l  GetTouchDown
  • l  GetTouchUp

針對Touchpad的三個函數,同樣的兩種形式,同上不解釋。io

  • l  GetAxis()

獲取Touchpad圓盤座標或Trigger的行程值(0-1),函數默認參數是手柄上的Touchpad。共有5個AxisId參數可選,0是TouchPad,1是Trigger,2,3,4應該是沒有用的,且此函數只接受EVRButtonId類參數而不接受ButtonMask。form

  • l  TriggerHapticPulse

手柄震動控制函數,參數名稱解釋的是時間,默認500,但實際上控制的是震動的強度。默認AxisId是EVRButtonId_touchpad,選擇其餘EVRButtonId沒用(等價參數axis0能夠),其會調用OpenVR中的同名函數。參數超過4000會無效,致使震動不觸發。能夠經過協程的while(true)+waitforsecond控制震動間隔,經過stop協程控制震動結束。

  • l  GetHairTrigger
  • l  GetHairTriggerDown定義爲有false轉至true的過程,判斷先前狀態和當前狀態。
  • l  GetHairTriggerUp 定義爲有true轉至false的過程,判斷先前狀態和當前狀態。

這三個函數獲取HairTrigger的狀態,其值對應rAxis1.x的值。But什麼是HairTrigger?形象點說就是像頭髮般輕輕的觸發。HairTrigger是檢測當你握住扳手超過一個固定值(0.1,可調)時即觸發的狀態。至關於利用Trigger的變化量來作一個功能的觸發,很棒不是嗎。輕輕碰一下Trigger使得行程大於0.1便可觸發一個功能。

 整個腳本的執行順序以下:

  • l  Update();
  • l  Input()初始化16個設備的信息存儲空間,並返回某個設備;
  • l  Device.Update():作兩件事

1.     GetControllerStateWithPose()調用OpenVR中的函數獲取手柄狀態和姿態。結果存在這兩個變量State(VRControllerState_t)和Pose(TrackedDevicePose_t)中,由GetState()和GetPose()獲取並由此返回一系列的可查詢參數及各類Get函數。

各可查詢參數說明以下(至關於對TrackedDevicePose_t中的參數翻譯了下)

valid:GetControllerStateWithPose()函數調用是否成功;

connected:判斷設備是否鏈接;

hasTracking:判斷設備是否跟蹤正常;

 根據ETrackingResult的結果獲得下面三個參數:

outOfRange:判斷設備是否超出範圍;

calibrating:判斷設備是否正在校訂;

uninitialized:判斷設備是否未初始化;

 transform:獲取的結果是包含12個元素的一維數組,經過SteamVR_Utils.RigidTransform函數將12個元素重組爲3X4矩陣並針對Unity的座標系進行修正,同時添加了對position和rotation方便的引用。

velocity和angularVelocity:這兩個速度也針對Unity的座標系進行修正,lighthouse跟蹤的空間軸方向與Unity存在誤差。

2. UpdateHairTrigger()。檢測自定義的一種操做:輕按Trigger。 

相關文章
相關標籤/搜索