共用方式為


手部菜單 — MRTK2

手部功能表 UX 範例

手部功能表可讓使用者快速地為常用的函式顯示手部連結的UI。 為了避免與其他對象互動時發生誤用,手部功能表會提供 「需要一般手部」和「使用注視啟用」等選項。 建議使用這些選項來防止不必要的啟用。

手部功能表範例

HandMenuExamples.unity 場景位於資料夾底下 MRTK/Examples/Demos/HandTracking/Scenes 。 執行時,場景只會啟用目前選取的功能表類型。
HandMenu_ExampleScene

您可以在資料夾下 MRTK/Examples/Common/Prefabs 找到這些手部選單預製專案。

HandMenu_Small_HideOnHandDrop和HandMenu_Medium_HideOnHandDrop

這兩個範例只會啟用和停用 MenuContent 物件,以顯示和隱藏 OnFirstHandDetected () OnLastHandLost () 事件上的功能表。
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

對於需要較長互動時間的更複雜功能表,建議您將功能表全域鎖定。 在此範例中,除了啟動和停用 OnFirstHandDetected () 上的 MenuContent 和 OnLastHandLost () 事件之外,使用者還可以抓取並提取到全域鎖定功能表。
HandMenu_ExampleScene 3

Backplate 的 ManipulationHandler 可抓取且可移動。 在 Manipulation Started 事件上, SolverHandler.UpdateSolvers 會停用以全域鎖定功能表。 此外,它會顯示 [ 關閉] 按鈕 ,讓使用者在工作完成時關閉功能表。 在 Manipulation Ended 事件上,它會呼叫 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine ,讓用戶藉由舉手並查看手掌,將功能表帶回手部。
HandMenu_ExampleScene 4

[關閉 ] 按鈕會重新啟用 SolverHandler.UpdateSolvers ,並隱藏 MenuContent
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

這個範例類似於HandMenu_Large_WorldLock_On_GrabAndPull。 唯一的差別在於,功能表會自動在手動置放時鎖定世界。 此行為的處理方式是不要隱藏 OnLastHandLost () 事件上的 MenuContent。 擷取 & 提取行為與HandMenu_Large_WorldLock_On_GrabAndPull範例相同。

指令碼

行為 HandConstraint 會提供一個規劃求解器,將追蹤物件限制為手部限制內容 (的安全區域,例如手部 UI、功能表等 ) 。 安全區域會被視為沒有手部交集的區域。 也包含名為 HandConstraintPalmUpHandConstraint衍生類別,以示範當手掌面對使用者時,啟動規劃求解追蹤對象的常見行為。

如需詳細檔,請參閱每個 HandConstraint 屬性可用的工具提示。 以下會更詳細地定義一些屬性。

HandMenu_ExampleScene Palm up
  • 安全區域:安全區域會指定要限制內容的位置。 建議將內容放在 Ulnar 端,以避免與手重疊並改善互動品質。 安全區域的計算方式是將手部方向投射到相機檢視的平面正交,並針對手部周圍的周框方塊進行光線投射。 安全區域已定義為可搭配 IMixedRealityHand 使用,但也適用於其他控制器類型。 建議您探索每個安全區域在不同控制器類型上所代表的內容。

  • 跟著手直到對應相機 使用此設定時,規劃求解器會遵循手部旋轉,直到功能表與注視充分對齊為止,此時它會面對相機。 此行為的運作方式是將 HandConstraintSolver 中的 SolverRotationBehavior 從 LookAtTrackedObject 變更為 LookAtMainCamera,因為具有求解器的 GazeAlignment 角度會有所不同。

HandMenu 安全區域
  • 啟用事件:目前觸發 HandConstraint 四個啟用事件。 這些事件可以用於許多不同的組合來建立唯 HandConstraint 一的行為,如需這些行為的範例,請參閱 下 MRTK/Examples/Demos/HandTracking/Scenes/ 方的 HandBasedMenuExample 場景。

    • OnHandActivate:當手滿足 IsHandActive 方法時觸發。
    • OnHandDeactivate:當不再滿足 IsHandActive 方法時觸發。
    • OnFirstHandDetected:當手部追蹤狀態從沒有手部檢視變更為檢視中的第一手時發生。
    • OnLastHandLost:當手部追蹤狀態從至少一隻手在檢視中變更為沒有手部檢視時發生。
  • 規劃求解啟用/停用邏輯:目前啟用和停用 HandConstraintPalmUp 邏輯的建議是使用 SolverHandler 的 UpdateSolver 值,而不是停用/啟用物件。 透過附加功能表的ManipulationHandler “OnManipulationStarted/Ended” 事件之後觸發的編輯器型勾點,可以在範例場景中看到此行為。

    • 停止手部條件約束邏輯:嘗試將手部限制物件設定為停止 (或不在啟用/停用邏輯) 執行時,請將 UpdateSolver 設定為 False,而不是停用 HandConstraintPalmUp。
      • 如果您想要啟用注視型 (,或甚至是以非注視為基礎的) 重新附加邏輯,請呼叫 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine () 函式來追蹤。 此呼叫會觸發協同程式,然後繼續檢查是否符合 「IsValidController」 準則,並在 (或停用對象之後,將 UpdateSolver 設定為 True) 。
    • 啟動手部條件約束邏輯:當您嘗試將手部限制物件設定為再次追蹤手部時, (根據它是否符合啟用準則) ,請將 SolverHandler 的 UpdateSolver 設定為 true。
  • 重新附加邏輯:目前 HandConstraintPalmUp 可以自動將目標物件重新附加至追蹤點,無論 SolverHandler 的 UpdateSolver 是否為 True。 此行為是透過呼叫 HandConstraintPalmUp 的 StartWorldLockReattachCheckCoroutine () 函式來處理,在被世界鎖定之後, (在此情況下, 會將 SolverHandler 的 UpdateSolver 有效設定為 False) 。

另請參閱