Ruční menu — MRTK2
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.
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_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.
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ě.
Tlačítko Zavřít znovu aktivuje SolverHandler.UpdateSolvers a skryje Obsah nabídky.
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á HandConstraint
HandConstraintPalmUp
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.
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ší.
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éhoHandConstraint
chování. Příklady tohoto chování najdete ve scéně HandBasedMenuExample v částiMRTK/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.
- 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.
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).