關於控制器的相關信息都包含在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便可觸發一個功能。
整個腳本的執行順序以下:
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。