Movimenti in Unity

Esistono due modi principali per intraprendere azioni sullo sguardo in Unity, i movimenti delle mani e i controller di movimento in HoloLens e HMD immersivi. Si accede ai dati per entrambe le origini di input spaziale tramite le stesse API in Unity.

Unity offre due modi principali per accedere ai dati di input spaziali per Windows Mixed Reality. Le API comuni Input.GetButton/Input.GetAxis funzionano in più SDK di Unity XR, mentre l'API InteractionManager/GestureRecognizer specifica per Windows Mixed Reality espone il set completo di dati di input spaziali.

API dei movimenti compositi di alto livello (GestureRecognizer)

Spazio dei nomi:UnityEngine.XR.WSA.Input
Tipi: GestureRecognizer, GestureSettings, InteractionSourceKind

L'app può anche riconoscere movimenti compositi di livello superiore per origini di input spaziali, Toccare, Tenere, Manipolazione e Movimenti di spostamento. È possibile riconoscere questi movimenti compositi tra le mani e i controller di movimento usando GestureRecognizer.

Ogni evento Gesture nel GestureRecognizer fornisce SourceKind per l'input e il raggio head di destinazione al momento dell'evento. Alcuni eventi forniscono informazioni specifiche del contesto aggiuntive.

Sono necessari solo alcuni passaggi per acquisire i movimenti usando un riconoscimento dei movimenti:

  1. Creare un nuovo riconoscimento dei movimenti
  2. Specificare i movimenti da watch per
  3. Sottoscrivere eventi per tali movimenti
  4. Avviare l'acquisizione di movimenti

Creare un nuovo riconoscimento dei movimenti

Per usare GestureRecognizer, è necessario aver creato un GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Specificare i movimenti da watch per

Specificare i movimenti a cui si è interessati tramite SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Sottoscrivere eventi per tali movimenti

Sottoscrivere eventi per i movimenti a cui si è interessati.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Nota

I movimenti di spostamento e manipolazione si escludono a vicenda in un'istanza di GestureRecognizer.

Avviare l'acquisizione di movimenti

Per impostazione predefinita, un gestureRecognizer non monitora l'input finché non viene chiamato StartCapturingGestures(). È possibile che un evento di movimento venga generato dopo la chiamata StopCapturingGestures() se l'input è stato eseguito prima dell'elaborazione di StopCapturingGestures(). Il MovimentoRecognizer ricorderà se era attivo o disattivato durante il frame precedente in cui il movimento si è effettivamente verificato e quindi è affidabile avviare e arrestare il monitoraggio dei movimenti in base al target dello sguardo del frame.

recognizer.StartCapturingGestures();

Arrestare l'acquisizione dei movimenti

Per arrestare il riconoscimento dei movimenti:

recognizer.StopCapturingGestures();

Rimozione di un riconoscimento dei movimenti

Ricordarsi di annullare la sottoscrizione degli eventi sottoscritti prima di distruggere un oggetto GestureRecognizer .

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Rendering del modello del controller di movimento in Unity

Modello e teleportazione del controller di movimento
Modello e teleportazione del controller di movimento

Per eseguire il rendering dei controller di movimento nell'app che corrispondono ai controller fisici che gli utenti stanno tenendo premuto e articolato, è possibile usare il prefab MotionController nel toolkit di Realtà mista. Questo prefab carica dinamicamente il modello glTF corretto in fase di esecuzione dal driver del controller di movimento installato dal sistema. È importante caricare questi modelli in modo dinamico anziché importarli manualmente nell'editor, in modo che l'app visualizzi modelli 3D fisicamente accurati per tutti i controller correnti e futuri che gli utenti potrebbero avere.

  1. Seguire le istruzioni Introduzione per scaricare Realtà mista Toolkit e aggiungerlo al progetto Unity.
  2. Se hai sostituito la fotocamera con il prefab MixedRealityCameraParent come parte dei passaggi di Introduzione, sei buono per andare! Questo prefab include il rendering del controller di movimento. In caso contrario, aggiungere Asset/HoloToolkit/Input/Prefabs/MotionControllers.prefab nella scena dal riquadro Progetto. Si vuole aggiungere il prefab come figlio di qualsiasi oggetto padre usato per spostare la fotocamera quando l'utente teleporta all'interno della scena, in modo che i controller vengano insieme all'utente. Se l'app non comporta il teleportamento, aggiungere il prefab nella radice della scena.

Creazione di oggetti

La creazione di oggetti nella realtà virtuale è un problema più difficile di quanto possa sembrare. Come con la maggior parte delle interazioni basate fisicamente, quando si genera in gioco agisce in modo imprevisto, è immediatamente ovvio e interrompe l'immersione. Abbiamo trascorso qualche tempo pensando in modo approfondito su come rappresentare un comportamento di generazione fisicamente corretto e sono state fornite alcune linee guida, abilitate tramite aggiornamenti alla nostra piattaforma, che vorremmo condividere con voi.

È possibile trovare un esempio di come è consigliabile implementare la creazione qui. Questo esempio segue queste quattro linee guida:

  • Usare la velocità del controller anziché la posizione. Nell'aggiornamento di novembre a Windows è stata introdotta una modifica del comportamento quando nello stato di rilevamento posizionale ''Approssimativo'. Quando in questo stato, le informazioni sulla velocità sul controller continueranno a essere segnalate fino a quando si ritiene che la sua accuratezza elevata, che spesso è più lunga rispetto alla posizione rimane alta accuratezza.

  • Incorporare la velocità angolare del controller. Questa logica è tutta contenuta throwing.cs nel file nel metodo statico, all'interno del GetThrownObjectVelAngVel pacchetto collegato in precedenza:

    1. Poiché la velocità angolare viene mantenuta, l'oggetto generato deve mantenere la stessa velocità angolare del momento del lancio: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Poiché il centro della massa dell'oggetto generato probabilmente non è all'origine della posa del grip, probabilmente ha una velocità diversa rispetto a quella del controller nel frame di riferimento dell'utente. La parte della velocità dell'oggetto ha contribuito in questo modo è la velocità tangente istantanea del centro di massa dell'oggetto generato intorno all'origine del controller. Questa velocità tangente è il prodotto incrociato della velocità angolare del controller con il vettore che rappresenta la distanza tra l'origine del controller e il centro della massa dell'oggetto generato.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. La velocità totale dell'oggetto generato è la somma della velocità del controller e questa velocità tangente: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Prestare attenzione al momento in cui si applica la velocità. Quando viene premuto un pulsante, può richiedere fino a 20 ms per l'evento in modo che venga spostato tramite Bluetooth al sistema operativo. Ciò significa che se si esegue il polling per un cambio di stato del controller da premuto a non premuto o l'altro modo in cui il controller pone le informazioni che si ottiene con esso sarà effettivamente in anticipo per questo cambiamento nello stato. Inoltre, la posizione del controller presentata dall'API di polling viene stimata in avanti per riflettere una probabile posizione al momento in cui verrà visualizzato il frame che potrebbe essere superiore a 20 ms in futuro. Questo è buono per il rendering degli oggetti mantenuti, ma composto il nostro problema di tempo per la destinazione dell'oggetto mentre si calcola la traiettoria per il momento in cui l'utente ha rilasciato la generazione. Fortunatamente, con l'aggiornamento di novembre, quando viene inviato un evento Unity, ad esempio InteractionSourcePressed o InteractionSourceReleased , lo stato include i dati cronologici della posa dal momento in cui il pulsante è stato premuto o rilasciato. Per ottenere il rendering e la destinazione del controller più accurati durante gli eventi, è necessario usare correttamente il polling e l'evento, in base alle esigenze:

    • Per il rendering di ogni frame, l'app deve posizionare GameObject del controller in corrispondenza della posizione del controller in avanti per l'ora di fotonizzazione del fotogramma corrente. Si ottengono questi dati dalle API di polling di Unity come XR. InputTracking.GetLocalPosition o XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Per il controller destinato a una stampa o a un rilascio, l'app deve eseguire il raycast e calcolare le traiettorie in base alla posizione del controller cronologico per tale evento di stampa o rilascio. Si ottengono questi dati dalle API di evento unity, ad esempio InteractionManager.InteractionSourcePressed.
  • Usare la posa della presa. Angular velocità e velocità vengono segnalate in relazione alla posizione della presa, non alla posizione del puntatore.

La generazione continuerà a migliorare con gli aggiornamenti futuri di Windows e ci si può aspettare di trovare altre informazioni qui.

Controller di movimento e movimento in MRTK

È possibile accedere al controller di movimento e al controller di movimento da Gestione input.

Seguire le esercitazioni

Le esercitazioni dettagliate, con esempi di personalizzazione più dettagliati, sono disponibili nella Realtà mista Academy:

Input MR 213 - Controller di movimento
Input MR 213 - Controller di movimento

Successivo checkpoint di sviluppo

Se si sta seguendo il percorso di sviluppo di Unity, si è in corso l'esplorazione dei blocchi predefiniti di MRTK. Da qui è possibile passare al blocco predefinito successivo:

In alternativa, passare alle API e funzionalità della piattaforma di realtà mista:

È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.

Vedere anche