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 come "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/Common/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 i menu più complessi che richiedono più tempo di interazione, è 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 reactiva risolutore.UpdateSolvers e nasconde 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. Questo comportamento viene gestito 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. Le aree sicure 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.
Per altre informazioni, vedere i suggerimenti per gli strumenti disponibili per ogni HandConstraint
proprietà. Di seguito sono definite alcune proprietà.
Zona sicura: la zona sicura specifica la posizione in cui limitare il contenuto. È consigliabile inserire il contenuto sul lato Ulnar per evitare sovrapposizioni con la mano e migliorare la qualità dell'interazione. Le zone sicure vengono calcolate prendendo l'orientamento delle mani proiettato in un piano ortogonale per la visualizzazione della fotocamera e il raycasting su un rettangolo di selezione intorno alle mani. Le zone sicure sono definite per lavorare con ma funzionano anche con
IMixedRealityHand
altri tipi di controller. È consigliabile esplorare ciò che ogni zona sicura rappresenta in tipi di controller diversi.Segui la mano fino a quando la fotocamera non è rivolta Con questa impostazione attiva, il risolutore seguirà la rotazione della mano fino a quando il menu non è sufficientemente allineato con lo sguardo, a quale punto si trova la fotocamera. Questo comportamento 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'usare il valore UpdateSolver di SolverHandler anziché disabilitare/abilitare l'oggetto. Questo comportamento 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 per arrestare (o meno) 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), seguire chiamando la funzione HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine(). Questa chiamata attiva 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 per arrestare (o meno) 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. Questo comportamento viene gestito chiamando la funzione StartWorldLockReattachCheckCoroutine() di HandConstraintPalmUp di HandConstraintPalmUp( che in questo caso è stata bloccata al mondo, che in questo caso imposta l'opzione UpdateSolver del Risolutore su False).