VRTK V4教程與oculus

參考https://academy.vrtk.io/
https://github.com/ExtendRealityLtd/VRTK.Prefabs#getting-started
https://github.com/ExtendRealityLtd/Tilia.SDK.OculusIntegration.Unity/blob/master/Documentation/HowToGuides/Installation/README.md

一,基本綁定
1.導(dǎo)入Oculus Integration
packages中導(dǎo)入oculus desktop

2.將vrtk和OculusIntegration.Unity導(dǎo)入到packages
選中Packages——>右鍵show in explorer-->在manifest.json添加下面的代碼將自動(dòng)導(dǎo)入
{
"scopedRegistries": [
{
"name": "npmjs",
"url": "https://registry.npmjs.org/",
"scopes": [
"io.extendreality"
]
}
],
"dependencies": {
"io.extendreality.vrtk.prefabs": "X.Y.Z", //vrtk對(duì)應(yīng)的版本號(hào)
"io.extendreality.tilia.sdk.oculusintegration.unity": "X.Y.Z" //OculusIntegration.Unity 對(duì)應(yīng)版本號(hào)
...
}
}

3.Player從Project Settings窗口的左側(cè)菜單中選擇。
在Player設(shè)置面板中,展開XR Settings。
在XR Settings確保Virtual Reality Supported選項(xiàng)被選中。
4.將OVRCameraRig拖入場(chǎng)景中并添加LinkedAliasAssociationCollection腳本,并將對(duì)應(yīng)組件進(jìn)行綁定,


image.png

5.將TrackedAliasFacade(中介)拖入場(chǎng)景并將OVRCameraRig添加到Elements下面,并在LeftControllerAlias添加正方形(0..1,0.1,0.3)作為手臂,接入設(shè)備運(yùn)行就可以左右手柄變成方塊跟隨手移動(dòng)


image.png

二,動(dòng)作

  1. 導(dǎo)入控制器預(yù)制件(UnityXR.OpenVR.RightController或UnityXR.Oculus.RightController)


    image.png

    OculusControllersRightTouchControllers.jpg

2.選擇控制器上的一個(gè)按鈕綁定事件,按鈕按下時(shí)隱藏地面,按鈕松開后顯示地面
該Unity Button Action組件具有4個(gè)可以關(guān)聯(lián)的事件:

激活狀態(tài)已更改:當(dāng)操作的激活狀態(tài)從上一個(gè)狀態(tài)更改時(shí),發(fā)出此消息。
已激活:按下按鈕時(shí)發(fā)射。
值已更改:當(dāng)按鈕值的狀態(tài)發(fā)生更改時(shí)發(fā)出,例如從按下變?yōu)獒尫拧?br> 禁用:釋放按鈕且不再按下時(shí)發(fā)射。


3.自定義的Unity Button Action
創(chuàng)建一個(gè)空物體,添加Unity Button Action腳本,同上綁定事件,然后指點(diǎn)一個(gè)按鈕激活


image.png

運(yùn)行項(xiàng)目按下右手柄的A鍵地面消失,松開地面顯示。

4.添加Unity軸動(dòng)作

有兩種Unity軸動(dòng)作:
Unity 1D Axis(Unity 1D軸):偵聽單個(gè)軸上的更改,并為該軸更改發(fā)出一個(gè)float值。
Unity 2D軸:偵聽兩個(gè)軸上的更改,并發(fā)出將兩個(gè)軸更改組合在一起的Vector2值。

在Unity Axis 1D Action和Unity Axis 2D Action組件具有可以掛到4個(gè)事件:
激活狀態(tài)已更改:當(dāng)操作的激活狀態(tài)從上一個(gè)狀態(tài)更改時(shí),發(fā)出此消息。
已激活:當(dāng)軸值不再是默認(rèn)值時(shí)發(fā)出。
值更改:軸值更改時(shí)發(fā)出。
禁用:當(dāng)軸值返回到設(shè)置的默認(rèn)值時(shí)發(fā)射。

創(chuàng)建一個(gè)名為的新軸VRTK_Axis10_RightTrigger,該軸將使我們能夠在正確的控制器的觸發(fā)點(diǎn)上拾取軸的變化。

image.png

Material在Unity Project中創(chuàng)建一個(gè)新項(xiàng),并將其保留在Standard著色器上,但將更Rendering Mode改為Transparent。

image.png

在組件的Axis Name參數(shù)中Unity 1D Axis Action,輸入VRTK_Axis10_RightTrigger作為值。這是我們與Unity Input Manager定義的右控制器觸發(fā)軸關(guān)聯(lián)的預(yù)定義名稱。


image.png

場(chǎng)景腳本改變材質(zhì)的透明度
using UnityEngine;
public class OpacityChanger : MonoBehaviour
{
public Material target;
public void UpdateOpacity(float alphaValue)
{
Color color = target.color;
color.a = alphaValue;
target.color = color;
}
}

image.png

在Value Changed事件發(fā)出時(shí)執(zhí)行


image.png

運(yùn)行項(xiàng)目扣動(dòng)右手柄的扳機(jī)鍵可以看到小球透明度改變。

5.創(chuàng)建代理操作和鏈接操作
我們將把動(dòng)作功能移動(dòng)到代理動(dòng)作,然后將按鈕按下動(dòng)作和鍵盤動(dòng)作鏈接到這個(gè)新創(chuàng)建的代理動(dòng)作。這會(huì)將我們的輸出功能移到一個(gè)位置,并允許我們從許多不同的動(dòng)作中調(diào)用它。

創(chuàng)建空物體添加Boolean Action腳本,然后綁定按下和松開的事件
展開Sources參數(shù),然后在Size參數(shù)字段中輸入所需的其他操作數(shù)進(jìn)行監(jiān)視。在這個(gè)例子中,我們想觀看其他兩個(gè)動(dòng)作(菜單鍵Unity Button Action和空格鍵Unity Button Action),所以進(jìn)入2到Sizes參數(shù)字段。
之前兩個(gè)按鈕綁定的事件可以刪除了


image.png

運(yùn)行項(xiàng)目,右手柄A鍵和空格鍵可以執(zhí)行剛才的動(dòng)作。

三,指針和位移

1.直指針
筆直指針預(yù)制件從起點(diǎn)到最大指定長(zhǎng)度投射一條直線,或者直到指針光束與有效目標(biāo)碰撞為止。
將ObjectPointer.Straight預(yù)制件拖入場(chǎng)景

跟蹤的目標(biāo)
該Follow Source參數(shù)確定指針應(yīng)在場(chǎng)景中跟蹤哪個(gè)GameObject,TrackedAlias -> Aliases -> RightControllerAlias到組件的Follow Source參數(shù)中


image.png

觸發(fā)的按鍵
將UnityXR.OpenVR.RightController -> Trackpad -> Touch[17]GameObject 拖放到組件Activation Action


image.png

2.彎曲的指針
彎曲指針(也稱為貝塞爾曲線或拋物線形指針)從原點(diǎn)開始向前彎曲一定距離,然后向下投射一條直線,直到它與對(duì)撞機(jī)碰撞為止。用貝塞爾曲線表示該向前然后向下的投影,該曲線基本上畫出了光束原點(diǎn)和最終目標(biāo)點(diǎn)之間的曲線。
同直指針添加跟隨的目標(biāo)和觸發(fā)的按鍵


image.png

3.移動(dòng)
傳送有兩種主要類型:

即時(shí)-用戶指定目的地位置(例如,用控制器指針標(biāo)記),然后通常通過相機(jī)淡入淡出立即出現(xiàn)在目的地,以減少暈動(dòng)病。
破折號(hào)-用戶指定目標(biāo)位置,并且用戶會(huì)隨著時(shí)間的推移以線性運(yùn)動(dòng)逐漸移動(dòng),直到他們到達(dá)其目標(biāo)位置。

將Teleporter.Instant拖入場(chǎng)景
Target所述參數(shù)Teleporter Facade組件確定哪些游戲物體實(shí)際的瞬間移動(dòng)方法移動(dòng)。通常,“攝影機(jī)裝備”是我們要移動(dòng)的GameObject,因?yàn)樗覀兊奶摂M玩家。

Offset參數(shù)確定另一個(gè)GameObject,該對(duì)象可用來描述在移動(dòng)時(shí)要考慮Target的偏移量,在這種情況下,偏移量是用戶的耳機(jī)位置相對(duì)于其游戲區(qū)域的差。

要執(zhí)行此相機(jī)閃爍,傳送器需要了解場(chǎng)景中要應(yīng)用淡入淡出的相機(jī)。該Camera Validityon參數(shù)TeleporterFacade組件允許我們指定鏈接這件事的簡(jiǎn)單方法


image.png

現(xiàn)在,我們?cè)趫?chǎng)景中有一個(gè)可以正常使用的傳送器,我們只需要一種方法就可以告訴傳送器移動(dòng)到所需的目標(biāo)位置。

image.png
image.png

運(yùn)行場(chǎng)景點(diǎn)擊右手柄的遙感鍵就可以實(shí)現(xiàn)移動(dòng)了。

4.添加箭頭
查找 arrow prefab并添加到對(duì)應(yīng)位置,設(shè)置坐標(biāo)如下圖


image.png

創(chuàng)建兩個(gè)新的空GameObject ,并將OVRInputAxis2DAction 腳本附加到每個(gè)腳本。
將兩個(gè)OVRInputAxis2DAction 腳本的touch屬性值設(shè)置為Primary Thumbstick 。將控制器屬性值分別設(shè)置為L(zhǎng) Touch 和R Touch

image.png

再在他下面添加兩個(gè)空物體并掛上Vector2ToFloat 和FloatAction

image.png

將AxisRotator 預(yù)制件拖入并添加相應(yīng)組件如下圖


image.png

將 TeleporterFacade中 Offset Usage 設(shè)置為Offset Always With Destination Rotation.


image.png

然后運(yùn)行項(xiàng)目,現(xiàn)在可以用觸控按鈕控制視角的方向了。

5.對(duì)玩家可以傳送的地方增加限制
新建新層命名為Teleportable
將地面層改為Teleportable
創(chuàng)建一個(gè)空物體(TeleportRule)添加 AnyLayerRule腳本,并把layer mask設(shè)置為 Teleportable
將TeleportRule拖到TeleporterFacade和PointerFacade中TargetValidity選擇中


image.png

運(yùn)行項(xiàng)目,現(xiàn)在只有點(diǎn)擊地板才會(huì)顯示可移動(dòng),其他地方顯示紅色不可移動(dòng)

6.探索如何添加“傳送目標(biāo)”,從而允許播放器將其傳送光線捕捉到固定位置。
新建空物體名TeleportTarget,添加兩個(gè)腳本ActionDispatcher,TransformDataProxyEmitter
并將指定如下圖的腳本


image.png

搜索DestinationPoint Variant預(yù)制件,添加多個(gè)到想要傳送的位置,將他們層級(jí)改為Teleportable,并指定腳本如下圖


image.png

并在PointerFacade添加如下圖的方法


image.png

現(xiàn)在運(yùn)行項(xiàng)目,就可以傳送到目標(biāo)點(diǎn)了

7.右鍵隱形傳送

創(chuàng)建空物體命名為TeleporterActivation.R,添加TeleporterActivation 腳本,并將Controller 字段設(shè)置為R Touch。
創(chuàng)建空物體命名為TeleporterSelection.R,添加TeleporterSelection 腳本,并將Controller 字段設(shè)置為R Touch。
在TeleporterSelection 腳本游戲?qū)ο笙聞?chuàng)建兩個(gè)新的空GameObject,將FloatAction 腳本附加到每個(gè)對(duì)象。
將這兩個(gè)物體拖到TeleporterSelection 中如下圖


image.png

將AxisRotatorFacade 腳本中的“ 橫軸” 和“ 縱軸” 字段重新分配給兩個(gè)新的FloatAction 腳本游戲?qū)ο蟆?br> 禁用OVRInputTouch,OVRInputButtonAction和OVRIInputAxis2DAction 腳本游戲?qū)ο蟮挠沂帧?/p>

image.png

將右側(cè)PointerFacade 腳本中的“ 激活操作” 和“ 選擇操作” 字段分別重新分配給TeleporterActivation 和TeleporterSelection 腳本游戲?qū)ο蟆?br>
image.png

運(yùn)行項(xiàng)目,現(xiàn)在要按下右扳機(jī)鍵射線才出現(xiàn)

8.左鍵控制轉(zhuǎn)向

禁用場(chǎng)景中的左手ObjectPointerCurved 預(yù)制件,并禁用左手的OVRInputTouch,OVRInputButtonAction 腳本游戲?qū)ο蟆?br> 在項(xiàng)目窗口中,找到AxesToVector3 預(yù)制并將其拖到場(chǎng)景中。
在附加到預(yù)制對(duì)象的AxesToVector3Facade 腳本中,將“ 軸使用類型” 字段下拉列表設(shè)置為“ Directional”。
將“ Lateral Axis” 字段設(shè)置為位于左側(cè)OVRIInputAxis2DAction 腳本游戲?qū)ο笙碌腦軸值FloatAction 腳本游戲?qū)ο蟆?br> 將“ Lateral Speed Multiplier” 字段值設(shè)置為45,將“ Longitudinal Speed Multiplier” 字段值設(shè)置為0。
添加Vector3Cache 腳本,將他拖到 Processed 下面調(diào)用CachedData方法
再添加CameraColorOverlay 腳本,在Vector3Cache 腳本中添加CameraColorOverlay / Blink。
在CameraColorOverlay 腳本中,將SceneCameras 場(chǎng)景對(duì)象分配給“ Camera Validity” 字段。
在項(xiàng)目中找到TeleportFade 材質(zhì),并將其分配給CameraColorOverlay 腳本中的“ Overlay Material ” 字段,然后將“ Remove Duration” 字段的值更改為0.5。
具體如下圖


image.png

創(chuàng)建一個(gè)新的空GameObject,命名為SnapRotator,添加Vector3ToVector2 腳本和Vector2ToVector3 腳本,TransformEulerRotationMutator
并做如下操作


image.png

image.png

9.阻止玩家瀏覽對(duì)象內(nèi)部(屏幕變黑)

在場(chǎng)景中禁用Teleporter.Instant預(yù)制對(duì)象下的SnapToFloor 對(duì)象。
在項(xiàng)目中找到CollisionFader 預(yù)制件,并將其拖動(dòng)到HeadsetAlias 場(chǎng)景對(duì)象下的場(chǎng)景中。
在CollisionFader 預(yù)制件附帶的CameraColorOverlay 腳本中,將CameraValidity 字段設(shè)置為SceneCameras 場(chǎng)景對(duì)象。
創(chuàng)建兩個(gè)名為FadeCamera 和FadeOut的新圖層。將CollisionFader 預(yù)制對(duì)象放在FadeCamera層上。
將櫥柜場(chǎng)景對(duì)象放在FadeOut 層上。


image.png

打開頂部欄中的“ 編輯” 菜單,然后選擇“ 項(xiàng)目設(shè)置”。導(dǎo)航到“ 物理” 選項(xiàng)卡。
切換碰撞矩陣,以便FadeCamera 層僅與FadeOut 層碰撞。


image.png

將OVRCameraRig 場(chǎng)景游戲?qū)ο笙隆?攝影機(jī)” 腳本上的“ ClearFlags” 字段值更改為“ 純色”,然后將顏色設(shè)置為黑色。

image.png

四,交互(unity oculus教程)

1.添加手和手柄模型
添加手
在項(xiàng)目中找到CustomHandLeft 和CustomHandRight 預(yù)制件,并將它們添加到場(chǎng)景中相應(yīng)的LeftControllerAlias 和RightControllerAlias 預(yù)制件下面。
在CustomHandLeft 和CustomHandRight 場(chǎng)景對(duì)象上禁用OVRGrabber 腳本。
在LeftControllerAlias 和RightControllerAlias 層次結(jié)構(gòu)中,禁用Cube 對(duì)象的MeshRenderer 組件。
將CustomHandLeft 和CustomHandRight 場(chǎng)景對(duì)象的層設(shè)置 為“ 忽略射線廣播” 。
戴上HMD 并比較真實(shí)手和虛擬手的位置。

添加手柄
在項(xiàng)目視圖中的Oculus / VR / Meshes / OculusTouchForQuestAndRiftS 文件夾中找到OculusTouchForQuestAndRiftS_Left 和OculusTouchForQuestAndRiftS_Right 模型 ,并將它們分別添加到LeftControllerAlias 和RightControllerAlias 場(chǎng)景對(duì)象層次結(jié)構(gòu)中。

image.png

2.添加交互器

在項(xiàng)目中找到Interactor 預(yù)制件,然后在場(chǎng)景中的LeftControllerAlias 和RightControllerAlias 預(yù)制件下面添加一個(gè)。
在每個(gè)Interactor 對(duì)象層次結(jié)構(gòu)中的ExampleAvatar對(duì)象上禁用MeshRenderer 。

在場(chǎng)景中創(chuàng)建兩個(gè)新的空GameObject ,然后使用檢查器中的“添加組件” 按鈕將OVRInputAxis1DAction 和FloatToBoolean 腳本添加 到每個(gè)對(duì)象。
在FloatToBoolean 腳本中,將“ Positive Bounds” 字段設(shè)置為0.75與1之間。
在每個(gè)OVRInputAxis1DAction 腳本中,將Controller 字段設(shè)置為相應(yīng)的L Touch 和R Touch 值,并將Axis 字段設(shè)置為Primary Hand Trigger 。
使用檢查器中的“添加組件” 按鈕將BooleanAction 腳本添加到每個(gè)對(duì)象。
在OVRInputAxis1DAction 腳本中,在ValueChanged 單操作列表下添加一個(gè)新的單操作對(duì)象。添加父GameObject 并將下拉列表設(shè)置為FloatToBoolean / DoTransform 。
在FloatToBoolean 腳本中,在“ 轉(zhuǎn)換后的布爾動(dòng)作”列表下添加一個(gè)新的布爾動(dòng)作對(duì)象。添加父GameObject 并將下拉列表設(shè)置為BooleanAction / Receive 。
在場(chǎng)景中Interactor 預(yù)制件上的InteractorFacade 腳本中,將“ 抓取動(dòng)作” 字段設(shè)置為相應(yīng)的BooleanAction 腳本游戲?qū)ο蟆?br> 具體如下圖


image.png
image.png

3,添加交互物體
將Interactable.Primary_Grab.Secondary_Swap 預(yù)制件拖入場(chǎng)景,并將他的參數(shù)設(shè)置和想要互動(dòng)的物體參數(shù)一致,然后把
禁用DefaultMesh 對(duì)象,將想要物體拖入他里面,位置歸零代替DefaultMesh


image.png

4.添加OVR速度跟蹤器(丟物體出去物體可以獲得你的速度和角度)
將OVRAnchorVelocityEstimator 腳本添加到LeftHandAnchor,RightHandAnchor 和CenterEyeAnchor 場(chǎng)景對(duì)象。
在每個(gè)OVRAnchorVelocityEstimator 腳本中,將Tracked GameObject 字段設(shè)置為父游戲?qū)ο螅elative To 字段設(shè)置為TrackingSpace(OVRCameraRig也可以) 場(chǎng)景對(duì)象。
在附加到OVRCameraRig 場(chǎng)景對(duì)象的LinkedAliasAssociationCollection 腳本中,將Headset Velocity Tracker 字段設(shè)置為CenterEyeAnchor 場(chǎng)景對(duì)象,將Left Controller Velocity Tracker 字段設(shè)置為L(zhǎng)eftHandAnchor 場(chǎng)景對(duì)象,并將Right Controller Velocity Tracker 字段設(shè)置為RightHandAnchor 場(chǎng)景對(duì)象。
對(duì)于每個(gè)Interactor 預(yù)制件,將InteractorFacade 腳本的Velocity Tracker 字段設(shè)置為相應(yīng)的LeftControllerAlias 和RightControllerAlias。

image.png

image.png

5.抓取時(shí)隱藏手臂
對(duì)于每個(gè)Interactor 預(yù)制件,在InteractorFacade 腳本中,在Grabbed 和Ungrabbed InteractableFacade操作列表下創(chuàng)建一個(gè)新的InteractableFacade 操作對(duì)象,并分配相應(yīng)的CustomHandLeft 和CustomHandRight 場(chǎng)景對(duì)象。
將下拉功能值設(shè)置為GameObject / SetActive,然后將“未抓取” 列表中的操作切換為true。


image.png

6.拉取抽屜
將DirectionalJointDrive 預(yù)制件放入場(chǎng)景,復(fù)制一個(gè)抽屜模型替換為Meshes 對(duì)象
注意如何限制抽屜進(jìn)入后的位置,可以把Target value設(shè)置為1,如何運(yùn)行看抽屜到哪里然后移動(dòng)DirectionalJointDrive直到完全進(jìn)入記錄他的位置之后賦值給他


image.png

7.位置擺放提示
InteractableSnapZone 拖入要放置的位置,將要放置的鑰匙替換DefaultHighlightMesh,然后更換發(fā)光材質(zhì)
添加新層keylayer,將原來的鑰匙層改為keylayer,創(chuàng)建空物體添加腳本AnyLayerRule 腳本。將“ Layer Mask” 字段下拉列表的值設(shè)置為KeyLayer,拖入到InteractableSnapZone中Snap Validity屬性。
并指定鑰匙插入后的觸發(fā)事件


image.png

四,交互(vrtk教程可以忽略)

Touch -交互器與有效的可交互對(duì)象發(fā)生物理碰撞的位置的概念。
Grab -交互器可在何處動(dòng)作以通知有效的觸摸式可交互對(duì)象該交互器要啟動(dòng)可交互對(duì)象的抓取功能的概念。

1.添加交互器
將之前cube換成Interactor,指定他的觸發(fā)條件和跟隨物體


image.png

2.添加互動(dòng)(對(duì)象)
Interactable.Primary_Grab.Secondary_Swap預(yù)制件

現(xiàn)在運(yùn)行場(chǎng)景扣動(dòng)右手柄的扳機(jī)鍵就可以將物體拿起來。但是你丟物體出去,物體獲取不到你的丟的力度

3.OVR速度跟蹤器(丟物體出去物體可以獲得你的速度和角度)
https://github.com/ExtendRealityLtd/Tilia.SDK.OculusIntegration.Unity

修改package文件
{
"scopedRegistries": [
{
"name": "npmjs",
"url": "https://registry.npmjs.org/",
"scopes": [
"io.extendreality"
]
}
],
"dependencies": {
"io.extendreality.tilia.sdk.oculusintegration.unity": "X.Y.Z",
...
}
}

將OVRAnchorVelocityEstimator拖入OVRCameraRig中如下圖操作


image.png
image.png
image.png
image.png

現(xiàn)在運(yùn)行項(xiàng)目,丟物體,物體將獲得速度和角速度

五,UI交互

1.切換場(chǎng)景

創(chuàng)建一個(gè)新的空游戲?qū)ο?,并附加PauseMenuLogic 腳本。
將Teleporter_Instant 場(chǎng)景對(duì)象分配給Teleporter 字段,將PlayAreaAlias 對(duì)象分配給PlayArea 字段,并將Headset Alias 對(duì)象分配給HeadOrientation 字段。
在“ 暫停區(qū)域” 場(chǎng)景對(duì)象層次結(jié)構(gòu)中找到“ 傳送目標(biāo)” 對(duì)象,并將其分配給PauseMenuLogic 腳本的“ 暫停位置” 字段,并將父游戲?qū)ο笤O(shè)置為“ 游戲位置” 字段。
創(chuàng)建一個(gè)新的空游戲?qū)ο?,并附加OVRInputButtonAction 腳本。將“ 控制器” 和“ 按鈕” 字段分別設(shè)置為L(zhǎng) touch 和“ 開始” 。
在OVRInputButtonAction 腳本的Activated boolean action列表中 添加一個(gè)新的布爾動(dòng)作,并分配PauseMenuLogic 腳本對(duì)象。
將下拉菜單設(shè)置為PauseMenuLogic / SwitchRooms。

image.png
image.png

2.UI響應(yīng)
將UIHelpers 拖入場(chǎng)景中,
創(chuàng)建UI更改為World Space,調(diào)整大小和位置,刪除GraphicsRaycaster 組件并添加OVRRaycaster 腳本。
禁用UIHelperLaserPointer,在PauseMenuLogic添加屬性

image.png
image.png

注意采用textmeshPro顯示效果更好,要勾選Extra Padding

image.png

3.物理UI交互
在LeftControllerAlias和

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。