Unity新版本VR以及SteamVR基礎


一、Unity2018新版本VR

 Unity 簡單VRDemo搭建

Unity環境搭建:

 PlayerSetting設置如下:

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

   Unity Input設置:

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

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

左手觸摸板觸摸位置獲取設置為:

X軸設置:

Y軸設置:

其余按鈕以例根據官方手冊在Input中進行配置即可。

基礎運行場景搭建

基礎環境配置配置完成,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幫助內查看。

二、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM