Menu a mano - MRTK2

Esempio di esperienza utente del menu a mano

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.
HandMenu_ExampleScene

È 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_ExampleScene 1
HandMenu_ExampleScene 2

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().
HandMenu_ExampleScene 3

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.
HandMenu_ExampleScene 4

Chiudere il pulsante reactiva risolutore.UpdateSolvers e nasconde menuContent.
HandMenu_ExampleScene 5

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à.

HandMenu_ExampleScene Palm up
  • 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.

Zone sicure HandMenu
  • Eventi di attivazione: attualmente attiva HandConstraint quattro eventi di attivazione. Questi eventi possono essere usati in molte combinazioni diverse per creare comportamenti univoci HandConstraint , vedere la scena HandBasedMenuExample in MRTK/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.
  • 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).

Vedi anche