重要類(ButtonMask、Device躺坟、Input、Update、DeviceRelation與GetDeviceIndex)
SteamVR_Controller是非Monobehavior的腳本拯坟,并沒有掛在場景下,其運行是通過SteamVR_Render腳本對于其中Update()函數(shù)的調(diào)用從而一直循環(huán)獲取手柄相關(guān)信息韭山。而SteamVR_Render腳本是在程序運行時自動加載至場景的郁季。先來看看腳本的全貌吧。
先來看看這幾個重要類
ButtonMask
1 - 菜單鍵
6 - 系統(tǒng)鍵(按下后手柄斷開連接钱磅,再次按下手柄再次連接上)
7 - 扳機鍵
8 - 握持鍵
9 - 觸摸板鍵
Device
首先先看這前面這幾個簡單函數(shù)的解釋把
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; } }
// These values are only accurate for the last controller state change (e.g. trigger release), and by definition, will always lag behind
// the predicted visual poses that drive SteamVR_TrackedObjects since they are sync'd to the input timestamp that caused them to update.
//獲取的結(jié)果是包含12個元素的一維數(shù)組盖淡,通過SteamVR_Utils.RigidTransform函數(shù)
//將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); } }
下面我們再來看看下面這幾個按鍵函數(shù)的應(yīng)用
針對按鍵的三個函數(shù)冗恨,每種函數(shù)有兩個重載,參數(shù)為ButtonMask或EVRButtonId類牵咙,第二種形式會將EVRButtonId轉(zhuǎn)換為ButtonMask后調(diào)用第一種得到結(jié)果派近。
針對Touchpad的三個函數(shù),一樣的兩種形式洁桌,同上不解釋渴丸。
// 按下了扳機按鈕調(diào)用
if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
{
Debug.Log("GetTouch");
}
//第二種方法
if (device.GetPressDown(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger))
{
print("GetPressDown");
}
關(guān)于GetAxis
關(guān)于TriggerHapticPulse
關(guān)于這GetHairTrigger/GetHairTriggerDown/GetHairTriggerUp
檢測自定義的一種操作:輕按Trigger 就谜,這三個函數(shù)代表的是我們用手指輕輕觸碰到觸碰板并不需要按下及會產(chǎn)生反應(yīng)怪蔑,HairTrigger是檢測當你握住扳手超過一個固定值(0.1,可調(diào))時即觸發(fā)的狀態(tài)丧荐。相當于利用Trigger的變化量來做一個功能的觸發(fā)缆瓣,很棒不是嗎。輕輕碰一下Trigger使得行程大于0.1即可觸發(fā)一個功能虹统。
Device中的Update