HTC Vive --SteamVR_Controller腳本解析

重要類(ButtonMask、Device躺坟、Input、Update、DeviceRelation與GetDeviceIndex)

SteamVR_Controller是非Monobehavior的腳本拯坟,并沒有掛在場景下,其運行是通過SteamVR_Render腳本對于其中Update()函數(shù)的調(diào)用從而一直循環(huán)獲取手柄相關(guān)信息韭山。而SteamVR_Render腳本是在程序運行時自動加載至場景的郁季。先來看看腳本的全貌吧。
先來看看這幾個重要類

Paste_Image.png

ButtonMask

497526-20160620202603694-694352586.png

1 - 菜單鍵
6 - 系統(tǒng)鍵(按下后手柄斷開連接钱磅,再次按下手柄再次連接上)
7 - 扳機鍵
8 - 握持鍵
9 - 觸摸板鍵


Paste_Image.png

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)用


Paste_Image.png

針對按鍵的三個函數(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

Paste_Image.png
獲取Touchpad圓盤坐標或Trigger的行程值(0-1),函數(shù)默認參數(shù)是手柄上的Touchpad另凌。共有5個AxisId參數(shù)可選谱轨,0是TouchPad,1是Trigger吠谢,2,3,4應(yīng)該是沒有用的土童,且此函數(shù)只接受EVRButtonId類參數(shù)而不接受ButtonMask。

關(guān)于TriggerHapticPulse

Paste_Image.png
手柄震動控制函數(shù)工坊,參數(shù)名稱解釋的是時間献汗,默認500,但實際上控制的是震動的強度敢订。默認AxisId是EVRButtonId_touchpad,選擇其他EVRButtonId沒用(等價參數(shù)axis0可以),其會調(diào)用OpenVR中的同名函數(shù)罢吃。參數(shù)超過4000會無效楚午,導(dǎo)致震動不觸發(fā)∧蛘校可以通過協(xié)程的while(true)+waitforsecond控制震動間隔矾柜,通過stop協(xié)程控制震動結(jié)束。

關(guān)于這GetHairTrigger/GetHairTriggerDown/GetHairTriggerUp

Paste_Image.png

檢測自定義的一種操作:輕按Trigger 就谜,這三個函數(shù)代表的是我們用手指輕輕觸碰到觸碰板并不需要按下及會產(chǎn)生反應(yīng)怪蔑,HairTrigger是檢測當你握住扳手超過一個固定值(0.1,可調(diào))時即觸發(fā)的狀態(tài)丧荐。相當于利用Trigger的變化量來做一個功能的觸發(fā)缆瓣,很棒不是嗎。輕輕碰一下Trigger使得行程大于0.1即可觸發(fā)一個功能虹统。
Device中的Update
Paste_Image.png

Input:初始化16個設(shè)備的信息存儲空間捆愁,并返回某個設(shè)備;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窟却,一起剝皮案震驚了整個濱河市昼丑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夸赫,老刑警劉巖菩帝,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茬腿,居然都是意外死亡呼奢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門切平,熙熙樓的掌柜王于貴愁眉苦臉地迎上來握础,“玉大人,你說我怎么就攤上這事悴品≠髯郏” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵苔严,是天一觀的道長定枷。 經(jīng)常有香客問我,道長届氢,這世上最難降的妖魔是什么欠窒? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮退子,結(jié)果婚禮上岖妄,老公的妹妹穿的比我還像新娘型将。我一直安慰自己,他們只是感情好荐虐,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布茶敏。 她就那樣靜靜地躺著,像睡著了一般缚俏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮乳,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天忧换,我揣著相機與錄音,去河邊找鬼向拆。 笑死亚茬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的浓恳。 我是一名探鬼主播刹缝,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颈将!你這毒婦竟也來了梢夯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤晴圾,失蹤者是張志新(化名)和其女友劉穎颂砸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體死姚,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡人乓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了都毒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片色罚。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖账劲,靈堂內(nèi)的尸體忽然破棺而出戳护,到底是詐尸還是另有隱情,我是刑警寧澤瀑焦,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布姑尺,位于F島的核電站,受9級特大地震影響蝠猬,放射性物質(zhì)發(fā)生泄漏切蟋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一榆芦、第九天 我趴在偏房一處隱蔽的房頂上張望柄粹。 院中可真熱鬧喘鸟,春花似錦、人聲如沸驻右。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堪夭。三九已至愕把,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間森爽,已是汗流浹背恨豁。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爬迟,地道東北人橘蜜。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像付呕,于是被迫代替她去往敵國和親计福。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容