一、概述
筆者之前使用SteamV1.x+VRTK開發(fā)項目澜掩,發(fā)現SteamVR2.0與之前有重大更新谴麦,主要原因是隨著越來越多的VR設備推出,控制器類型逐漸趨向于碎片化慢洋,
每當有新的控制器發(fā)布塘雳,都會給開發(fā)者帶來一些額外的工作量:游戲項目需要修改交互代碼以適配新的設備;意思就是每套VR硬件設備就有自身一套VR SDK普筹,
所以败明,當現有VR應用程序移植到另外一個VR平臺的時候,需要針對目標平臺進行交互適配太防;從而增加開發(fā)者的工作量妻顶;SteamVR2.0的推出意味著能夠使開發(fā)者
在編程中專注于用戶的動作,而不是具體的控制器按鍵蜒车。(具體適配如何留待日后驗證讳嘱,目前只做整理)
二、重要更新:Input System
SteamVR 2.0 的重要更新是加入了 Input System酿愧。推出Input System的目的沥潭,是為了更加符合OpenXR標準,以及配合即將正式推出的Knuckles控制器嬉挡。
目前多數主流VR平臺均加入了OpenXR開放標準叛氨,如下圖所示:
Input System 與之前處理用戶輸入有顯著的不同,使用 SteamVR Input System棘伴,開發(fā)人員可以在應用程序之外定義默認的動作并與按鍵進行綁定寞埠,
而不需要將輸入視為某一特定設備的特定按鍵。這樣新的設備可以快速適配應用程序焊夸,無需更改代碼仁连。比如,當開發(fā)者檢測玩家是否抓取某個物體的時候,
不是檢測Vive控制器的Trigger鍵或Oculus Touch控制器的Grip鍵是否被按下饭冬,而是檢測預定義的"Grab"動作是否為True即可使鹅。作為開發(fā)者,可以在
SteamVR中為Grab動作設置默認按鍵和閾值昌抠,當程序運行時患朱,也可修改這些數值以滿足玩家的個人偏好〈渡唬基于這種機制裁厅,不光能夠解決控制器碎片化的問題,
也可以快速適配未來發(fā)布的設備侨艾。
三执虹、動作(Actions)
Input System 的核心概念是動作(Action),基于動作的輸入系統(tǒng)對于游戲引擎來說更有意義唠梨, Unreal一直在沿用這種方案袋励,而Unity目前在開發(fā)中的輸入
系統(tǒng)也將遵循這一原則。開發(fā)者需要放棄之前關于“按下某個按鍵發(fā)生什么事情”的思想当叭,取而代之的是使用“做出某個動作發(fā)生什么事情”的思想茬故。
SteamVR 2.0將動作抽象為以下6種類型,簡介如下:
Boolean類型的動作代表只有兩種狀態(tài)的動作——True或False蚁鳖,比如抓然前拧(Grab)動作,只有抓取或未抓取兩種狀態(tài)才睹,不存在中間狀態(tài)徘跪。在Unity中對應類為
SteamVR_Action_Boolean甘邀。
Single類型的動作能夠返回0~1之間的數值琅攘,比如 Trigger 鍵按下到松開的過程。在Unity中對應類為SteamVR_Action_Single松邪。
Vector2類型動作能夠返回二維數坞琴,比如Touchpad上的觸摸或手柄搖桿。使用這樣的數值能夠控制物體在四個方向的運動逗抑,典型的應用時使用Touchpad控制無
人機或小車的運動剧辐。在Unity中對應類為SteamVR_Action_Vector2。
Vector3類型的動作能夠返回三維數值邮府,在Unity中對應類為SteamVR_Action_Vector3荧关。
Pose類型的動作表示三維空間中的位置和旋轉,一般用于跟蹤VR控制器褂傀。在Unity中對應類為SteamVR_Action_Pose忍啤。
Skeleton類型的動作能夠獲取用戶在持握手柄控制器時的手指關節(jié)數據,通過返回數據仙辟,結合手部渲染模型同波,能夠更加真實的呈現手部在虛擬世界的姿態(tài)鳄梅,雖
然不及像LeapMotion等設備獲取手指輸入那樣精確,但是足以獲得良好的沉浸感未檩。在Unity中對應類為SteamVR_Action_Skeleton戴尸。
3.1 骨骼輸入
對于骨骼輸入,Knuckles控制器為SteamVR體驗帶來了手指跟蹤功能冤狡,能夠估算用戶手指的位置孙蒙,然后將數據傳遞給驅動程序,驅動程序將其對應解析到手部模
型的31塊骨骼上筒溃,從而給用戶帶來更好的沉浸式體驗马篮。該功能并不是Knuckles所獨有,SteamVR還能夠為HTC Vive和Oculus Touch這樣的設備提供手指狀態(tài)
估算怜奖,比如判斷手部是否打開浑测,手指是否放置在Touchpad上。同時Valve公司還將與Microsoft展開合作歪玲,以增加對Windows MR控制器的支持迁央。
默認情況下,運行Interaction System示例場景中能夠同時看到手部和控制器模型滥崩,此外岖圈,還有一個輔助組件SteamVR_Behaviour_Skeleton,如下圖所示钙皮。
有關該組件的使用蜂科,可以參考Interaction System的示例場景。
3.2 振動輸出
以上是介紹的都是輸入動作短条,另外导匣,目前還有一種輸出動作——振動,用于觸發(fā)VR控制器上的觸覺反饋茸时,調用方法如下代碼所示:
SteamVR_Input._default.outActions.Haptic.Execute(float secondsFromNow, float durationSeconds, float frequency, float amplitude, SteamVR_Input_Sources inputSource)贡定;
四. 動作集(Action Sets)
動作通過動作集進行邏輯上的分組,以方便進行組織和管理可都。在Unity中對應的類為SteamVR_ActionSet缓待。在不同的場景或應用程序之間可以切換使用不同的動作集,
比如渠牲,應用程序中有一個場景是在地球上拾取并投擲物體旋炒,而另一個場景則是在太空中飛行,那么這兩個場景可以使用不同的動作集签杈。同時瘫镇,當針對新設備進行
交互適配時,開發(fā)者只需對動作進行配置,而不必修改項目代碼汇四。比如接奈,使用 Vive 控制器時,定義了一個Fire動作通孽,當需要支持 Rift Touch 時序宦,只需通過
配置Touch控制器上符合 Fire 動作的鍵值即可。
SteamVR插件默認包含了三套動作集default背苦、platformer互捌、buggy,開發(fā)者也可以在SteamVR Input窗口中自行添加或刪除動作集行剂。
使用組件SteamVR_ActivateActionSetOnLoad可以在場景中自動激活和停用指定的動作集秕噪。對應激活和停用的方法是在Start()和OnDestroy()中實現。
如下圖所示:
五厚宰、 SteamVR Input 窗口
在Unity編輯器中腌巾,使用 Window > SteamVR Input 命令,打開SteamVR Input 窗口铲觉。在SteamVR 2.0中澈蝙,使用SteamVR Input窗口作為入口,
對所有動作進行管理撵幽。初次導入SteamVR 2.0并運行程序時灯荧,會彈出一個對話框,提示沒有actions.json文件盐杂,并詢問是否要使用默認值逗载。如下圖所示:
選擇Yes,會將默認的actions.json文件以及一些常見的控制器相關綁定文件復制到當前項目的根目錄下链烈,如下圖所示:
這些文件將在程序運行時被載入進來厉斟,并在程序最終構建時被復制到與可執(zhí)行文件同級的目錄下。復制完成后测垛,SteamVR Input窗口將讀取文件信息并展示其包
含的動作集合以及動作集合下的所有動作捏膨。如下圖所示:
在Actions欄的右下角秧均,可以點擊加減號按鈕添加或刪除動作食侮。每個動作具有名稱(Name)、類型(Type)目胡、本地化字符串(localization strings)等字段锯七。
其中,類型對應上節(jié)介紹的動作類型誉己;本地化字符串是面向用戶進行綁定的動作名稱眉尸,開發(fā)者可以通過SteamVR API直接訪問動作以及動作集。
當點擊Save and Generate按鈕后,插件將為動作以及動作集生成可編程訪問的對象類噪猾,將它們放置在項目的SteamVR_input目錄下霉祸,如下圖所示:
這些對象可以在相關組件的下拉列表中進行選擇,如下圖所示:
在項目代碼中袱蜡,使用SteamVR_Input類可以靜態(tài)引用每個動作和動作集丝蹭,在每個動作集中,可以找到其包含的動作的引用坪蚁,如下代碼所示:
void Update()
{
if(SteamVR_Input._default.inActions.Teleport.GetStateUp(SteamVR_Input_Sources.Any)) {
Teleport();
}
}
以上代碼實現的功能為:當檢測到任意控制器發(fā)出default動作集中包含的Teleport動作時奔穿,執(zhí)行Teleport()函數。
六敏晤、測試動作
選擇 Window > SteamVR Input Live View 命令贱田,即可打開一個測試輸入窗口。運行程序嘴脾,此時該窗口將實時展示所有動作集合的狀態(tài)男摧。如下圖所示:
當一個動作的值發(fā)生變化時,對應右側會突出顯示綠色译打,然后逐漸消失彩倚。
七、 動作綁定
創(chuàng)建動作以后扶平,需要將動作進行默認綁定帆离。打開VR控制器,保持SteamVR客戶端開啟结澄,在SteamVR Input窗口中哥谷,點擊Open binding UI按鈕,此時將使用操作
系統(tǒng)默認的網頁瀏覽器打開SteamVR動作綁定頁面麻献。在此頁面中選擇需要綁定的控制器们妥,點擊Edit按鈕,進入綁定編輯頁面勉吻,如下圖所示:
在動作編輯頁面中监婶,點擊每個按鍵旁邊的加號按鈕, 彈出窗口會詢問將此按鍵綁定為哪種模式齿桃,如下圖所示:
通常情況下惑惶,Single類型的動作可以設置為TRIGGER,Boolean類型的動作可以設置為BUTTON短纵。設定以后带污,在按鍵左下角點擊編輯按鈕,在顯示為None的位置
指定相應的動作香到,如下圖所示:
所有動作綁定完畢鱼冀,點擊頁面底部的Replace Default Binding按鈕报破,會將綁定設置保存到配置文件當中。在程序運行時千绪,無論是開發(fā)者還是游戲玩家充易,都可以
再次修改綁定配置,并且能夠反映到游戲當中荸型。默認情況下蔽氨,每個控制器上相同的按鍵綁定相同的動作,如果想為每個控制器設置不同的動作帆疟,比如鹉究,左手控制
器按下Touchpad實現傳送,而右手控制器按下Touchpad使用指針選擇物體踪宠,那么在這種情況下自赔,可以取消勾選頁面中的Mirror Mode復選框,然后分別為每個
控制器指定不同的動作柳琢。
在綁定編輯界面中同樣可以進行動作測試绍妨,點擊頁面底部的Input Debugger按鈕進入測試頁面,在此頁面中柬脸,將實時顯示各動作的狀態(tài)他去、動作綁定的按鍵、控
制器的實時數據等信息倒堕,如下圖所示:
八灾测、 在代碼中使用動作
此處以訪問platformer動作集下的Move動作為例,演示如何獲取動作狀態(tài)垦巴,執(zhí)行以下步驟:
打開SteamVR示例場景Simple Sample媳搪,選擇游戲對象[CameraRig],為其掛載SteamVR_ActivateActionSetOnLoad組件骤宣,并指定啟用platformer動作集秦爆,
如下圖所示:
新建C#腳本,并命名為GetMoveAction.cs憔披,編寫代碼如下所示:
using UnityEngine;
using Valve.VR;
public class GetMoveAction : MonoBehaviour
{
void Update()
{
if (SteamVR_Input.platformer.inActions.Move.GetChanged(SteamVR_Input_Sources.Any))
{
Vector2 pos = SteamVR_Input.platformer.inActions.Move.GetAxis(SteamVR_Input_Sources.Any);
Debug.Log(pos);
}
}
}
返回場景等限,將此腳本掛載到任意游戲對象上,保存場景運行程序芬膝,在任意控制器上觸摸Touchpad時望门,將在控制臺輸出如下信息:
九、Interaction System 的變化
從功能層面來看蔗候,本次更新在Interaction System中并沒有添加太多特性怒允,這從Interaction System的更新文檔中也可得出此結論埂软,如下圖所示:
Interaction System的示例場景進行了重新設計锈遥,如下圖所示:
在目前的示例場景中纫事,除包含SteamVR 2.0之前的大部分演示外,還加入了一些新的特性所灸。比如丽惶,對投擲(Throwing)部分做了擴展、添加了遙控器和遙控車爬立、
簡易的推動按鈕钾唬、手榴彈,以及一些關于Hand的示例侠驯。
在Throwing部分中抡秆,目前的示例能夠實現基于速度估計的交互,類似于另外一個VR開發(fā)工具NewtonVR能夠實現的效果——被抓取的物體不會直接穿過固定靜止的
障礙物吟策,而是跟隨Hand沿障礙物邊界滑動儒士。所有這些交互相關的參數都可以在Throwable組件中進行設置。
Remotes部分有兩個簡易控制器檩坚,提供了一種與物體進行間接交互的演示着撩。如下圖所示。
在場景中的Skeleton部分匾委,可以通過點擊按鈕來顯示和隱藏控制器模型拖叙,以及切換不同的手部模型,如下圖所示:
隨著版本的更新赂乐,Interaction System已經隨之支持Input System薯鳍。在源代碼中,可以看到Interaction System 開始使用 Input System 配置的行為進
行交互驅動挨措,如下圖所示:
十辐啄、VRTK 是否能夠繼續(xù)結合 SteamVR 2.0 使用
通過以上論述可見,如果VRTK沒有新版更新的話运嗜,理論上來說并不能使用 VRTK(當前版本為 3.2.1) 結合 SteamVR 2.0 進行開發(fā)壶辜,除非克隆VRTK源碼,
自行對其進行修改担租。這在 Asset Store 中也可找到了印證砸民,如下圖所示:
所以,當前版本的 VRTK (3.2.1)并不支持 SteamVR 2.0奋救。使用 VRTK 的開發(fā)者可繼續(xù)使用 SteamVR 1.2.3 進行開發(fā)岭参,SteamVR Plugin 的過往版本可
訪問以下鏈接進行下載。
https://github.com/ValveSoftware/steamvr_unity_plugin/releases