VRTK 3.2.0版本Demo詳解

VRTK是擴展SteamVR的一個Unity3D插件,主要是爲了方便開發者快速地開發出vr產品,其內置了相當多的當下比較成熟的VR界面下的交互、操作等解決方案,目前最新版本爲3.2.0,支持了更多VR設備,功能也更加強大。然而我昨天才知道並下載。。因此寫下此文章來供自己參考,當然也歡迎討論新插件的黑科技。。

另外steamVR也更新到了1.2.1,其中也有一個Demo場景,也實現了相當多的交互操作,雖然目前版本功能並沒有VRTK提供的功能強大,但是使用起來感覺非常流暢,其中的射箭Demo完全就跟TheLab中的射箭操作感一模一樣。。相比之下vrtk那個寒酸的射箭場景就....如果steamVR在下個版本提供更多Demo場景和更強大的功能,我想會搶走相當多的steamVR開發者拋棄vrtk了吧。。。哈哈

因爲我是從老版本轉過來的,因此可能很多地方會和老版本作對比。還有一些Demo場景未寫,原因是跟老版本差別不大因此不再浪費時間解釋。望諒解哈。

開始:

最大的感覺就是vrtk更加專業了,支持更多vr設備,每個demo都可以選擇當前測試用的設備,由一個VRTK_SDK Manager腳本去動態確定用戶使用的設備並由VRTK_SDKSetup腳本內的變量確定最終用戶使用的左右手和頭部以及其他一些信息。所有vrtk相關腳本直接掛在[VRTK_Scripts]對象下,再拖給VRTK_SDK Manager使其運行時自動找到設備左右手作爲父對象。因此直接拖動camerarig到場景裏就無效了。。相機直接看不了,似乎只能通過VRTK_SDK Manager的方式來管理場景VR相機。
另外steamVR在1.2.1版本中也有很多例子,關節、射箭、ui。。很多功能和vrtk出現衝突,很糾結。
注:7月6日vrtk更新到3.2.1,解決了和steamvr 1.2.2版本衝突的問題,以及一些小bug的修復;

測試發現VRTK_TrackObjectGrabAttach跟蹤抓取在碰撞很多的地方比關節抓取效果要好一些,關節抓取控制器在碰撞體內時被抓取得物體會亂飛,但是跟蹤抓取試了一下似乎沒有這個問題。

VRTK_ObjectAppearance靜態類包含一些操作gameobject的功能,例如將其高亮,改變透明度等(高亮需要這個gameobject掛了繼承
VRTK_BaseHighlighter的組件,例如VRTK_OutlineObjectCopyHighlighter,還需要先調用該組件的Initialise初始化方法之後才能
用VRTK_ObjectAppearance高亮)。


002_Controller_Events 例子就是將vrtk_controllerevents腳本掛在了[VRTK_Scripts]下的左右手對象上,運行時會自動找到當前設備左右手變成他們的子物體,實現數據監聽。


003_Controller_SimplePointer 傳統的vrtk_SimplePoint被取代了,現在的做法是移動手加上VRTK_StraightPointerRenderer和VRTK_Pointer來替代。


004_CameraRig_BasicTeleport 傳統的VRTK_BasicTeleport腳本現在不添加在camerarig上了,而是也添加在[VRTK_Scripts]下,可以隨便建一個gameobject然後添加在上面,該腳本會自動尋找當前頭盔的。


005_Controller_BasicObjectGrabbing 手柄上添加的腳本不變,傳統可抓取物體只掛一個VRTK_InteractableObject就可以了,但是新版本分離了抓取方式和是否可換手(Is Swappable)選項,需要獨立去掛例如VRTK_FixedJointGrabAttach關節抓取以及VRTK_SwapControllerGrabAction可交換手的腳本(這兩個腳本需對應VRTK_InteractableObject腳本的grabAttachMechanicScript對象和secondaryGrabActionScript對象,若沒有對應則默認生成一個關節抓取並對應。交換手沒有對應的話默認此物體不能交換)。另外還有一個重要的腳本:VRTK_OutlineObjectCopyHighlighter腳本可以爲被抓取物體提供邊緣高亮,而不再是整體高亮。這個我看了舊版本也有此腳本,但是被我忽略了,好逗比啊。。有這個腳本就可以不依靠highlight插件直接使用vrtk就能給物體添加輪廓高亮了。


007_CameraRig_HeightAdjustTeleport 例子分離了VRTK_HeightAdjustTeleport腳本,從中分離出了一個VRTK_BodyPhysics腳本可以更加詳細地爲玩家添加物理屬性,添加的碰撞體也由原來的一個圓柱改爲了兩個圓柱,上大下小模擬身體和腿..另外還分離出了一個VRTK_PolicyList腳本用來添加層/tag/類是否被過濾。例如此demo VRTK_PolicyList添加在了VRTK_HeightAdjustTeleport上,內容爲ExcludeTeleport,因此移動會過濾掉添加了ExcludeTeleport的類/層/tag。可以查看VRTK_PolicyList類的Check方法查看被哪些腳本調用因此這些腳本可添加此腳本。


008_Controller_UsingAGrabbedObject這個例子又從VRTK_InteractableObject腳本上分離出來了一個VRTK_InteractControllerAppearance腳本。該腳本效果同舊版本的抓取/觸摸/使用時隱藏控制器。以及場景中還有一些比老版本更多的其他可交互物體。

011_Camera_HeadSetCollisionFading 這個例子中[VRTK_Scripts]下掛的腳本VRTK_HeadsetCollision有一個對象:headset,它

運行時動態尋找當前頭盔並變爲其子物體。新版本中很多掛在[VRTK_Scripts]下的腳本都是以此方法尋找到正確的當前VR設備,因此開發者不需要考慮我用htcVive時和Oculus時腳本需要做出什麼改變,vrtk會自動幫你做這塊的工作。


012_Controller_PointerWithAreaCollision 利用VRTK_BodyPhysics和VRTK_HeadsetCollision給角色全身添加了碰撞體。另外還

在手柄上分離了VRTK_PlayAreaCursor腳本來顯示移動時遊玩範圍指示,另外和舊版本一樣勾選了此腳本上的

HandlePlayAreaCursorCollisions來限制玩家不能移動到遊玩範圍碰撞到其他碰撞體的位置。


017_CameraRig_TouchpadWalking 老版本直接在camerarig上添加VRTK_TouchpadWalking腳本就行了。新版本需要在移動的手柄

上加VRTK_TouchpadControl腳本來控制移動。


021_Controller_GrabbingObjectsWithJoints 這個場景新增加了些東西,例如一個藍色盒子,主要用來演示

VRTK_SpringJointGrabAttach這個腳本,物體被抓取時創建一個關節,感覺就像抓到一個很重的東西。

還有一個滅火器,管子是用彈簧關節連接的(雖然效果還是很假...),然後管頭也可以抓取,還可以設置BreakDistance,這個值是

自定義的,超出範圍後手動調用交互物體類的ForceStopInteracting方法就可以強制放下對象(因爲管頭用的是追蹤連接,不能像

關節連接一樣設置breakForce,因此只能這樣去判斷)。

然後還有一把手槍,其中開槍後會打開手槍腳本並移動手槍頂的位置,手槍頂的關節會將其強行拉回來,感覺就像是開槍產生的動畫

另外槍上還有一個保險栓,可以打開或關閉使槍不能射擊(保險栓碰撞很小,之前舊版本這種小碰撞體很難觸摸到,但是新版本卻

容易,可能vrtk新版本有優化吧)。


023_Controller_ChildOfControllerOnGrab 射箭例子在[VRTK_Scripts]中出現了新腳本:HeadsetFollower對象上掛的

VRTK_SDKObjectAlias 掛了這個腳本的物體會在運行時自動變爲所選SdkObject的子物體(只看到了頭和camerarig的子物

體的選項,可以自己擴展左右手),然後Headset對象掛了一個VRTK_TransformFollow腳本,GameObjectToFollow就是

HeadsetFollower對象,GameObjectToChange則是自己。這樣最終效果就是HeadsetFollower對象和頭部位置一致,然後

Headset也與HeadsetFollower對象位置一致,都是頭部子物體,取箭就可以在頭部取。


024_CameraRig_ExcludeTeleportLocations 例子展示有些地區不能移動,利用了VRTK_PolicyList。


025_Controls_Overview 這個場景使用vrtk自帶腳本實現了vr模式下的一些物理交互,值得一提的是有一個旋轉按鈕在老版本中是

沒有最大最小值限制的,就像煤氣竈開關一樣,但是卻可以無限旋轉。。所以新版本新加了更多交互例子,也爲旋轉按鈕增加了限制。


027_CameraRig_TeleportByModelVillage 這個例子運用了ModelVillage_TeleportLocation腳本實現靠近三個方塊中的一個後按下

扳機鍵後傳送到某處。舊版本也有這個例子但是當時沒看。。注意場景這個桌子也是利用023demo的腳本讓桌子變成camerarig的子

物體。


028_CameraRig_RoomExtender 這個例子使用了VRTK_RoomExtender腳本來擴展遊玩範圍,但是無論老版本還是新版本效果都不太好。。


029_Controller_Tooltips 這個例子是各種提示..其實沒啥好說的,看看demo就都懂了。唯一跟老版本的一點區別就是加了一個

VRTK_HeadsetControllerAware腳本用來控制手柄距離多近之後顯示提示。


030_Controls_RadialTouchpadMenu 例子是手柄選擇的ui,還有靠近物體時顯示一個可選擇選項的ui。沒有細看,以後可能會用到

,所以mark一下。。


031_CameraRig_HeadsetGazePointer 這個例子一個是靠頭盔來移動,一個是靠頭頂上一個黃球對象控制移動。可能沒什麼用,但

還挺有意思,以後說不定會用到,再mark一下!


032_Controller_CustomControllerModel 改變控制器模型的例子,這個真沒什麼好說的了。


034_Controls_InteractingWithUnityUI 這個例子最大的改變就是有了一個可拖動的UI,主要是用了VRTK_UIDraggableItem這

個腳本,配合VRTK_UIDropZone腳本實現物體可拖入方框。注意VRTK_UIDraggableItem要勾選restrictToDropZone代表

可拖入掛了VRTK_UIDropZone的框框中去,另外一個restrictToOriginalCanvas表示物體是否可拖入canvas畫布中。另

外這個拖動完美兼容ugui的EventTrigger腳本,具體使用方法可以參考例子。


035_Controller_OpacityAndHighlighting 這個例子控制器按下任何按鍵都會高亮該按鍵並且提示ui,可以參考腳本:

VRTK_ControllerAppearance_Example。手柄高亮仍然依靠VRTK_OutlineObjectCopyHighlighter腳本控制。另外這裏有個功能:

VRTK_ObjectAppearance.SetOpacity(GameObject model, float alpha, float transitionDuration = 0f)

方法可以設置一個model的透明度。


037_CameraRig_ClimbingFalling 這個例子每個物體都掛了VRTK_ClimbableGrabAttach腳本使得可以用手柄攀爬(可交互物體使用

該腳本後不能再給可交互物體增加其他抓取方式)。另外場景中還有一個繩索,抓住之後會位移這個繩索實現滑動效果。

040_Controls_PanelMenu 這個例子使用了PanelMunu這個預設體放爲可交互對象的子物體,按下pad對應按鍵後會彈出對應ui,一

些可交互ui需要調用VRTK_PanelMenuItemController對應的事件方法,具體可以參考此demo。


041_Controller_ObjectSnappingToDropZones 這個例子利用了SnapDropZone這個預設體實現物體放到指定位置拼裝的功能,左邊

簡單物體的拼裝效果還不錯,但是右邊人體的拼裝體驗很差,稍不注意胳膊腿就飛了。。即使關節的breakForce設置了infinity但

是還是無效。。回頭如果這個功能運用到項目中的話還存在這個問題那這個功能就很雞肋了。。


042_CameraRig_MoveInPlace 之前demo有一個是用pad鍵控制移動,是一個很雞肋的功能,因爲會很暈。vrtk似乎注意到了這個問

題,所以這個demo更改了移動方式,利用VRTK_MoveInPlace腳本實現控制器按下某個鍵之後不停地做Y軸移動纔開始移動,這樣會

使玩家增加一點沉浸感,雖然暫時還是覺得很雞肋啊!


043_Controller_SecondaryControllerActions 這個場景共有兩個有用的腳本,一個是放着長槍和柺杖上的

VRTK_ControlDirectionGrabAction腳本,它的用處是使這個可交互物體變爲可雙手抓取,一個手抓取,另一個手控制旋轉。想象

一下手持shotGun的時候就需要雙手,一個細節是掛了此腳本的可交互物體不能用關節控制器,如果勾選PrecisionGrab(按當前控

制器位置抓取)後另一隻手控制的旋轉就不會復位,如果使用了SnapHandle那麼另一隻手鬆開後旋轉會復位。然後另一個腳本是

VRTK_AxisScaleGrabAction,它可以讓另一隻手改變物體縮放。


044_CameraRig_RestrictedTeleportZones 最後一個例子主要展示了固定目標點位移。主要是依靠DestinationPoint這個預設體,

上面掛的腳本VRTK_DestinationPoint很明瞭了:開關傳送、默認樣式,hover的樣式以及關閉時的樣式等等的功能。目前我在開

發的一個項目就是需要這種定點傳送,奈何我還用着老版本的vrtk..都是淚啊。。


總結:

花了大半天的時間總算大致看完了新版vrtk的demo。其實怎麼說呢,我一直認爲這些插件一定要把這些demo仔細看一遍,這樣在

開發時心裏纔能有一些底。vrtk的確很強大,但它並不是百科全書。遇到問題時纔來匆匆忙忙一個一個查找demo費時又費力,而

且也不一定有你需要的效果。而如果你完整的看過vrtk的所有demo,遇到問題時可以先在腦子過一遍vrtk是否已經有了解決方案?

如果沒有是否有類似的效果,能否改改就用呢?這樣在美術或者策劃帶着天馬行空的想法來要求你實現時你才能更得心應手地預

估他們的想法實現難度。不過雖然這麼說估計我馬上也要轉行做別的了,vr實現的效果畢竟還是有些簡單,而且我目前也在我司

看不到任何前途。。希望以後vrtk和steamvr更加強大,能夠推出更強大的插件吧。。也希望vr不要就此沒落啦...



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章