1. 程式人生 > >HTC VIVE開發筆記(一)使用SteamVR外掛進行基本的互動

HTC VIVE開發筆記(一)使用SteamVR外掛進行基本的互動

1、獲取手柄的引用:目前沒有區分左右手柄

 private SteamVR_TrackedObject trackedobj;
 private SteamVR_Controller.Device device;
 trackedobj = GetComponent<SteamVR_TrackedObject>();
 device = SteamVR_Controller.Input((int)trackedobj.index);

之後應該是可以通過判斷這個index來判斷是哪一個手柄吧。SteamVR中把所有可以追蹤的裝置都儲存在了這個TrackedObject類裡,通過GetComponet方法,就能獲取到當前追蹤到的物體,並獲取到手柄的輸入(在Update方法中進行,這樣才能一直更新,否則如果是在Start方法中獲取的輸入,就只有第一次儲存的device可以來與物體進行互動)。之後的操作都是基於這個device來做了。

2、獲取touch pad的座標

device.GetAxis().x
device.GetAxis().y

3、監聽Trigger有沒有被按下,或鬆開
 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
GetPressDown方法將返回一個布林值,同理,鬆開為,GetPressUp.

ButtonMask這裡也就類似鍵盤的判斷了,可以修改為手柄上不同按鍵的名稱,來進行相應的判斷和處理。


4、用手柄抓取和鬆開Cube的流程

首先要給手柄和要抓取的物體都加上一個Collider。將手柄的Collider的isTrigger勾上,這時候其實手柄並不是一個碰撞體了,感覺就有點像是一個虛的東西,只是作為一個監聽觸發事件的物體。

遇到一個很愚蠢的問題,就是如何來調整Collider的大小,因為在Scene下面看不見手柄的模型,那麼我是這麼做的,開始play,然後看到手柄後暫停遊戲,回到Scene模式下,並根據手柄大小調節Collider,記錄一下引數。然後停止遊戲,把引數改了。就醬。

然後來看看用到的一些函式。

 private void OnTriggerEnter(Collider other)

當碰撞體other進入到了當前的Trigger裡時,這個Enter方法被呼叫。這裡要把這個collider的transform.gameObject儲存下來。
interactBox = other.transform.gameObject;

TODO:弄清楚Collider.transform.gameObject和Collider.gameObject有啥區別,為啥不能直接儲存other.gameObject

 當碰撞體離開Trigger時(OnTriggerExit),把interactBox清空。

進行抓取操作,並使得抓取到的物體綁在手柄下,跟著手柄的變化而變化。就是要把這個collider節點綁在父節點(手柄)下。

 //獲取trigger鍵是否按下
        if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger down");
            if (interactBox != null)
            {
                interactBox.transform.parent = transform;
                Rigidbody rig = interactBox.GetComponent<Rigidbody>();
                rig.useGravity = false;
                rig.isKinematic = true;
            }
        }

        //獲取trigger鍵是否鬆開
        if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger up");
            interactBox.transform.parent = null;
            Rigidbody rig = interactBox.GetComponent<Rigidbody>();
            rig.useGravity = true;
            rig.isKinematic = false;
        }
因為是Unity新手,一開始不太理解,這裡的transform為什麼就是手柄的transform。。因為這個指令碼是綁在手柄下面的,相當於就是一個類吧,transform就是其中的一個成員,就可以直接這麼訪問了。

通過

interactBox.transform.parent = transform;
將碰撞到的物體的變換矩陣綁到父節點的變換矩陣下。接著修改一些剛體的引數。

通過今天的學習,對Unity以及Htc vive的開發又熟悉了一點。