Handmeny

Exempel på handmeny-UX

Med handmenyer kan användarna snabbt få upp handkopplade användargränssnitt för funktioner som används ofta. Handmenyn innehåller alternativ som "Kräv platt hand" och "Använd blickaktivering" för att förhindra falsk aktivering när du interagerar med andra objekt. Vi rekommenderar att du använder dessa alternativ för att förhindra oönskad aktivering.

Exempel på handmeny

HandMenuExamples.unity-scenen finns under MRTK/Examples/Demos/HandTracking/Scenes mappen . När den körs aktiveras endast den valda menytypen i scenen.
HandMenu_ExampleScene

Du hittar dessa handmeny prefabs under MRTK/Examples/Demos/HandTracking/Prefabs mappen.

HandMenu_Small_HideOnHandDrop och HandMenu_Medium_HideOnHandDrop

De här två exemplen aktiverar och inaktiverar helt enkelt objektet MenuContent för att visa och dölja menyn på händelsen OnFirstHandDetected() och OnLastHandLost().
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

För mer komplexa menyer som kräver längre interaktionstid rekommenderar vi att du världslåser menyn. I det här exemplet kan användaren hämta och hämta för att världslåsa menyn, förutom att aktivera och inaktivera MenuContent på OnFirstHandDetected() och OnLastHandLost() händelser.
HandMenu_ExampleScene 3

Med en backplate ManipulationHandler blir den upptagbar och flyttbar. Vid händelsen Manipulation Started (Startad manipulering) inaktiveras SolverHandler.UpdateSolvers för att världslåsa menyn. Dessutom visas knappen Stäng så att användaren kan stänga menyn när uppgiften är klar. Vid en händelse som avslutas med manipulering anropas HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine så att användaren kan ta menyn tillbaka till hands genom att höja upp och titta på låset.
HandMenu_ExampleScene 4

Knappen Stäng återaktiverar SolverHandler.UpdateSolvers och döljer MenuContent.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Det här exemplet liknar HandMenu_Large_WorldLock_On_GrabAndPull. Den enda skillnaden är att menyn automatiskt blir världslåst till hands. Detta görs genom att helt enkelt inte dölja MenuContent på OnLastHandLost()-händelsen. Pull-& är samma som ett HandMenu_Large_WorldLock_On_GrabAndPull exempel.

Skript

Beteendet ger en lösare som begränsar det spårade objektet till en region som är säker för handbegränsat innehåll (till exempel HandConstraint handgränssnitt, menyer osv.). Valv regioner betraktas som områden som inte överspelas med händerna. En härledd klass med anropas också för att demonstrera ett vanligt beteende för att aktivera det lösande spårade objektet när HandConstraint HandConstraintPalmUp han/hon är riktad mot användaren.

Se verktygstipsen för varje HandConstraint egenskap för ytterligare dokumentation. Några egenskaper definieras i detalj nedan.

HandMenu_ExampleScene Palm up
  • Valv zon: Den säkra zonen anger var du vill begränsa innehållet. Vi rekommenderar att innehåll placeras på Ulnar-sidan för att undvika överlappning med hand och förbättrad interaktionskvalitet. Valv zoner beräknas genom att ta den handsorientering som projiceras till ett plantalt område mot kamerans vy och raycasting mot en markeringsruta runt händerna. Valv zoner har definierats för att fungera IMixedRealityHand med men fungerar även med andra kontrollanttyper. Vi rekommenderar att du utforskar vad varje säker zon representerar för olika kontrollanttyper.

  • Följ hand tills kameran är riktad När detta är aktivt följer lösaren handrotationen tills menyn är tillräckligt justerad med blicken, då den riktar sig mot kameran. Detta fungerar genom att ändra SolverRotationBehavior i HandConstraintSolver, från LookAtTrackedObject till LookAtMainCamera som GazeAlignment-vinkel med lösaren varierar.

HandMenu Safe Zones
  • Aktiveringshändelser: HandConstraint Utlöser för närvarande fyra aktiveringshändelser. Dessa händelser kan användas i många olika kombinationer för att skapa unika beteenden. Se HandConstraint HandBasedMenuExample-scenen under för exempel på MRTK/Examples/Demos/HandTracking/Scenes/ dessa beteenden.

    • OnHandActivate: utlöses när en hand uppfyller metoden IsHandActive.
    • OnHandDeactivate: utlöses när metoden IsHandActive inte längre uppfylls.
    • OnFirstHandDetected: inträffar när handspårningstillståndet ändras från inga händer i vyn till den första hand i vyn.
    • OnLastHandLost: inträffar när handspårningstillståndet ändras från minst en hand i vyn till inga händer i vyn.
  • Lösningsaktivering/inaktiveringslogik: För närvarande rekommenderar vi att du aktiverar och inaktiverar logik genom att använda HandConstraintPalmUp SolverHandlers UpdateSolver-värde i stället för att inaktivera/aktivera objektet. Detta kan ses i exempelscenen via de redigeringsbaserade hookar som utlöses efter den anslutna menyns ManipulationHandler-händelser "OnManipulationStarted/Ended".

    • Stoppa handbegränsningslogiken: När du försöker ange att det handbegränsade objektet ska stoppas (samt inte köra aktiverings-/inaktiveringslogiken) anger du UpdateSolver till False i stället för att inaktivera HandConstraintPalmUp.
      • Om du vill aktivera den blickbaserade (eller till och med icke-blickbaserade) reattach-logiken följs detta av anrop till funktionen HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Detta utlöser en koroutin som sedan fortsätter att kontrollera om villkoret "IsValidController" uppfylls och anger UpdateSolver till True när det är (eller om objektet är inaktiverat)
    • Starta handbegränsningslogiken: När du försöker ange att det handbegränsade objektet ska börja följa din hand igen (baserat på om det uppfyller aktiveringskriterierna) anger du UpdateSolver för SolverHandler till true.
  • Återanslut logik: För närvarande kan återansluta målobjektet till den spårade punkten automatiskt, oavsett om HandConstraintPalmUp SolverHandlers UpdateSolver är sant eller inte. Detta görs genom att anropa HandConstraintPalmUps funktion StartWorldLockReattachCheckCoroutine() efter att den har varit världslåst (vilket i det här fallet i praktiken är att ställa in SolverHandlers UpdateSolver till Falskt).

Se även