關於控制器的相關信息都包含在SteamVR_Controller這個腳本之中。注意:SteamVR_Controller是非Monobehavior的腳本,並沒有掛在場景下,其運行是通過SteamVR_Render腳本對於其中Update()函數的調用從而一直循環獲取手柄相關信息。而SteamVR_Render腳本是在程序運行時自動加載至場景的
ButtonMask類:手柄各按鍵的名稱。
Device類:最重要的類,封裝了跟蹤設備的全部信息。
Update()函數:被SteamVR_Render腳本調用,更新各跟蹤設備的信息。
Input()函數:根據Index初始化Device[]數組,並實例化所有16個Device。
DeviceRelation和GetDeviceIndex()結合獲取特定的設備Index,如leftmost、rightmost。在SteamVR_TestController腳本中有使用到該函數獲取用戶的左右手手柄的Index。用該方法應該可以識別出用戶所拿的手柄是哪一個。
下面着重分析Device類:
- l GetPress:按下按鍵一直觸發
- l GetPressDown:按下按鍵只觸發一次
- l GetPressUp:按下按鍵只觸發一次
針對按鍵的三個函數,每種函數有兩個重載,參數為ButtonMask或EVRButtonId類,第二種形式會將EVRButtonId轉換為ButtonMask后調用第一種得到結果。
- l GetTouch
- l GetTouchDown
- l GetTouchUp
針對Touchpad的三個函數,一樣的兩種形式,同上不解釋。
- l GetAxis()
獲取Touchpad圓盤坐標或Trigger的行程值(0-1),函數默認參數是手柄上的Touchpad。共有5個AxisId參數可選,0是TouchPad,1是Trigger,2,3,4應該是沒有用的,且此函數只接受EVRButtonId類參數而不接受ButtonMask。
- 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。