Handmenu — MRTK2
Met handmenu's kunnen gebruikers snel een met de hand gekoppelde gebruikersinterface weergeven voor veelgebruikte functies. Om valse activering tijdens interactie met andere objecten te voorkomen, biedt het handmenu opties zoals 'Platte hand vereisen' en 'Starze-activering gebruiken'. Het is raadzaam om deze opties te gebruiken om ongewenste activering te voorkomen.
Voorbeelden van handmenu's
De scène HandMenuExamples.unity bevindt zich onder MRTK/Examples/Demos/HandTracking/Scenes
map. Wanneer de scène wordt uitgevoerd, wordt alleen het geselecteerde menutype geactiveerd.
U vindt deze handmenu prefabs onder MRTK/Examples/Common/Prefabs
map.
HandMenu_Small_HideOnHandDrop en HandMenu_Medium_HideOnHandDrop
In deze twee voorbeelden wordt het object MenuContent eenvoudig geactiveerd en gedeactiveerd om het menu weer te geven en te verbergen in de gebeurtenis OnFirstHandDetected() en OnLastHandLost().
HandMenu_Large_WorldLock_On_GrabAndPull
Voor complexere menu's waarvoor langere interactietijd is vereist, is het raadzaam om het menu te vergrendelen. In dit voorbeeld kan de gebruiker het menu ophalen en ophalen om het menu te vergrendelen, naast het activeren en deactiveren van de gebeurtenissen MenuContent op OnFirstHandDetected() en OnLastHandLost().
Achterplaat ManipulationHandler
maakt het grijpbaar en beweegbaar. Bij de gebeurtenis Manipulatie gestart wordt OplosserHandler.UpdateSolvers gedeactiveerd om het menu te vergrendelen. Daarnaast wordt de knop Sluiten weergegeven, zodat de gebruiker het menu kan sluiten wanneer de taak is voltooid. Bij de gebeurtenis Manipulatie beëindigd roept het HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine aan om de gebruiker toe te staan het menu weer bij de hand te brengen door de palm op te heffen en te bekijken.
De knop Sluiten activeert OplosserHandler.UpdateSolvers opnieuw en verbergt de MenuContent.
HandMenu_Large_AutoWorldLock_On_HandDrop
Dit voorbeeld is vergelijkbaar met HandMenu_Large_WorldLock_On_GrabAndPull. Het enige verschil is dat het menu automatisch wereld-vergrendeld bij handdruppel. Dit gedrag wordt verwerkt door de gebeurtenis MenuContent on OnLastHandLost() niet te verbergen. Grab & pull-gedrag is hetzelfde als HandMenu_Large_WorldLock_On_GrabAndPull voorbeeld.
Scripts
Het HandConstraint
gedrag biedt een oplosser die het bijgehouden object beperkt tot een regio die veilig is voor beperkte inhoud met de hand (zoals de gebruikersinterface van de hand, menu's, enzovoort). Veilige regio's worden beschouwd als gebieden die niet met de hand snijden. Een afgeleide klasse van HandConstraint
aangeroepen HandConstraintPalmUp
is ook opgenomen om een algemeen gedrag aan te tonen van het activeren van het oplosser bijgehouden object wanneer de palm naar de gebruiker gericht is.
Zie de hulpprogrammatips die beschikbaar zijn voor elke HandConstraint
eigenschap voor meer documentatie. Hieronder worden enkele eigenschappen nader gedefinieerd.
![HandMenu_ExampleScene Palm omhoog](../images/solver/mrtk_solver_handconstraintpalmup.png?view=mrtkunity-2021-05)
Veilige zone: de veilige zone geeft aan waar inhoud moet worden beperkt. Het wordt aanbevolen om inhoud aan de Ulnar-zijde te plaatsen om overlapping met de hand te voorkomen en de interactiekwaliteit te verbeteren. Veilige zones worden berekend door de richting van de handen, geprojecteerd in een vlak orthogonaal te nemen naar de cameraweergave en raycasting tegen een begrenzingsvak rond de handen. Veilige zones zijn gedefinieerd om mee
IMixedRealityHand
te werken, maar werken ook met andere controllertypen. Het wordt aanbevolen om te verkennen wat elke veilige zone vertegenwoordigt op verschillende typen controller.Hand volgen tot camera gericht Als deze instelling actief is, zal de oplosser handrotatie volgen totdat het menu voldoende is uitgelijnd met de blik, op welk punt het de camera ziet. Dit gedrag werkt door de OplosserRotationBehavior in de HandConstraintSolver te wijzigen van LookAtTrackedObject in LookAtMainCamera, omdat de gazeAlignment-hoek met de oplosser varieert.
![HandMenu Veilige zones](../images/solver/mrtk_solver_handconstraintsafezones.png?view=mrtkunity-2021-05)
Activeringsevenementen: momenteel
HandConstraint
worden vier activeringsevenementen geactiveerd. Deze gebeurtenissen kunnen in veel verschillende combinaties worden gebruikt om uniekHandConstraint
gedrag te creëren. Zie de scène HandBasedMenuExample onderMRTK/Examples/Demos/HandTracking/Scenes/
voor voorbeelden van dit gedrag.- OnHandActivate: wordt geactiveerd wanneer een hand voldoet aan de methode IsHandActive.
- OnHandDeactivate: wordt geactiveerd wanneer niet meer aan de methode IsHandActive wordt voldaan.
- OnFirstHandDetected: treedt op wanneer de handtraceringsstatus verandert van geen handen in beeld in de eerste hand in weergave.
- OnLastHandLost: treedt op wanneer de handtraceringsstatus verandert van ten minste één hand in weergave, in geen handen in weergave.
Activerings-/deactiveringslogica voor Oplosser: Momenteel wordt aanbevolen om logica te activeren en deactiveren
HandConstraintPalmUp
dit te doen met behulp van de waarde UpdateSolver van OplosserHandler, in plaats van door het object uit te schakelen/in te schakelen. Dit gedrag is te zien in de voorbeeldscène via de editor-hooks die worden geactiveerd na de manipulatiehandler 'OnManipulationStarted/Ended' van het gekoppelde menu.- De handbeperkingslogica stoppen: wanneer u probeert het handbeperkingsobject in te stellen om de activerings-/deactiveringslogica te stoppen (of niet uit te voeren), stelt u UpdateSolver in op Onwaar in plaats van HandConstraintPalmUp uit te schakelen.
- Als u de op gaze gebaseerde (of zelfs niet op gaze gebaseerde) reattach-logica wilt inschakelen, volgt u dit op door de functie HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() aan te roepen. Met deze aanroep wordt een coroutinus geactiveerd die vervolgens blijft controleren of aan de criteria 'IsValidController' wordt voldaan en updateSolver wordt ingesteld op True zodra dit het geval is (of het object is uitgeschakeld).
- De handbeperkingslogica starten: wanneer u probeert het handbeperkingsobject in te stellen om uw hand opnieuw te volgen (op basis van of deze voldoet aan de activeringscriteria), stelt u UpdateSolver van OplosserHandler in op true.
- De handbeperkingslogica stoppen: wanneer u probeert het handbeperkingsobject in te stellen om de activerings-/deactiveringslogica te stoppen (of niet uit te voeren), stelt u UpdateSolver in op Onwaar in plaats van HandConstraintPalmUp uit te schakelen.
Logica voor opnieuw koppelen: Momenteel kan de
HandConstraintPalmUp
het doelobject automatisch opnieuw koppelen aan het bijgehouden punt, ongeacht of de UpdateSolver van OplosserHandler Waar is of niet. Dit gedrag wordt afgehandeld door de functie StartWorldLockReattachCheckCoroutine() van HandConstraintPalmUp aan te roepen, nadat deze wereldwijd is vergrendeld (wat in dit geval betekent dat UpdateSolver van OplosserHandler effectief wordt ingesteld op False).