Ruční menu — MRTK2

Příklad uživatelského prostředí pro ruční nabídku

Ruční nabídky umožňují uživatelům rychle vyvolat ručně připojené uživatelské rozhraní pro často používané funkce. Aby se zabránilo falešné aktivaci při interakci s jinými objekty, nabízí nabídka ruky možnosti, jako je Vyžadovat plochou ruku a Použít aktivaci pohledem. Doporučujeme použít tyto možnosti, abyste zabránili nežádoucí aktivaci.

Příklady ruční nabídky

Scéna HandMenuExamples.unity je ve MRTK/Examples/Demos/HandTracking/Scenes složce. Když je scéna spuštěná, aktivuje se jenom aktuálně vybraný typ nabídky.
HandMenu_ExampleScene

Tyto prefaby ruční nabídky najdete ve MRTK/Examples/Common/Prefabs složce .

HandMenu_Small_HideOnHandDrop a HandMenu_Medium_HideOnHandDrop

Tyto dva příklady jednoduše aktivovat a deaktivovat MenuContent objektu zobrazit a skrýt menu onFirstHandDetected() a OnLastHandLost() události.
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

U složitějších nabídek, které vyžadují delší dobu interakce, doporučujeme nabídku uzamknout světem. V tomto příkladu může uživatel chytit a vyžádat k uzamčení nabídky, kromě aktivace a deaktivace MenuContent onFirstHandDetected() a OnLastHandLost() události.
HandMenu_ExampleScene 3

Zadní deska ManipulationHandler je uchopitelná a pohyblivá. V události Manipulation Started je solverHandler.UpdateSolvers deaktivována, aby se nabídka zamkla po celém světě. Kromě toho se zobrazí tlačítko Zavřít , které uživateli umožní zavřít nabídku po dokončení úkolu. Při události Manipulation Ended volá HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine , aby uživatel mohl přenést nabídku zpět do ruky zvednutím a pohledem do dlaně.
HandMenu_ExampleScene 4

Tlačítko Zavřít znovu aktivuje SolverHandler.UpdateSolvers a skryje Obsah nabídky.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Tento příklad se podobá HandMenu_Large_WorldLock_On_GrabAndPull. Jediným rozdílem je, že nabídka bude automaticky uzamčena po ruce. Toto chování je zpracováno tak, že není skrytí MenuContent on OnLastHandLost() událost. HandMenu_Large_WorldLock_On_GrabAndPull příkladu je chování při načítání & stejné jako u HandMenu_Large_WorldLock_On_GrabAndPull příkladu.

Skripty

Toto HandConstraint chování poskytuje řešitele, který omezuje sledovaný objekt na oblast, která je bezpečná pro ručně omezený obsah (například uživatelské rozhraní rukou, nabídky atd.). Bezpečné oblasti jsou považovány za oblasti, které se neprotínají s rukou. Odvozená třída volaná HandConstraintHandConstraintPalmUp je také zahrnuta, aby demonstrovala běžné chování aktivace objektu sledovaného řešitelem, když je dlaň směrem k uživateli.

Další dokumentaci najdete v tipech s nástroji, které jsou k dispozici pro jednotlivé HandConstraint vlastnosti. Několik vlastností je definováno podrobněji níže.

HandMenu_ExampleScene dlaní nahoru
  • Bezpečná zóna: Bezpečná zóna určuje, kde na ruce se má omezit obsah. Doporučuje se umístit obsah na ulnarskou stranu, aby se zabránilo překrývání s rukou a zlepšila se kvalita interakce. Bezpečné zóny se počítají tak, že se orientace rukou promítnou do ortogonální roviny do pohledu kamery a raycasting na ohraničující rámeček kolem rukou. Bezpečné zóny jsou definovány pro práci s IMixedRealityHand , ale fungují také s jinými typy kontroleru. Doporučujeme prozkoumat, co jednotlivé bezpečné zóny představují na různých typech kontroleru.

  • Sledování rukou až do protisnímu fotoaparátu Když je toto nastavení aktivní, bude řešitel sledovat otáčení rukou, dokud nebude nabídka dostatečně zarovnaná s pohledem, v jakém okamžiku směřuje ke kameře. Toto chování funguje tak, že změní SolverRotationBehavior v HandConstraintSolver z LookAtTrackedObject na LookAtMainCamera, protože úhel GazeAlignment s řešitelem se liší.

Bezpečné zóny HandMenu
  • Aktivační události: Aktuálně aktivuje HandConstraint čtyři aktivační události. Tyto události lze použít v mnoha různých kombinacích k vytvoření jedinečného HandConstraint chování. Příklady tohoto chování najdete ve scéně HandBasedMenuExample v části MRTK/Examples/Demos/HandTracking/Scenes/ .

    • OnHandActivate: aktivuje, když ruka vyhovuje IsHandActive metoda.
    • OnHandDeactivate: Aktivuje se, když isHandActive metoda již není splněna.
    • OnFirstHandDetected: Nastane, když se stav sledování ruky změní z žádné ruky v zobrazení na první ruku v zobrazení.
    • OnLastHandLost: nastane, když se stav sledování ruky změní z alespoň jedné ruky v zobrazení na žádné ruce v zobrazení.
  • Logika aktivace/deaktivace řešitele: V současné době doporučujeme logiku aktivace a deaktivace HandConstraintPalmUp provést pomocí hodnoty UpdateSolver obslužné rutiny Řešitele, nikoli zakázáním nebo povolením objektu. Toto chování lze vidět v ukázkové scéně prostřednictvím hooků založených na editoru aktivovaných po událostech "OnManipulationStarted/Ended" připojené nabídky ManipulationHandler.

    • Zastavení logiky ručního omezení: Při pokusu o zastavení (nebo nespouštět) logiku aktivace/deaktivace objektu s ručním omezením nastavte UpdateSolver na False a nezakazujte handConstraintPalmUp.
      • Pokud chcete povolit logiku opětovného připojení na základě pohledu (nebo dokonce bez pohledu), pokračujte voláním funkce HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Toto volání aktivuje korutinu, která pak bude dál kontrolovat, jestli jsou splněná kritéria IsValidController, a jakmile je (nebo je objekt zakázaný), nastaví hodnotu UpdateSolver na hodnotu True.
    • Spuštění logiky ručního omezení: Při pokusu o nastavení objektu s omezením ruky tak, aby začal znovu sledovat vaši ruku (podle toho, jestli splňuje kritéria aktivace), nastavte UpdateSolver Obslužné rutiny Řešitele na hodnotu true.
  • Logika opětovného připojení: V současné době HandConstraintPalmUp je schopna automaticky znovu připojit cílový objekt ke sledovanému bodu bez ohledu na to, jestli je UpdateSolver obslužné rutiny Řešitele true nebo ne. Toto chování se zpracovává voláním funkce StartWorldLockReattachCheckCoroutine() handConstraintPalmUp, která je uzamčena světem (což v tomto případě ve skutečnosti nastavuje UpdateSolver obslužné rutiny SolverHandler na hodnotu False).

Viz také