控制器、指標和焦點 — MRTK2

控制器、指標和焦點都是以核心輸入系統所建立基礎為基礎的較高層級概念。 它們一起提供與場景中物件互動的一大部分機制。

控制器

控制器是實體控制器的標記法, (6 度自由度、表達的手部等) 。 它們是由裝置管理員所建立,並負責與對應的基礎系統通訊,並將該資料轉譯成 MRTK 型資料和事件。a

例如,在Windows Mixed Reality平臺上, WindowsMixedRealityArticulatedHand 是負責與基礎 Windows手部追蹤 API互動的控制器,以取得手部聯合、姿勢和其他屬性的相關資訊。 它負責將此資料轉換成相關的 MRTK 事件 (例如,呼叫 RaisePoseInputChanged 或 RaiseHandJointsUpdated) ,以及更新自己的內部狀態,讓查詢 TryGetJointPose 傳回正確的資料。

一般而言,控制器的生命週期將涉及:

  1. 例如,裝置管理員會在偵測到新的來源 (時由裝置管理員建立,例如,裝置管理員會偵測並開始追蹤手部) 。

  2. 在控制器的 Update () 迴圈中,它會呼叫其基礎 API 系統。

  3. 在相同的更新迴圈中,它會直接呼叫核心輸入系統本身 (來引發輸入事件變更,例如引發 HandMeshUpdated 或 HandJointsUpdated) 。

指標和焦點

指標是用來與遊戲物件互動。 本節說明如何建立指標、如何更新指標,以及如何判斷焦點 (物件) 。 它也會涵蓋存在的不同類型的指標,以及它們作用中的案例。

指標類別

指標通常屬於下列其中一個類別:

  • 遠方指標

    這些類型的指標是用來與離使用者 (遠的物件互動,只定義為「不接近」) 。 這些類型的指標通常會轉換可進入世界且允許使用者與其互動並操作不緊接在它們的物件旁的線條。

  • 接近指標

    這些類型的指標可用來與使用者接近的物件互動,以抓取、觸控及操作。 一般而言,這些類型的指標會藉由尋找鄰近鄰近區域 (中的物件來互動,方法是執行小型距離的光線傳播、執行球面轉換來尋找鄰近位置中的物件,或列舉被視為可抓取/可觸碰) 的物件清單。

  • Teleport 指標

    這些類型的指標會插入遠端傳送系統,以處理將使用者移至指標的目標位置。

指標中繼

例如,單一控制器可以有多個指標 (,因此,所表達的手部可以有接近和遠的互動指標) ,所以有一個元件負責媒體處理應該作用中的指標。

例如,當使用者的手接近可按下的按鈕時, ShellHandRayPointer 應該停止顯示,而且 PokePointer 應該參與。

這會由 DefaultPointerMediator 處理,其負責根據所有指標的狀態來判斷哪些指標為作用中。 當接近指標接近物件時,這會停用遠指標 (請參閱 DefaultPointerMediator) 。

藉由變更 PointerMediator 指標設定檔上的 屬性,即可提供指標中繼器的替代實作。

如何停用指標

因為指標中繼程式會執行每個畫面,所以最後會控制所有指標的作用中/非使用中狀態。 因此,如果您在程式碼中設定指標的 IsInteractionEnabled 屬性,則會由指標中繼程式在每個畫面格覆寫。 相反地,您可以指定 PointerBehavior ,以控制指標是否應該自行開啟或關閉。 請注意,只有在您使用預設值 FocusProviderDefaultPointerMediator MRTK 時,這才能運作。

範例:停用 MRTK 中的手部光線

下列程式碼會關閉 MRTK 中的手部光線:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Turn off hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

下列程式碼會將手部光線傳回 MRTK 中的預設行為:

PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);

下列程式碼會強制手部光線開啟,無論是否接近可抓取:

// Turn off all hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);

如需更多範例,請參閱 PointerUtilsTurnPointersOnOff

FocusProvider

FocusProvider是負責逐一查看所有指標清單的工作組,並找出每個指標的焦點物件為何。

在每個 Update() 呼叫中,這會:

  1. 例如,球體指標可以指定 SphereOverlap raycastMode,藉由光線傳播和依指標 (本身設定的點擊偵測來更新所有指標,因此 FocusProvider 會執行球體型衝突)

  2. 以每個指標為基礎更新焦點物件 (亦即,如果物件取得焦點,也會觸發這些物件的事件、如果物件遺失焦點,則會觸發焦點遺失等) 。

指標組態和生命週期

您可以在輸入系統設定檔的 [指標] 區段中設定指標

指標的存留期通常如下:

  1. 裝置管理員會偵測控制器是否存在。 接著,此裝置管理員會透過呼叫 RequestPointers 來建立與控制器相關聯的指標集合。

  2. FocusProvider 在其 Update () 迴圈中,會逐一查看所有有效的指標,並執行相關聯的光線廣播或點擊偵測邏輯。 這是用來判斷每個特定指標所專注的物件。

    • 因為可以同時有多個來源的輸入使用中 (例如,兩個手部作用中的存在) ,所以也可以有多個同時有焦點的物件。
  3. 裝置管理員在發現控制器來源遺失時,將會終止與遺失控制器相關聯的指標。