Tracciamento della mano - MRTK3

Panoramica

I dati delle mani articolati sono uno degli unici dati di input che non sono ancora gestiti in modo nativo dal sistema di input unity, gestiti dai sottosistemi.

Nota

Se non si ha familiarità con i sottosistemi MRTK3 e le differenze rispetto ai servizi MRTK 2.x, vedere la documentazione sull'architettura dei sottosistemi MRTK3 per un approfondimento sulla filosofia e sulla progettazione.

I sottosistemi inseriscono dati comuni mano da diverse origini e li aggregano in un'API centrale che funziona tra dispositivi e contesti di simulazione. I sottosistemi seguenti sono implementazioni di HandsSubsystem:

  • OpenXRHandsSubsystem riceve i dati della mano direttamente dal plug-in OpenXR.
  • XRSDKHandsSubsystem riceve i dati a mano dal livello di astrazione di XR SDK di Unity( che a sua volta può derivare i dati da OpenXR o da un'altra origine).
  • SyntheticHandsSubsystem sintetizza le articolazioni della mano fittizie in base alle azioni di input provenienti dal sistema (ad esempio devicePosition, deviceRotatione così via). Questo sottosistema fornisce le articolazioni visualizzate quando si usa la simulazione di input nell'editor.

HandsAggregatorSubsystem è un sottosistema che combina tutte le origini dei dati della mano in un'API centrale. Estrae i dati dell'articolazione scheletrica da tutti i dati attivi in esecuzione HandsSubsystems. L'implementazione MRTK di è HandsAggregatorSubsystemMRTKHandsAggregatorSubsystem, che supporta il caricamento lazy e il riutilizzo dei dati della mano per frame.

Importante

Ogni volta che si esegue una query direttamente per i dati comuni a mano, eseguire sempre query da Aggregator, non da nessuno dei singoli sottosistemi della mano. In questo modo, il codice funzionerà per qualsiasi origine di dati della mano, inclusi i dati simulati.

L'aggregatore e i sottosistemi mani valutano in modo differinte le richieste di dati della mano in ingresso. I dati della mano non verranno sottoposti a query finché non viene richiesto uno script "client". Se l'app richiede solo un singolo giunto, i sottosistemi delle mani valuteranno in modo differito e eseguiranno query su un'unica articolazione dalle API sottostanti. Inoltre, se un "client" richiede una mano completa di dati comuni, le chiamate successive all'interno dello stesso frame riutilizzeranno gli stessi dati, riducendo il costo di esecuzione di query su molte articolazioni all'interno dello stesso frame. In ogni nuovo frame, la cache verrà deviata e scaricata e le chiamate successive inizieranno a riempire la cache.

Di conseguenza, quando si esegue la profilatura dell'applicazione, è possibile che la prima query congiunta in un frame richieda più tempo rispetto alle query successive. Ciò è dovuto al costo ammortizzato associato alla prima query e alle prestazioni relative dei successivi riscontri nella cache.

Caratteristiche di avvicinamento delle dita

Aggregator calcola diverse misurazioni relative al movimento di avvicinamento delle dita in base ai dati comuni su cui esegue una query da ogni sottosistema delle mani specifico. Queste misurazioni vengono configurate nella configurazione del sottosistema Aggregator.

Configurazione del sottosistema Hands Aggregator

La soglia di avvicinamento delle dita e la soglia chiusa di avvicinamento delle dita controllano la distanza assoluta tra il pollice e l'indicatore di avanzamento delle dita usato per normalizzare lo stato di avanzamento delle dita. Quando la distanza è uguale alla soglia chiusa, lo stato di avvicinamento delle dita sarà 1,0 e quando la distanza è uguale alla soglia aperta, sarà 0,0. Queste soglie sono attualmente in unità mondiali, ma presto verranno normalizzate in base alle dimensioni della mano dell'utente.

Hand Raise Camera FOV controlla la vicinanza al centro della visualizzazione dell'utente che la mano deve essere considerata valida per l'avvicinamento delle dita. Tolleranza rivolta a mano controlla la tolleranza per misurare la rotazione della mano dell'utente; determina quando la mano dell'utente è rivolta verso l'esterno.

Esempi di aggregator delle mani

// Get a reference to the aggregator.
var aggregator = XRSubsystemHelpers.GetFirstRunningSubsystem<HandsAggregatorSubsystem>();
// Wait until an aggregator is available.
IEnumerator EnableWhenSubsystemAvailable()
{
    yield return new WaitUntil(() => XRSubsystemHelpers.GetFirstRunningSubsystem<HandsAggregatorSubsystem>() != null);
    GoAhead();
}
// Get a single joint (Index tip, on left hand, for example)
bool jointIsValid = aggregator.TryGetJoint(TrackedHandJoint.IndexTip, XRNode.LeftHand, out HandJointPose jointPose);
// Get an entire hand's worth of joints from the left hand.
bool allJointsAreValid = aggregator.TryGetEntireHand(XRNode.LeftHand, out IReadOnlyList<HandJointPose> joints)
// Check whether the user's left hand is facing away (commonly used to check "aim" intent)
// This is adjustable with the HandFacingAwayTolerance option in the Aggregator configuration.
// "handIsValid" represents whether there was valid hand data in the first place!
bool handIsValid = aggregator.TryGetPalmFacingAway(XRNode.LeftHand, out bool isLeftPalmFacingAway)
// Query pinch characteristics from the left hand.
// pinchAmount is [0,1], normalized to the open/closed thresholds specified in the Aggregator configuration.
// "isReadyToPinch" is adjusted with the HandRaiseCameraFOV and HandFacingAwayTolerance settings in the configuration.
bool handIsValid = aggregator.TryGetPinchProgress(XRNode.LeftHand, out bool isReadyToPinch, out bool isPinching, out float pinchAmount)

Prefab del controller di mano

I MRTK LeftHand Controller prefab e MRTK RightHand Controller consentono di usare controller della mano nel progetto. Questi prefab possono funzionare sia con controller di mano articolati che non articolati. Hanno interagendo per le azioni poke, afferra, raggio lontano e avvicinamento delle dita. Mostrano anche gli oggetti visivi appropriati e gestiscono le azioni di input dal dispositivo usando il controller e i componenti dell'interagitore collegati. Le azioni di input sono basate sulle mappe delle azioni di input definite nell'asset MRTK Default Input Actions .

Gerarchia del prefab Unity di MRTK LeftHand Controller.

Nota

Questi prefab sono già inclusi in MRTK XR Rig, vedere La creazione di una nuova scena per altri dettagli.

Importante

Se le MRTK XR Rig's azioni di input vengono modificate in modo da utilizzare azioni esterne all'asset MRTK Default Input Actions , assicurarsi di aggiornare anche per Input Action Manager usare il nuovo Input Action Asset. Questa operazione non può causare un comportamento non definito.

I MRTK LeftHand/RightHand Controller prefab contengono molti componenti per supportare i controller della mano. Uno di questi componenti è MRTKArticulatedHandController, che è una versione specializzata di Unity XRI.ActionBasedController Il ArticulatedHandController componente usa per esporre l'input HandsAggregatorSubsystem manuale tramite un oggetto controller. Ad esempio, questo controller espone l'evento HandsAggregatorSubsystem's select di avvicinamento delle dita delle variabili.

Per la visualizzazione del controller, il MRTK LeftHand/RightHand Controller prefab contiene i ControllerVisualizer componenti e HandJointVisualizer . ControllerVisualizer è un visualizzatore controller di base che esegue il rendering di un modello controller quando ne viene rilevato uno. Il modello di controller della piattaforma viene usato quando disponibile, in caso contrario un modello di controller generico, definito tramite il fallbackControllerModel campo . L'oggetto HandJointVisualizer è progettato per il debug e disegna una mesh a istanza su ogni articolazione della mano.

Per le piattaforme non HoloLens è disponibile anche .RiggedHandMeshVisualizer Per impostazione predefinita, questo visualizzatore non è incluso nei MRTK LeftHand/RightHand Controller prefab. Il RiggedHandMeshVisualizer visualizzatore di mano che usa una mesh/armatura rigged per eseguire il rendering di mesh manuali di alta qualità e non è consigliato per piattaforme AR come HoloLens, sia per motivi di prestazioni che di progettazione.

Nota

Per le piattaforme di realtà aumentata, ad esempio HoloLens, è consigliabile non usare visualizzazioni a mano, progettazione. poiché il conflitto tra la mano reale dell'utente e la visualizzazione olografica leggermente ritardata può essere più distratto di quanto vale la pena. Tuttavia, per le piattaforme opache, questa è una soluzione ottimale.

Ospita MRTK LeftHand/RightHand Controller anche un set di componenti che consentono vari tipi di interazioni. Sono inclusi PokeInteractor, MRTKRayInteractor, GrabInteractoreGrabInteractor . Per altre informazioni su questi interagisci, vedere Architettura dell'interazione - MRTK3.

Infine, i prefab del controller MRTK contengono anche vari componenti che implementano IInteractionModeDetector, NearInteractionModeDetector e InteractionDetector. Questi rilevatori comunicano all'applicazione InteractionModeManager quali interagiscono devono essere abilitati. Per altre informazioni sui rilevatori di MRTK3, visita Gestione modalità interazione - MRTK3.