手部功能表 — MRTK2

Hand Menu UX Example

手動功能表可讓使用者快速顯示常用函式的手動附加 UI。 若要在與其他物件互動時防止啟用 False,手部功能表提供[需要一般手部] 和 [使用注視啟用] 等選項。 建議您使用這些選項來防止不必要的啟用。

手部功能表範例

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

您可以在資料夾下 MRTK/Examples/Demos/HandTracking/Prefabs 找到這些手部功能表預製專案。

HandMenu_Small_HideOnHandDrop和HandMenu_Medium_HideOnHandDrop

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

HandMenu_Large_WorldLock_On_GrabAndPull

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

背板 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 Safe Zones
  • 啟用事件:目前會 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) 。

另請參閱