Unity新版本VR以及SteamVR基礎

1、Unity2018新版本VR

 Unity 簡單VRDemo搭建

Unity環境搭建:

 PlayerSetting設置以下:html

啓動虛擬現實驅動,sdk選擇OpenVR。HTC  Vive只支持OpenVR。node

   Unity Input設置:git

官方手冊設置說明: https://docs.unity3d.com/Manual/OpenVRControllers.htmlgithub

     按照手冊進行配置,左手菜單按鈕設置爲:api

左手觸摸板觸摸位置獲取設置爲:ide

X軸設置:測試

Y軸設置:ui

其他按鈕以例根據官方手冊在Input中進行配置便可。.net

基礎運行場景搭建

基礎環境配置配置完成,VR硬件鏈接正確時只要場景中存在相機便能實現頭部的定位跟蹤,先基礎角色配置如圖:插件

手部定位追蹤依賴於組件:

 

Device:

制定要追蹤的設備類型,XRDevice:XR設備(包括頭部,眼睛位置的追蹤)用於HMD和AR移動設備的位置追蹤。

XRController:控制器設備的(左手和右手控制器)

XR Remote:XR遙控器,用於移動遙控器(此值暫未用到)

PoseSource 要追蹤設備位置來源。

UseRelativeTransform:是否使用對象的原始轉換做爲基礎(暫未明白其含義)

基礎控制器事件

   以左手控制器爲例:

     //點擊左手菜單按鈕

        if (Input.GetButtonDown("LTMenu"))

        {

            Debug.Log("按下左手菜單按鍵");

        }

        //觸摸左手Touchpad

        if (Input.GetButton("LTTrackpadTouch"))

        {

            float x = Input.GetAxisRaw("LTTrackpadHorizontal");

            float y = Input.GetAxisRaw("LTTrackpadVertical");

          

            Debug.LogFormat("觸摸左手手柄觸摸板:X:{0},Y:{1}", x, y);

        }

 

        if (Input.GetButton("LTTrackpadPress"))

        {

            Debug.Log("按下左手觸摸板");

        }

 

        if (Input.GetButton("LTrigglerTouch"))

        {

            float value = Input.GetAxis("LTrigglerSqueeze");

            //Debug.Log("觸摸左手Trigger按鍵,按鍵角度:" + value);

            Debug.Log("觸摸左手Trigger按鍵,按鍵角度:" + value);

        }

        if (Input.GetAxis("LGrip")>0)

        {

            //Grip按鍵的值鬆開時爲0,按下時爲1,沒法取得中間值。

            Debug.Log("按下左手Grip按鍵");

        }

 

  以上需在update中輪詢監聽,經測試,Axis輸入的值準確度有差別,具體緣由未知。

 

其餘經常使用API

  1. InputTracking類:

     InputTracking.nodeAdded += (XRNodeState nodeState) => { Debug.Log("設備鏈接:" + nodeState.nodeType.ToString());  };  每當有設備鏈接時便會執行此設備,設備類型包含:左眼,右眼,中間的眼,左右控制器等。

InputTracking.nodeRemoved += (XRNodeState nodeState) => { Debug.Log("設備斷開鏈接:" + nodeState.nodeType.ToString()); }; 當設備斷開鏈接時會執行的事件

  InputTracking.trackingAcquired 設備正確響應時會執行的事件

  InputTracking.trackingLost 設備定位丟失時會執行的事件

設備位置和旋轉的獲取。

          2.其他VR設置相關的有 XRSetting和XRDevice等能夠在Unity幫助內查看。

2、SteamVR 2.0.1

1. 基礎環境配置

       在Assets Store中下載最新版的SteamVR插件,導入完成後直接在project面板中查找Player便可,將其拖到場景中便可實現基礎的瀏覽。

2.手柄按鍵事件系統

1)  事件配置

比較老版本的事件,如今的事件系統更加靈活,但基礎添加更加依賴於配置。以手柄的觸摸板爲例,有點擊、觸摸、觸摸位置3個事件能夠編輯,其編輯步驟爲:

第一步:

打開window下的 SteamVRInput編輯界面,

通常是默認選中 default事件的,不用更改。

Actions 下In則爲要輸入的事件,out爲輸出事件。通常系統會默認一系列事件不須要可直接刪除。

點擊In裏面的「+」:

Name爲當前事件的名字,Type爲事件的返回值類型,Required目前測試3種選擇沒有區別,Localized String直接設置爲當前事件的名字同樣便可。

這裏定義了一個觸摸板觸摸的事件,觸摸板是否觸摸返回的類型爲bool因此類型選擇爲boolean,編輯完成以後點擊save and generate按鈕便可。以後程序便會生成一個對應類型的Action類打包成 .assets文件,並把類的定義寫入到SteamVR_Input_ActionSet_default_In

 觸摸板觸摸位置獲取事件定義以下:

第二步:將按鈕和事件進行綁定

點擊 Open binding UI按鈕,打開編輯界面以下:

點擊 Edit按鈕進行編輯:

 

若是兩個手柄的事件是同樣的則勾選 Mirror Mode按鈕,若是須要分別編輯則不須要勾選此按鈕。

Left Vive Controller下面的則爲左手柄事件編輯界面,下拉界面找到以下位置:

此爲觸摸板編輯界面,將鼠標移入在左下角會顯示編輯按鈕,點擊按鈕進行編輯。

點擊Touch後面的None:

點擊 TouchPadTouch,綁定觸摸事件。而後再按上述步驟綁定觸摸位置獲取事件,最終按鈕事件綁定以下:

點擊對號按鈕保存編輯。點擊

按鈕,點擊save便可保存。其他手柄按鈕事件皆能夠此爲例進行編輯。

相較於老版本的事件系統,此事件系統能夠方便的對不一樣的手柄設備進行匹配,減小不一樣手柄時代碼上的更改。

2)  手柄按鍵事件調用

調用代碼示例:

3.  SteamVR示例場景Interactions_Example場景解讀

參考文件:http://www.cnblogs.com/lys12138/p/9849115.html

  1. 利用官方例子實現與物體的基礎交互

手柄與物體的交互包括碰到物體,移出物體,和抓住物體。

相關腳本爲:

Interactable,控制抓取物體時物體和手柄的狀態。

InteractableExample:基礎的交互。

  1. 基礎的UI交互。

目前SteamVR所支持的交互只限於button按鈕,須要在button上添加boxcollider和UIElement,這樣就能實現手柄去觸摸UI按鈕而後點擊。目前不支持射線點擊UI。要實現射線點擊UI須要對EventSystem進行修改。

  1. 射線移動

官方射線移動相關的預製體爲Teleporting,關鍵的腳本爲: Teleport和Teleport Arc用於控制角色移動,檢測是否可移動。能夠移動的地點物體上須要添加腳本:TeleportArea(根據物體的碰撞進行斷定是否能夠移動)

        

       

        備註:該版本的SteamVR解決了角色在牆邊穿模問題,也就是說如今的角色沒法再穿越牆體碰撞。不須要使用角色碰到牆體屏幕變黑來提醒角色。

 

底層 API OpenVR:

OpenVR十二個驅動接口:https://blog.csdn.net/dabenxiong666/article/details/68954398

 

Unity插件(SteamVR深度分析)http://gad.qq.com/article/detail/27028

--基於steamVR 1.10版本,有關於 OpenVR api部分講解。

 

API Document: https://github.com/ValveSoftware/openvr/wiki/API-Documentation

相關文章
相關標籤/搜索