Il sistema di rilevamento delle mani usa i palmi e le dita di una persona come input. I dati sulla posizione e sulla rotazione di ogni dito, l'intero palmo e i movimenti delle mani sono disponibili. A partire da Unreal 4.26, il rilevamento delle mani si basa sul plug-in Unreal HeadMountedDisplay e usa un'API comune in tutte le piattaforme e i dispositivi XR. La funzionalità è la stessa per i sistemi sia Windows Mixed Reality che OpenXR.
Posa a mano
La posa della mano consente di tenere traccia e usare le mani e le dita degli utenti come input, a cui è possibile accedere sia in Blueprint che in C++. L'API Unreal invia i dati come sistema di coordinate, con i tick sincronizzati con il motore Unreal.
La gerarchia è descritta da EHandKeypoint enumerazione:
È possibile ottenere tutti questi dati dalle mani di un utente usando la funzione Get Motion Controller Data.You can get this data from a user's using the Get Motion Controller Data function. Tale funzione restituisce una struttura XRMotionControllerData . Di seguito è riportato uno script di progetto di esempio che analizza la struttura XRMotionControllerData per ottenere posizioni comuni di mano e disegna un sistema di coordinate di debug in corrispondenza della posizione di ogni comune.
È importante verificare se la struttura è valida e che è una mano. In caso contrario, è possibile ottenere un comportamento non definito nell'accesso a posizioni, rotazioni e matrici di radii.
L'enumerazione EWMRHandKeypoint descrive la gerarchia dell'osso della mano. È possibile trovare ogni punto chiave di mano elencato nei progetti:
L'enumerazione C++ completa è elencata di seguito:
È possibile usare GetHandJointTransform per restituire i dati spaziali dalla mano. I dati aggiornano ogni frame, ma se si è all'interno di un frame i valori restituiti vengono memorizzati nella cache. Non è consigliabile avere una logica pesante in questa funzione per motivi di prestazioni.
Ecco una suddivisione dei parametri delle funzioni di GetHandJointTransform:
Mano : può essere l'utente a sinistra o a destra.
Punto chiave : l'osso della mano.
Trasformazione : coordinate e orientamento della base dell'osso. È possibile richiedere la base dell'osso successivo per ottenere i dati di trasformazione per la fine di un osso. Un'osso punta speciale dà la fine del distale.
**Raggio: raggio della base dell'osso.
**Valore restituito: true se l'osso viene tracciato in questa cornice, false se l'osso non è tracciato.
Animazione del collegamento live mano
Le pose delle mani vengono esposte all'animazione usando il plug-in Live Link.
Se i plug-in Windows Mixed Reality e Live Link sono abilitati:
Selezionare Collegamento live finestra > per aprire la finestra dell'editor di collegamento live.
Selezionare Origine e abilitare Windows Mixed Reality origine rilevamento mano
Dopo aver abilitato l'origine e aperto un asset di animazione, espandere la sezione Animazione nella scheda Scena di anteprima per visualizzare anche altre opzioni.
La gerarchia dell'animazione della mano è uguale a in EWMRHandKeypoint. L'animazione può essere retargetata usando WindowsMixedRealityHandTrackingLiveLinkRemapAsset:
Ottenere le mesh di mano come geometria tracciata in OpenXR richiede di chiamare Set Use Hand Mesh with Enabled Tracking Geometry(
Per abilitare tale modalità, è consigliabile chiamare Set Use Hand Mesh with Enabled Tracking Geometry(
Nota
Non è possibile abilitare entrambe le modalità contemporaneamente. Se ne si abilita uno, l'altro viene disabilitato automaticamente.
Accesso ai dati di Hand Mesh
Prima di poter accedere ai dati della mesh a mano, sarà necessario:
Selezionare l'asset ARSessionConfig , espandere le impostazioni del mapping AR -> World Mapping e selezionare Genera dati mesh dalla geometria tracciata.
Di seguito sono riportati i parametri di mesh predefiniti:
Usare i dati mesh per l'occlusione
Generare collisioni per i dati mesh
Generare mesh di spostamento per i dati mesh
Eseguire il rendering dei dati mesh in Wireframe: parametro di debug che mostra la mesh generata
Questi valori di parametro vengono usati come mesh di mapping spaziale e mesh di mano predefiniti. È possibile modificarli in qualsiasi momento in Blueprints o codice per qualsiasi mesh.
Informazioni di riferimento sulle API C++
Usare EEARObjectClassification per trovare i valori della mesh della mano in tutti gli oggetti tracciabili.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
I delegati seguenti vengono chiamati quando il sistema rileva qualsiasi oggetto rilevabile, inclusa una mesh di mano.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Assicurarsi che i gestori delegati seguono la firma della funzione seguente:
Aggiungere un componente ARTrackableNotify a un attore di progetto
Passare al pannello Dettagli e espandere la sezione Eventi .
Sovrascrivere On Add/Update/Remove Tracked Geometry with the following node in your Event Graph:
Visualizzazione Hand Mesh in OpenXR
Il modo consigliato per visualizzare la mesh della mano consiste nell'usare il plug-in XRVisualization di Epic insieme al plug-in Microsoft OpenXR.
Nell'editor del progetto è quindi consigliabile usare la funzione Set Use Hand Mesh dal plug-in Microsoft OpenXR con Enabled XRVisualization come parametro:
Per gestire il processo di rendering, è consigliabile usare Render Motion Controller da XRVisualization:
Ecco il risultato:
Se è necessario qualcosa di più complicato, ad esempio disegnare una mesh a mano con uno shader personalizzato, è necessario ottenere le mesh come geometria tracciata.
Raggi mano
Ottenere la posa della mano funziona per interazioni vicine, ad esempio afferrare oggetti o premere pulsanti. Tuttavia, a volte è necessario lavorare con gli ologrammi lontani dagli utenti. Questa operazione può essere eseguita con i raggi della mano, che possono essere usati come dispositivi di puntamento sia in C++ che in Blueprints. È possibile disegnare un raggio dalla mano a un punto lontano e, con qualche aiuto dalla traccia dei raggi Unreal, selezionare un ologramma che altrimenti sarebbe fuori portata.
Importante
Poiché tutti i risultati della funzione cambiano ogni fotogramma, tutti sono resi chiamabili. Per altre informazioni sulle funzioni pure e impure o chiamabili, vedere guid utente di Blueprint per le funzioni.
Per ottenere i dati per i raggi della mano, è consigliabile usare la funzione Get Motion Controller Data della sezione precedente. La struttura restituita contiene due parametri che è possibile usare per creare un raggio della mano: Posizione obiettivo e Rotazione obiettivo. Questi parametri formano un raggio diretto dal gomito. Dovresti prenderli e trovare un ologramma a cui punta.
Di seguito è riportato un esempio di determinazione se un raggio della mano colpisce un widget e imposta un risultato di hit personalizzato:
Per usare i raggi mano nei progetti, cercare una delle azioni in Windows Mixed Reality HMD:
Per accedervi in C++, includere WindowsMixedRealityFunctionLibrary.h all'inizio del file di codice chiamante.
Enumerazione
È anche possibile accedere ai case di input in EHMDInputControllerButtons, che può essere usato in Blueprints:
Per l'accesso in C++, usare la EHMDInputControllerButtons classe enumerazione :
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
Di seguito è riportata una suddivisione dei due casi di enumerazione applicabili:
Selezionare - Evento Select attivato dall'utente.
Attivato in HoloLens 2 tramite tocco, sguardo fisso e commit oppure pronunciando "Seleziona" con l'input vocale abilitato.
Grasp - Evento Di afferramento attivato dall'utente.
Attivato in HoloLens 2 chiudendo le dita dell'utente su un ologramma.
È possibile accedere allo stato di rilevamento della mesh a mano in C++ tramite l'enumerazione EHMDTrackingStatus illustrata di seguito:
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
Di seguito è riportata una suddivisione dei due casi di enumerazione applicabili:
NotTracked : la mano non è visibile
Tracciata - la mano è completamente tracciata
Struct
Lo struct PointerPoseInfo può fornire informazioni sui dati della mano seguenti:
Origine – origine della mano
Direzione : direzione della mano
Su - vettore su della mano
Orientamento : quaternione di orientamento
Stato rilevamento : stato di rilevamento corrente
È possibile accedere allo struct PointerPoseInfo tramite Blueprints, come illustrato di seguito:
Il HoloLens 2 tiene traccia dei movimenti spaziali, il che significa che è possibile acquisire tali movimenti come input. Il rilevamento dei movimenti si basa su un modello di sottoscrizione. È consigliabile usare la funzione "Configura movimenti" per indicare al dispositivo quali movimenti si desidera tenere traccia. Per altre informazioni sui movimenti, vedere HoloLens 2 documento Utilizzo di base.
È quindi necessario aggiungere il codice per sottoscrivere gli eventi seguenti:
Progetto delle opzioni di movimento di
OpenXR
In OpenXR gli eventi di movimento vengono rilevati tramite la pipeline di input. Usando l'interazione con la mano, il dispositivo può riconoscere automaticamente i movimenti Tap e Hold, ma non gli altri. Vengono denominati come mapping OpenXRMsftHandInteraction Select e Grip. Non è necessario abilitare la sottoscrizione, è necessario dichiarare gli eventi in Impostazioni progetto/Motore/Input, esattamente come segue:
È possibile trovare la funzione Blueprint in in Windows Mixed Reality Input spaziale e la funzione C++ aggiungendo WindowsMixedRealitySpatialInputFunctionLibrary.h nel file di codice chiamante.
È possibile abilitare e disabilitare l'acquisizione dei movimenti con la CaptureGestures funzione . Quando un movimento abilitato genera eventi di input, la funzione restituisce true se l'acquisizione di movimenti ha esito positivo e false se si verifica un errore.
Se si segue il percorso delineato per lo sviluppo con Unreal, tenere presente che si stanno esplorando i blocchi predefiniti fondamentali di MRTK. Da qui è possibile passare al blocco predefinito successivo: