Menu a mano - MRTK2

Hand Menu UX Example

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

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

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().
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 reactrHandler.UpdateSolvers e nascondere 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. 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à.

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

HandMenu Safe Zones
  • 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'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.
  • 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).

Vedi anche