手部功能表 - 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 () 和 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手掌
  • 安全區域:安全區域會指定要限制內容的位置。 建議您將內容放在 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。
      • 如果您想要啟用注視型 (或甚至以非注視為基礎的) Reattach 邏輯,請呼叫 HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine () 函式。 此呼叫會觸發協同程式,然後繼續檢查是否符合 「IsValidController」 準則,並將 UpdateSolver 設定為 True,一旦 (或物件停用) 。
    • 啟動手約束邏輯:嘗試設定手部限制物件以再次開始遵循手部 (時,請根據它是否符合啟用準則) ,將 SolverHandler 的 UpdateSolver 設定為 true。
  • 重新附加邏輯:目前 HandConstraintPalmUp 能夠自動將目標物件重新附加至追蹤點,不論 SolverHandler 的 UpdateSolver 是否為 True。 此行為是透過呼叫 HandConstraintPalmUp 的 StartWorldLockReattachCheckCoroutine () 函式來處理,在此案例中已鎖定世界 (之後,會有效地將 SolverHandler 的 UpdateSolver 設定為 False) 。

另請參閱