Menu a mano - MRTK2
I menu a mano consentono agli utenti di visualizzare rapidamente l'interfaccia utente associata a mano per le funzioni usate di frequente. Per evitare l'attivazione false durante l'interazione con altri oggetti, il menu a mano fornisce opzioni, ad esempio "Richiedi mano piatta" e "Usa attivazione dello sguardo". È consigliabile usare queste opzioni per impedire l'attivazione indesiderata.
Esempi di menu a mano
La scena HandMenuExamples.unity è nella MRTK/Examples/Demos/HandTracking/Scenes
cartella. Quando è in esecuzione, la scena attiva solo il tipo di menu selezionato.
È possibile trovare questi prefab di menu a mano nella MRTK/Examples/Demos/HandTracking/Prefabs
cartella.
HandMenu_Small_HideOnHandDrop e HandMenu_Medium_HideOnHandDrop
Questi due esempi consentono semplicemente di attivare e disattivare l'oggetto MenuContent per visualizzare e nascondere il menu nell'evento OnFirstHandDetected() e OnLastHandLost().
HandMenu_Large_WorldLock_On_GrabAndPull
Per menu più complessi che richiedono tempi di interazione più lunghi, è consigliabile bloccare il menu. In questo esempio l'utente può afferrare e eseguire il pull al menu, oltre a attivare e disattivare menuContent in OnFirstHandDetected() e OnLastHandLost().
Backplate rende afferrabile e rimovibile ManipulationHandler
. Nell'evento Manipulation Started , SolverHandler.UpdateSolvers viene disattivato per bloccare il menu. Mostra inoltre il pulsante Chiudi per consentire all'utente di chiudere il menu al termine dell'attività. Nell'evento Manipulation End chiama HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine per consentire all'utente di tornare a mano alzando e guardando il palmo.
Chiudere il pulsante reactrHandler.UpdateSolvers e nascondere MenuContent.
HandMenu_Large_AutoWorldLock_On_HandDrop
Questo esempio è simile a HandMenu_Large_WorldLock_On_GrabAndPull. L'unica differenza è che il menu verrà automaticamente bloccato a mano. Questa operazione viene eseguita semplicemente non nascondendo l'evento MenuContent on OnLastHandLost(). Il comportamento pull di grab & è uguale a HandMenu_Large_WorldLock_On_GrabAndPull esempio.
Script
Il HandConstraint
comportamento fornisce un risolutore che limita l'oggetto monitorato a un'area sicura per il contenuto vincolato della mano,ad esempio interfaccia utente, menu e così via. Cassaforte aree sono considerate aree che non si intersecano con la mano. Una classe derivata di HandConstraint
chiamata HandConstraintPalmUp
è inclusa anche per illustrare un comportamento comune di attivazione dell'oggetto risolutore monitorato quando il palmo si trova di fronte all'utente.
Vedere i suggerimenti per gli strumenti disponibili per ogni HandConstraint
proprietà per una documentazione aggiuntiva. Di seguito sono definite alcune proprietà.

Cassaforte Zona: la zona sicura specifica dove si applica il vincolo del contenuto. È consigliabile inserire il contenuto sul lato Ulnar per evitare la sovrapposizione con la mano e migliorare la qualità dell'interazione. Cassaforte zone vengono calcolate prendendo l'orientamento delle mani proiettato in un piano ortogonale alla vista della fotocamera e raggiocasting su un rettangolo di selezione intorno alle mani. Cassaforte zone sono definite per funzionare con, ma funziona anche con
IMixedRealityHand
altri tipi di controller. È consigliabile esplorare ciò che ogni zona sicura rappresenta in tipi di controller diversi.Segui mano fino a quando Fotocamera Con questo risolutore attivo, il risolutore seguirà la rotazione della mano fino a quando il menu non è sufficientemente allineato con lo sguardo, a quel punto si affaccia la fotocamera. Ciò funziona modificando il RisolutoreBehavior in HandConstraintSolver, da LookAtTrackedObject a LookAtMainCamera come angolo GazeAlignment con il risolutore varia.

Eventi di attivazione: attualmente attiva
HandConstraint
quattro eventi di attivazione. Questi eventi possono essere usati in molte combinazioni diverse per creare comportamenti univociHandConstraint
, vedere la scena HandBasedMenuExample inMRTK/Examples/Demos/HandTracking/Scenes/
per esempi di questi comportamenti.- OnHandActivate: attiva quando una mano soddisfa il metodo IsHandActive.
- OnHandDeactivate: attiva quando il metodo IsHandActive non è più soddisfatto.
- OnFirstHandDetected: si verifica quando lo stato di rilevamento della mano cambia da nessuna mano in vista, alla prima mano in vista.
- OnLastHandLost: si verifica quando lo stato di rilevamento della mano cambia da almeno una mano in vista, a nessuna mano in vista.
Logica di attivazione/disattivazione del risolutore: attualmente la raccomandazione per l'attivazione e la disattivazione
HandConstraintPalmUp
della logica consiste nell'eseguire questa operazione tramite l'uso del valore UpdateSolver di SolverHandler anziché disabilitando/abilitando l'oggetto. Ciò può essere visualizzato nella scena di esempio tramite gli hook basati sull'editor attivati dopo gli eventi ManipulationHandler del menu collegato "OnManipulationStarted/End".- Arresto della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato della mano su arresta (oltre a non eseguire la logica di attivazione/disattivazione), impostare UpdateSolver su False anziché disabilitare HandConstraintPalmUp.
- Se si vuole abilitare la logica di reattach basata su sguardo (o anche non basata su sguardo), questa operazione viene seguita chiamando la funzione HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Verrà attivata una coroutine che continua a verificare se i criteri "IsValidController" vengono soddisfatti e imposta UpdateSolver su True una volta che è (o l'oggetto è disabilitato)
- Avvio della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato della mano per iniziare di nuovo a seguire la mano (in base al fatto che soddisfi i criteri di attivazione), impostare UpdateSolver di SolverHandler su true.
- Arresto della logica del vincolo a mano: quando si tenta di impostare l'oggetto vincolato della mano su arresta (oltre a non eseguire la logica di attivazione/disattivazione), impostare UpdateSolver su False anziché disabilitare HandConstraintPalmUp.
Reattach Logic: attualmente è
HandConstraintPalmUp
in grado di riassegnare automaticamente l'oggetto di destinazione al punto monitorato, indipendentemente dal fatto che UpdateSolver del Risolutore sia True o meno. Questa operazione viene eseguita chiamando la funzione StartWorldLockReattachCheckCoroutine() di HandConstraintPalmUp di HandConstraintPalmUp, dopo che è stata bloccata al mondo (che in questo caso, imposta in modo efficace l'aggiornamento di UpdateSolver di SolverHandler su False).