一、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
- 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
- 利用官方例子實現與物體的基礎交互
手柄與物體的交互包括碰到物體,移出物體,和抓住物體。
相關腳本為:
Interactable,控制抓取物體時物體和手柄的狀態。
InteractableExample:基礎的交互。
- 基礎的UI交互。
目前SteamVR所支持的交互只限於button按鈕,需要在button上添加boxcollider和UIElement,這樣就能實現手柄去觸摸UI按鈕然后點擊。目前不支持射線點擊UI。要實現射線點擊UI需要對EventSystem進行修改。
- 射線移動
官方射線移動相關的預制體為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